From e0155e03dc1b580e85335d99bd628fa90b937db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= Date: Mon, 8 Apr 2024 09:05:38 +0200 Subject: [PATCH 01/42] Added learning material from tutorial. Contents not changed yet and still reference tutorial --- .../concepts/bpmn/bpmn-model.md | 4 + .../concepts/bpmn/conditions.md | 12 + .../concepts/bpmn/gateways.md | 20 + .../concepts/bpmn/messaging.md | 33 + .../concepts/bpmn/sequence-flow.md | 3 + .../concepts/bpmn/service-tasks.md | 7 + .../timer-intermediate-catching-events.md | 7 + .../about-version-placeholders-and-urls.md | 54 ++ .../concepts/dsf/bpmn-process-execution.md | 10 + .../concepts/dsf/bpmn-process-variables.md | 9 + .../concepts/dsf/certificates.md | 19 + .../concepts/dsf/draft-task-resources.md | 26 + .../concepts/dsf/environment-variables.md | 14 + ...es-for-requester-and-recipient-elements.md | 247 ++++++ .../concepts/dsf/message-correlation.md | 13 + .../concepts/dsf/message-delegates.md | 24 + .../concepts/dsf/organization-identifiers.md | 15 + .../concepts/dsf/process-api.md | 16 + .../concepts/dsf/read-access-tag.md | 26 + .../concepts/dsf/service-delegates.md | 14 + .../concepts/dsf/spring-integration.md | 15 + .../dsf/the-process-plugin-definition.md | 15 + .../concepts/fhir/activitydefinition.md | 27 + .../concepts/fhir/codesystem.md | 9 + .../concepts/fhir/info.md | 7 + .../concepts/fhir/task.md | 22 + .../concepts/fhir/valueset.md | 7 + .../accessing-bpmn-process-variables.md | 9 + ...cessing-task-resources-during-execution.md | 19 + ...-task-input-parameters-to-task-profiles.md | 236 ++++++ .../guides/configuring-the-read-access-tag.md | 429 ++++++++++ .../guides/creating-an-activity-definition.md | 797 ++++++++++++++++++ .../creating-codesystems-for-dsf-processes.md | 42 + ...ng-task-resources-based-on-a-definition.md | 266 ++++++ .../creating-valuesets-for-dsf-processes.md | 69 ++ ...-incoming-messages-and-missing-messages.md | 19 + .../setting-targets-for-message-events.md | 14 + .../starting-a-process-via-task-resources.md | 68 ++ 38 files changed, 2643 insertions(+) create mode 100644 docs/src/developer-documentation/concepts/bpmn/bpmn-model.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/conditions.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/gateways.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/messaging.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/sequence-flow.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/service-tasks.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md create mode 100644 docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md create mode 100644 docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md create mode 100644 docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md create mode 100644 docs/src/developer-documentation/concepts/dsf/certificates.md create mode 100644 docs/src/developer-documentation/concepts/dsf/draft-task-resources.md create mode 100644 docs/src/developer-documentation/concepts/dsf/environment-variables.md create mode 100644 docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md create mode 100644 docs/src/developer-documentation/concepts/dsf/message-correlation.md create mode 100644 docs/src/developer-documentation/concepts/dsf/message-delegates.md create mode 100644 docs/src/developer-documentation/concepts/dsf/organization-identifiers.md create mode 100644 docs/src/developer-documentation/concepts/dsf/process-api.md create mode 100644 docs/src/developer-documentation/concepts/dsf/read-access-tag.md create mode 100644 docs/src/developer-documentation/concepts/dsf/service-delegates.md create mode 100644 docs/src/developer-documentation/concepts/dsf/spring-integration.md create mode 100644 docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md create mode 100644 docs/src/developer-documentation/concepts/fhir/activitydefinition.md create mode 100644 docs/src/developer-documentation/concepts/fhir/codesystem.md create mode 100644 docs/src/developer-documentation/concepts/fhir/info.md create mode 100644 docs/src/developer-documentation/concepts/fhir/task.md create mode 100644 docs/src/developer-documentation/concepts/fhir/valueset.md create mode 100644 docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md create mode 100644 docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md create mode 100644 docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md create mode 100644 docs/src/developer-documentation/guides/configuring-the-read-access-tag.md create mode 100644 docs/src/developer-documentation/guides/creating-an-activity-definition.md create mode 100644 docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md create mode 100644 docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md create mode 100644 docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md create mode 100644 docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md create mode 100644 docs/src/developer-documentation/guides/setting-targets-for-message-events.md create mode 100644 docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md diff --git a/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md b/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md new file mode 100644 index 000000000..66e2e5314 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md @@ -0,0 +1,4 @@ +## BPMN Model + +The DSF expects BPMN 2.0 for its process execution. This write-up covers the BPMN elements +most commonly used in DSF process plugins. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/conditions.md b/docs/src/developer-documentation/concepts/bpmn/conditions.md new file mode 100644 index 000000000..c523ee82c --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/conditions.md @@ -0,0 +1,12 @@ +### Conditions + +[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) +allow you to change the behaviour of BPMN processes during execution. There are two ways you +are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of +certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity +to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. +Expressions have the following syntax: `${expression}`. For this tutorial, _expression_ will +use a boolean condition like `var == true`. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/). +For this to work during BPMN process execution, the variable you want to use for the boolean +condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) +reaches the evaluation of the expression. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/gateways.md b/docs/src/developer-documentation/concepts/bpmn/gateways.md new file mode 100644 index 000000000..6732c17f7 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/gateways.md @@ -0,0 +1,20 @@ +### Gateways + +[Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different +types of gateways will be useful for different scenarios. + +#### Exclusive Gateways + +[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) +allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions). +[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) are not part of the +[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them +through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/). +In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting +a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to +use Conditions [here](../../concepts/bpmn/conditions.md). + +#### Event-based Gateway + +The [Event-based Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/event-based-gateway/) +allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/developer-documentation/concepts/bpmn/messaging.md new file mode 100644 index 000000000..d9bb2b812 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/messaging.md @@ -0,0 +1,33 @@ +### Messaging + +In order to enable communication with other lanes, pools or even entirely separate processes you need to be able +to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) +to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) in the same diagram +uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. +The following BPMN collaboration diagram shows message exchange between two processes. + + + + + BPMN collaboration diagram with two processes using message flow to exchange information between two organizations + + +#### Message Start Event + +[Message Start Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) +allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, +you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) at +the beginning of all of your BPMN models. + +#### Message Intermediate Throwing Event +[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) +are used to send messages during process execution. + +#### Message Intermediate Catching Event +[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as +the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). +Use them whenever you expect to receive a message from another process or organization during execution. + +#### Message End Event +The [Message End Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-end-event) will +stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md new file mode 100644 index 000000000..ab4c470e9 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md @@ -0,0 +1,3 @@ +### Sequence Flow +BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. +Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. diff --git a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md new file mode 100644 index 000000000..6e7c9d528 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md @@ -0,0 +1,7 @@ +### Service Tasks + +You will primarily use [Service Tasks](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) +when creating BPMN models. They are different from regular BPMN Tasks in that they offer the ability to +link an implementation to the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) +which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages +this engine to execute your BPMN processes. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md new file mode 100644 index 000000000..6651f52cb --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md @@ -0,0 +1,7 @@ +### Timer Intermediate Catching Events + +A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) +allows you model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. +The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. +Examples can be found [here](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following +the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md new file mode 100644 index 000000000..218bb9cea --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md @@ -0,0 +1,54 @@ +### About Versions, Placeholders and URLs + +#### Version Pattern + +Process plugin versions have to obey the pattern: +``` +\d+\.\d+\.\d+\.\d+ Example: 1.0.1.2 +``` + +The first two numbers (`1.0`) are used in FHIR resources and signal changes which break compatibility with previous +process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`1.2`) signal changes which do not break compatibility with previous process versions. Specifically, +the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. + +#### Placeholders + +To avoid the need to specify the version and release date for each [ActivityDefinition](../../concepts/fhir/activitydefinition.md), [CodeSystem](../../concepts/fhir/codesystem.md), +[Task](../../concepts/fhir/task.md) profile and [ValueSet](../../concepts/fhir/valueset.md) resource, +the placeholders `#{version}` and `#{date}` can be used when creating FHIR resources or even in BPMN models. +They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` +and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. +There is also a placeholder for the organization the DSF instance is running in: `#{organization}`. You would typically use +this placeholder in [Draft Task Resources](draft-task-resources.md) but like the other placeholders, it can be used anywhere +as long as the file gets loaded by the [BPE](https://dsf.dev/intro/info/architecture.html#business-process-engine-bpe). + +#### URLs + +BPMN models have an ID we call process definition key. The BPMN process definition key needs to be specified following the pattern: +``` +^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey +``` +In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](../../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) +for this as well. The DSF will also reference this process in URL form in FHIR resources: +``` +http://domain.org/bpe/Process/processKey|1.0 +``` + +As you can see, the version in the URL ``|1.0`` only uses the resource version and omits the code base version. +As mentioned in [Version Pattern](about-version-placeholders-and-urls.md#version-pattern), this means that only changes to the first two +version numbers are significant to signal compatibility when communicating with other process plugin instances. +The process definition key and URL are also related to each other. The DSF will try to match BPMN models +to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey +the pattern above. + +You will use the above URL as your instantiatesCanonical value for [Task](../../concepts/fhir/task.md) profile definitions as well as references +to [Task](../../concepts/fhir/task.md) profiles in other resources. +You will also use it as the URL value for your [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). In this case though, you +have to split up the URL into two parts. You will separate the version (``|1.0``) from the URL and use it as a value for the +`ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` +[placeholder](about-version-placeholders-and-urls.md#placeholders) here instead. Going by the example from above, you will be left with a URL that looks +like this: +``` +http://domain.org/bpe/Process/processKey +``` +This will be the value for your `ActivityDefinition.url` element with `#{version}` as the value for your `ActivityDefinition.version` element. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md new file mode 100644 index 000000000..18e331962 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md @@ -0,0 +1,10 @@ +### BPMN Process Execution + +The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their +executions structured as a tree hierarchy. Each BPMN process +starts with the [process instance](https://docs.camunda.org/manual/7.20/user-guide/process-engine/process-engine-concepts/#process-instances) +as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions +under itself for them to process all tasks along their paths on their own. +Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). +You have access to this representation in your Java code when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates +like `doExecute` or `getAdditionalInputParameters` through the `execution` parameter. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md new file mode 100644 index 000000000..3a63ae94d --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md @@ -0,0 +1,9 @@ +### BPMN Process Variables + +BPMN process variables hold additional information which has to be available during BPMN process execution. +Variables can be directly related to BPMN elements like the boolean value for [Conditions](../../concepts/bpmn/conditions.md), but +do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. +They are accessible during the entirety of the execution to all [Service](../../concepts/dsf/service-delegates.md) / +[Message](../../concepts/dsf/message-delegates.md) Delegates. + +You can learn how to access to the BPMN process variables [here](../../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/certificates.md b/docs/src/developer-documentation/concepts/dsf/certificates.md new file mode 100644 index 000000000..28591b8a2 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/certificates.md @@ -0,0 +1,19 @@ +### Certificates + +There is a number of certificates that need to be generated in order for DSF instances to communicate with each other securely. +You can find a comprehensive lists of certificates needed by the [DSF FHIR](https://dsf.dev/stable/maintain/fhir/configuration.html) +and [DSF BPE](https://dsf.dev/stable/maintain/bpe/configuration.html) servers on the DSF website. +Certificates will be created by the `test-data-generator` project through Maven by the time of the `package` phase in your process plugin build. +You can also invoke the generation of certificates separately by running the Maven build of `test-data-generator` until (and including) the `package` phase. +Since this tutorial comes with three preconfigured DSF instances, the only time you will need to interact with certificates +is when you want to make requests to the DSF FHIR server. Either for access to the web frontend under https://instance-host-name/fhir/, +or when [starting your process plugin](../../guides/starting-a-process-via-task-resources.md). +In case of the web frontend, you will need to add the CA certificate and client certificate of the DSF instance you want to access to your browser. +Certificates can be found in `test-data-generator/cert`. + +**Example:** +You want to access the `dic` DSF FHIR server. You add the CA certificate located in `test-data-generator/cert/ca` to your +browser's certificate store. You also add the client certificate for `dic` located in `test-data-generator/cert/dic-client` +to your browser's client certificates. + +**Important: Passwords for .p12 files are always "password"** diff --git a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md new file mode 100644 index 000000000..6c412ddd5 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md @@ -0,0 +1,26 @@ +### Draft Task Resources + +[Task](../../concepts/fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality +of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. +Compared to regular [Task](../../concepts/fhir/task.md) resources used to +start BPMN processes, this type of [Task](../../concepts/fhir/task.md) resource requires the status `draft` instead the usual `requested`. +It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization +identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. +Additionally, it requires setting the `Task.identifier` +element. It should look something like this: + +```xml + + + + +``` +`processKey` should be the same one used in [URLs](../../concepts/dsf/about-version-placeholders-and-urls.md#urls). +`task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. + +For a complete example you can take a look at the Draft Task Resource in one of the solution branches +and compare it to the one needed for cURL. The [Task](../../concepts/fhir/task.md) resource created +for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. + +You might also want to check out [this guide](../../guides/creating-task-resources-based-on-a-definition.md) +if you do not know how to create [Task](../../concepts/fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/environment-variables.md b/docs/src/developer-documentation/concepts/dsf/environment-variables.md new file mode 100644 index 000000000..a5208920a --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/environment-variables.md @@ -0,0 +1,14 @@ +### Environment Variables + +Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md). +They are the same for all running process instances. They can be defined by adding a member variable with +the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses +the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds +to an underscore in the equivalent environment variable. Environment variables are always written upper-case. +The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. + +The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. +You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. +You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. +You can take a look at the `pom.xml` for the `tutorial-process` submodule to see how you can add it to your own project. +Keep in mind to point the `` field to the package you want documentation for. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md new file mode 100644 index 000000000..51dbdff1b --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md @@ -0,0 +1,247 @@ +### Examples for Requester and Recipient Elements + +Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from +the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). +Use this collection as a reference point when creating your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). + +#### Requester +The `requester` element uses one of the following Codings: +```xml + + + + + + + + + +``` + +##### Local All +```xml + + + + + + +``` + +##### Local All Practitioner +```xml + + + + + + + + + + + + +``` + +##### Local Organization +```xml + + + + + + + + + + + + +``` + +##### Local Organization Practitioner +```xml + + + + + + + + + + + + + + + + + + + + +``` + +##### Local Parent Organization Role +```xml + + + + + + + + + + + + + + + + + + + + +``` + +##### Local Parent Organization Role Practitioner +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +##### Remote All +```xml + + + + + + +``` + +##### Remote Organization +```xml + + + + + + + + + + + + +``` + +##### Remote Parent Organization Role +```xml + + + + + + + + + + + + + + + + + + + + +``` + +#### Recipient +The `recipeint` element uses one of the following Codings: +```xml + + + +``` + +##### Local All +```xml + + + + + + +``` + +##### Local Organization +```xml + + + + + + + + + + + + +``` + +##### Local Parent Organization Role +```xml + + + + + + + + + + + + + + + + + + + + +``` diff --git a/docs/src/developer-documentation/concepts/dsf/message-correlation.md b/docs/src/developer-documentation/concepts/dsf/message-correlation.md new file mode 100644 index 000000000..45610c5f2 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/message-correlation.md @@ -0,0 +1,13 @@ +### Message Correlation + +In order for messages to be able to be sent back and forth between organizations with potentially multiple of the +same process plugin instances running at the same time and still arriving at the correct process instance, +we need some mechanism to map messages to their rightful process instance. +This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. +This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. + +It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens +when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. +To solve this issue, [Task](../../concepts/fhir/task.md) resources also come with an [Input Parameter](../../concepts/fhir/task.md#task-input-parameters) called `correlation-key`. +This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. +You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/message-delegates.md b/docs/src/developer-documentation/concepts/dsf/message-delegates.md new file mode 100644 index 000000000..621f3d688 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/message-delegates.md @@ -0,0 +1,24 @@ +### Message Delegates + +Message Delegates are the Java representation of the [Message Events](../../concepts/bpmn/messaging.md) in your BPMN model. +You link a Message Delegate to a certain [Message Event](../../concepts/bpmn/messaging.md) by selecting the Message Event +in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. +Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` + +You will only need Message Delegates for [Message Send Events](../../concepts/bpmn/messaging.md). Incoming messages will +be resolved to the correct [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) automatically using [Message Correlation](../../concepts/dsf/message-correlation.md) +and the message inputs will be added to that execution's [process variables](../../concepts/dsf/bpmn-process-variables.md). + +To make a Message Delegate for [Message Send Events](../../concepts/bpmn/messaging.md), your Java class needs to extend +`AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting +the `doExecute` method like with [Service Delegates](../../concepts/dsf/service-delegates.md). Instead, you most likely want to +aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the +`getAdditionalInputParamters` method. The DSF translates BPMN messages +into FHIR [Task](../../concepts/fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information +you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../../concepts/fhir/task.md#task-input-parameters), +hence the name of the method. +The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. +You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). diff --git a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md new file mode 100644 index 000000000..6576882d6 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md @@ -0,0 +1,15 @@ +### Organization Identifiers +DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies +the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). +It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). +You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server +instance running under `domain`. The results will also include the `organization identifier` of each organization. + +#### Organization Identifiers in Task Resources +[Task](../../concepts/fhir/task.md) resources require you to reference an organization via its identifier as +the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements +depend on the [ActivityDefinition](../../concepts/fhir/activitydefinition.md) the [Task](../../concepts/fhir/task.md) resource +should conform to. +As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements +for [Task](../../concepts/fhir/task.md) resources which initially start processes. All other cases depend on the context of +the message being sent during process execution. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/process-api.md b/docs/src/developer-documentation/concepts/dsf/process-api.md new file mode 100644 index 000000000..bc50946f4 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/process-api.md @@ -0,0 +1,16 @@ +### DSF Process API Package + +The [DSF Process API package](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. +This includes for example the `Variables` class, which provides access to the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). + +#### Process Plugin Api +When creating [Service Delegates](../../concepts/dsf/service-delegates.md) or [Message Delegates](../../concepts/dsf/message-delegates.md) you will +notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. +This API instance provides a variety of utility classes: +- `ProxyConfig`**:** forward proxy configuration +- `EndpointProvider`**:** access to Endpoint resources +- `FhirContext`**:** HAPI FHIR Context for parsing/serializing +- `FhirWebserviceClientProvider`**:** Webservice client to access DSF FHIR server +- `MailService`**:** for sending automatic E-Mails (if configured) +- `OrganizationProvider`**:** access to Organization resources +- `Variables`**:** access to BPMN execution variables \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md new file mode 100644 index 000000000..9cc75a2f7 --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md @@ -0,0 +1,26 @@ +### Read Access Tag + +Axiomatically, nobody is allowed to write FHIR resources (except [Task](../../concepts/fhir/task.md)) to the DSF FHIR server +unless it is your own organization. By default, the same applies to reading FHIR resources +(again except [Task](../../concepts/fhir/task.md)). But since the DSF is often used to offer medical data in form of +FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. +The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the +exception of [Task](../../concepts/fhir/task.md) resources. We will explain the reason for this exception shortly. +For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: + +```xml + + + + + + +``` +You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). + +The read access rules for [Task](../../concepts/fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's +[ActivityDefinitions](../../concepts/fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. + +It is also possible to restrict read access of FHIR resources to organizations with +a specific role in a parent organization or a specific identifier. +If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../../guides/configuring-the-read-access-tag.md). diff --git a/docs/src/developer-documentation/concepts/dsf/service-delegates.md b/docs/src/developer-documentation/concepts/dsf/service-delegates.md new file mode 100644 index 000000000..4eb2645fb --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/service-delegates.md @@ -0,0 +1,14 @@ +### Service Delegates + +Service Delegates are the Java representation of the [Service Tasks](../../concepts/bpmn/service-tasks.md) in your BPMN model. +You link a Service Delegate to a certain [Service Task](../../concepts/bpmn/service-tasks.md) by selecting the [Service Task](../../concepts/bpmn/service-tasks.md) +in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. +Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` +All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. +This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) +arrives at the [Service Task](../../concepts/bpmn/service-tasks.md) your Service Delegate is linked to. +The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. +You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/spring-integration.md b/docs/src/developer-documentation/concepts/dsf/spring-integration.md new file mode 100644 index 000000000..8aacf65ab --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/spring-integration.md @@ -0,0 +1,15 @@ +### Spring Integration + +Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also +have to provide some Spring functionality. +When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you +have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): +- `AbstractTaskMessageSend` +- `AbstractServiceDelegate` +- `DefaultUserTaskListener` +- `ProcessPluginDeploymentStateListener` + +A [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) located in `spring/config` is expected to provide the Spring Beans. +For this tutorial, the `TutorialConfig` class will take this role. +If you are unfamiliar with the Spring Framework, you might want to check out the chapter [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) +of the Spring Framework documentation, specifically the topics [Using the @Bean Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/bean-annotation.html) and [Using the @Configuration Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md new file mode 100644 index 000000000..d3e05595a --- /dev/null +++ b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md @@ -0,0 +1,15 @@ +### The Process Plugin Definition + +In order for the DSF BPE server to load your plugin you need to provide it with the following information: +* A plugin [version](../../concepts/dsf/about-version-placeholders-and-urls.md#version-pattern) +* A release date +* A plugin name +* The BPMN model files +* The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../../concepts/fhir/task.md) resources needed for messages specific to that BPMN model) +* The Class holding your [Spring Configuration](../../concepts/dsf/spring-integration.md) + +You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. +The DSF BPE server then searches for classes implementing this interface using the +Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. +For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, +has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md new file mode 100644 index 000000000..1ebc78282 --- /dev/null +++ b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md @@ -0,0 +1,27 @@ +### ActivityDefinition + +[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are +available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements +for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. + + +The most important elements in ActivityDefinitions are: +- `message-name` +- `task-profile` +- `requester` +- `recipient` + +The `message-name` element contains the name of the [BPMN message start event](../../concepts/bpmn/messaging.md#message-start-event) or +[BPMN message intermediate catching event](../../concepts/bpmn/messaging.md#message-intermediate-catching-event) which expects +a [Task](../../concepts/fhir/task.md) resource complying to the profile defined by `task-profile`. + +The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message +specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. + +You will have to create your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md) when developing a process plugin. +If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the +DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). +ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). +If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../../guides/creating-an-activity-definition.md). + +You can also find examples for all possible `requester` and `recipient` elements [here](../../concepts/dsf/examples-for-requester-and-recipient-elements.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/codesystem.md b/docs/src/developer-documentation/concepts/fhir/codesystem.md new file mode 100644 index 000000000..f9418e37f --- /dev/null +++ b/docs/src/developer-documentation/concepts/fhir/codesystem.md @@ -0,0 +1,9 @@ +### CodeSystem + +[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which +can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a +[ValueSet](../../concepts/fhir/valueset.md). + +Plugin development for the DSF requires the use of [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) in two major ways: +1. Using existing [DSF CodeSystems](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem) in other FHIR resources like the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). +2. Creating your own CodeSystem to add additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters) to your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/info.md b/docs/src/developer-documentation/concepts/fhir/info.md new file mode 100644 index 000000000..de33a5d62 --- /dev/null +++ b/docs/src/developer-documentation/concepts/fhir/info.md @@ -0,0 +1,7 @@ +## FHIR + +The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. +The most important resources for plugin development are [ActivityDefinitions](../../concepts/fhir/activitydefinition.md), [Tasks](../../concepts/fhir/task.md), +[CodeSystems](../../concepts/fhir/codesystem.md) and [ValueSets](../../concepts/fhir/valueset.md). +There is also a catalogue of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official +DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). diff --git a/docs/src/developer-documentation/concepts/fhir/task.md b/docs/src/developer-documentation/concepts/fhir/task.md new file mode 100644 index 000000000..484b46ba2 --- /dev/null +++ b/docs/src/developer-documentation/concepts/fhir/task.md @@ -0,0 +1,22 @@ +### Task + +The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. +Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource +based on parameters you set in the BPMN model and during execution. It will then +automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. +All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). +This profile includes a splicing for `Task.input` with three additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters): +- `message-name` +- `business-key` +- `correlation-key` + +When creating your own plugin, you will want to create your own profiles based on the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). + +#### Task Input Parameters + +Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. +For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same +way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](../../concepts/fhir/codesystem.md) and +including it in a [ValueSet](../../concepts/fhir/valueset.md) to be able to use it in the Task resource. + +If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/valueset.md b/docs/src/developer-documentation/concepts/fhir/valueset.md new file mode 100644 index 000000000..807de4324 --- /dev/null +++ b/docs/src/developer-documentation/concepts/fhir/valueset.md @@ -0,0 +1,7 @@ +### ValueSet + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](../../concepts/fhir/codesystem.md) to coded elements like +`code`, `Coding` or `CodeableConcept`. + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](../../concepts/fhir/codesystem.md) +in your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md new file mode 100644 index 000000000..0177613ee --- /dev/null +++ b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md @@ -0,0 +1,9 @@ +### Accessing BPMN Process Variables + +After creating a [Service Delegate](../concepts/dsf/service-delegates.md) or [Message Delegate](../concepts/dsf/message-delegates.md), you might want to +retrieve data from or store data in the [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). +You can achieve this either through the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) or via the `Variables` class. +*It is very much recommended you use the latter method*. +The `Variables` class provides lots of utility methods to read or write certain types +of [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) +to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md new file mode 100644 index 000000000..1b1bf4ce6 --- /dev/null +++ b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md @@ -0,0 +1,19 @@ +### Accessing Task Resources During Execution + +If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will +provide methods which return certain kinds of [Task](../concepts/fhir/task.md) resources. The most commonly used ones are +the start [Task](../concepts/fhir/task.md), referring to the [Task](../concepts/fhir/task.md) / [Message Start Event](../concepts/bpmn/messaging.md#message-start-event) responsible for starting the process, +and the latest [Task](../concepts/fhir/task.md), referring to most recently received [Task](../concepts/fhir/task.md) / Message. +In principle, this is sufficient to access all information in a [Task](basic-concepts-and-guides.md#task) resource, since you have +the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. +Instead of navigating the [Task](../concepts/fhir/task.md) resource's element tree, +you should first try to use the [ProcessPluginApi's](../concepts/dsf/process-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class +offers specific methods related to [Task](../concepts/fhir/task.md) resources. +The most common use case for this is retrieving data from a [Task's](../concepts/fhir/task.md) [Input Parameter](../concepts/fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) +for a [Message Delegate's](../concepts/dsf/message-delegates.md) `getAdditionalInputParameters` method. +When retrieving data from a [Task's](../concepts/fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../concepts/fhir/task.md#task-input-parameters) you are looking to extract +data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to find the right one. The methods will try to match +the provided [CodeSystem](../concepts/fhir/codesystem.md) and Code to any [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of the provided [Task](../concepts/fhir/task.md) resource. +Depending on the method you chose you will for example receive all matches or just the first one. +To create new [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to attach to a [Task](../concepts/fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This +is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../concepts/dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md new file mode 100644 index 000000000..8c64cc47b --- /dev/null +++ b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md @@ -0,0 +1,236 @@ +### Adding Task Input Parameters to Task Profiles + +When adding a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) to a [Task](../concepts/fhir/task.md) +profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part +of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own +FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists +like `Task.input` e.g. by only allowing the elements to be of certain types. For example, you +might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include +fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). +This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource +context. Our goal will be to add a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) +of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. + +Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined +on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. +As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). +The slicing for `Task.input` is defined in this part of the `baseDefinition`: +```xml + + + + + + + + + + + + + + + + + + +``` +*The resource can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml)* + +We will only need to take a look at the `discrimitator` tag for now. +Discriminators define the elements a FHIR processor needs to distinguish slices by. In our case, a processor +would look at the values for `type.coding.system` and `type.coding.code` to determine which +slice this element belongs to. The discriminator type `value` implies that `type.coding.system` and `type.coding.code` +have to be present in all slices and need to have a fixed value. +You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). + +Let us revisit `task-start-dic-process.xml` and start adding a slice called `example-input` to it: +```xml + + ... + + ... + + + + + + + + +``` +*Unnecessary elements for this guide are hidden by ... placeholders.* + +We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might +want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) +and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper +values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) +hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). + +Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` +is a `CodeableConcept` which uses codings from a [ValueSet](../concepts/fhir/valueset.md), +the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: +```xml + + ... + + ... + + + + + + + + + + + + + + + +``` +As you can see, we referenced a [ValueSet](../concepts/fhir/valueset.md) in this binding. +When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../concepts/fhir/valueset.md) resource or create a new +one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). + +Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires +`Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + +``` + +In the beginning we mentioned how `Task.input.type.coding.system` and `Task.input.type.coding.code` +have to use fixed values. Here is how we accomplish this: + +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` +*Notice that we also made the two elements mandatory because they are required by the discriminator.* + +For the `type.coding.system` element we referenced a [CodeSystem](../concepts/fhir/codesystem.md). +The `type.coding.code` element uses a code from this [CodeSystem](../concepts/fhir/codesystem.md) called `example-input`. +This is the mechanism by which you actually "name" your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). The +`type.coding.code` value will identify your [Input Parameter](../concepts/fhir/task.md#task-input-parameters) when you use +it in an actual [Task](../concepts/fhir/task.md#task-input-parameters) resource. Here is how this would look like: + +```xml + + ... + + + + + + + + ... + + +``` + +When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../concepts/fhir/codesystem.md) resource or create a new one to reference. +A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). + +`Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it +any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` +refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: + +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +Now we have a new Input Parameter of type `example-input` which accepts any `integer` as its value. diff --git a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md new file mode 100644 index 000000000..f8a6dfb59 --- /dev/null +++ b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md @@ -0,0 +1,429 @@ +### Configuring the Read Access Tag + +To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../concepts/dsf/read-access-tag.md) +and choose one of the codes from it: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + +``` + +The codes `LOCAL` and `ALL` are trivial. Their [Read Access Tag](../concepts/dsf/read-access-tag.md) would look like this: +```xml + + + + + + +``` + +Let us try to configure a Read Access Tag whose code uses an extension. We will choose `ROLE` for this example. We start out the same way as before: +```xml + + + + + + +``` + +The `definition` element of the `ROLE` code references an extension called [dsf-extension-read-access-parent-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-read-access-parent-organization-role-1.0.0.xml). + +The most important part of it is the `differential` statement. It uses [element definitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to describe how we need to implement the extension: +```xml + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +All extensions for the [Read Access Tag](../concepts/dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through +the extension's `context` element: +```xml + + + + +``` + +That is why the first element we are adding to `meta.tag` is an `extension` element: +```xml + + + + + + + + + +``` + +We will now go through the `differential` statement one element at a time, starting at the top: +```xml + + ... + + + + + + + + + + + + ... + + +``` + +It defines a [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for the `Extension.extension` element, meaning we are dealing +with a nested extension. The `discriminator` element tells us that slices will be identified by the value of their `url` attribute. +A `rules` element with value `open` means other types of slices may be added later on e.g. when creating a profile. We do not have to +add any elements from here to the `meta.tag.extension` element. +Next up is the first slice called `parentOrganization`: + +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + +``` + +The first element defines a slice called `parentOrganization` on the `Extension.extension` element with cardinality `1..1`. +The second element defines the url attribute of the `parentOrganization` slice to be fixed to the value `parent-organization`. +With this information we can add the next element to `meta.tag`. Since it is defined on `Extension.extension` we will add it to +`meta.tag.extension.extension` like this: +```xml + + + + + + + + + + + +``` + +After that, it defines `parentOrganization.value[x]` to occur at least once and have a type of `Identifier`. To turn this into an +element to add to `meta.tag.extension.extension` we have to replace `[x]` with our code in `value[x].type`, which in this case is `Identifier`. It is important +to note, that should the value in the code element be lowercase, you will have make it uppercase before replacement. In our case this means we will have a +`meta.tag.extension.extension.valueIdentifier` element: +```xml + + + + + + + + + + + + + +``` + +The last two elements define a `system` element with a fixed value and `value` element we can fill in on our own, since it does not have any constraints applied. Notice that +the element definition still uses `value[x].system` and `value[x].value`. The replacement mentioned earlier does not happen in +the element definition, but since `value[x]` is defined to have the type `Identifier` it is inferred that we mean to reference `Identifier.system` +and `Identifier.value`. +We will choose an arbitrary `Idenfier` value, but you should be using an actual organization identifier depending on who you want to allow read access to the resource. + +```xml + + + + + + + + + + + + + + +``` + +Next is the slice is called `organizationRole`: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + +``` + +Like with `parentOrganization`, we will add an extension element to `meta.tag.extension` with the fixed url value defined above: +```xml + + + + + + + + + + + + + + + + + +``` + +Instead of `Identifier`, the `value[x]` element is now defined as a `Coding` type. This means we will add a `valueCoding` element to the extension: +```xml + + + + + + + + + + + + + + + + + + + +``` + +A `Coding` has to belong to some [CodeSystem](../concepts/fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). +Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. +For demonstration purposes, we will be using the `DIC` role: +```xml + + + + + + + + + + + + + + + + + + + + +``` + +Now we only have two elements left in the `differential` statement: + +```xml + + ... + + ... + + + + + + + + + + +``` + +The `Extension.url` element tells us to add a url attribute to `meta.tag.extension`. The last element makes it so we must not +add a `meta.tag.extension.value[x]` element. This leaves us with this final Read Access Tag: + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +You can follow the same method to configure the other types of Read Access Tags as well. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-an-activity-definition.md b/docs/src/developer-documentation/guides/creating-an-activity-definition.md new file mode 100644 index 000000000..c0e2295a9 --- /dev/null +++ b/docs/src/developer-documentation/guides/creating-an-activity-definition.md @@ -0,0 +1,797 @@ +### Creating an ActivityDefinition + +This guide will teach you how to create an ActivityDefinition based on the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile for your process plugin. +It is divided into steps for each of the main components of ActivityDefinitions: +1. Read Access Tag +2. Extension: process authorization +3. BPE Managed Elements +4. Regular Elements + +*Regular elements* are all elements not part of the first 3 main components. + +*We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. +If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* + +#### 1. Read Access Tag +Let us start out with an empty [ActivityDefinition](../concepts/fhir/activitydefinition.md): +```xml + + + +``` + +The first element in DSF FHIR resources is always the [Read Access Tag](../concepts/dsf/read-access-tag.md). It describes who is +allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the +[Read Access Tag](../concepts/dsf/read-access-tag.md) in [this guide](../concepts/dsf/read-access-tag.md). In this case, we will allow read access to everyone: + +```xml + + + + + + + + +``` + +#### 2. Extension: Process Authorization +This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../concepts/fhir/task.md) resources) +for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../concepts/fhir/activitydefinition.md) +for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. +This includes the message starting your BPMN process initially. +You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). +Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the +value for the URL from the `Extension.url` element: +```xml + + ... + + + + +``` +*Elements not relevant to the current component are hidden with ... to increase readability.* + +The [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement +starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) for the `Extension.extension` element: + +```xml + + ... + + + + + + + + + + + + + + + + ... + + +``` + +The above states that whenever this extension is used in a profile, the profile needs to include this extension at least once (``). +The [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension` tells us that elements of this [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) +are identified by the value of their URL (``), which is always the case for extensions, and that other extensions can be added to the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) (``). +Since there is a [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension`, we are dealing with a nested extension. + +After these initial element definitions come the elements relevant for your process plugin. The first one is the `message-name` slice: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + ... + + +``` + +This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../concepts/fhir/activitydefinition.md). +The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. +Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, +FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. +FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. +This results in the following extension element we will add to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +```xml + + + +``` + +For your use case, you have to replace `myMessage` with the name of the [BPMN message event](../concepts/bpmn/messaging.md) that is expecting this message. + +
+This is how your ActivityDefinition should look like so far + +```xml + + + + + + + + + + + + + +``` +
+ +The next slice is called `task-profile`: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + ... + + +``` + +This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. +This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. +Canonical values referring to [Task](../concepts/fhir/task.md) profiles in ActivityDefinitions have to conform +to the rules outlined by the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls). +From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +```xml + + + +``` + +
+This is how your ActivityDefinition should look like so far + +```xml + + + + + + + + + + + + + + + + +``` +
+ +The next slice is `requester`: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + +``` +Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) +for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also +have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../concepts/fhir/valueset.md). This is the +responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the +elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. +Here is what they mean: +- `local-all`: All local requests will be allowed. Local requests are identified by matching the requester's certificate to a thumbprint which was internally marked by the DSF FHIR server as belonging to a local organization. +- `local-organization`: All local requests made from an organization with a specific `organization-identifier` will be allowed. +- `local-parent-organization-role`: All local requests made from an organization having a specific role inside a specific parent organization will be allowed. +- `remote` versions of the above rules work the same but the requester's certificate is instead required to match a thumbprint marked as a remote organization. +- `practitioner` suffixes all work the same. They include the same rules as their prefixes but now additionally require the requester to match a certain `practitioner-role`. A list of them + can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml). This allows + for more granularity when defining authorization rules within an organization and can be integrated into local user management via [OpenID Connect](https://dsf.dev/stable/maintain/fhir/access-control.html). + +As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, +remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. +You can also find examples of all Codings from above [here](../concepts/dsf/examples-for-requester-and-recipient-elements.md). + +It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../concepts/fhir/activitydefinition.md). +Let us start out by adding a `requester` element like we did for previous elements: + +```xml + + + + + +``` + +We now have to look at the elements that are defined in one of the profiles to fill in the remaining elements since they are not defined by the `requester` extension. For demonstration +purposes, we will choose the [dsf-coding-process-authorization-local-organization-practitioner](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-practitioner-1.0.0.xml) profile. +Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4/datatypes.html#codesystem) are optional, we only have to look at the `differential` element from the profile we just selected: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` +It defines an extension called `organization-practitioner` which is identified through its url attribute. Again, the extension +is only referenced, its location is in a different file. You can find it [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-organization-practitioner-1.0.0.xml). +Let us look at its `differential` element in the extension file to see how we need to populate the extension: +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this +definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element +definitions from the Coding resource and adding everything to our [ActivityDefinition](../concepts/fhir/activitydefinition.md). + +We will start with the `Extension.url` element, since the `Extension` element is the parent element for all slices on the `Extension.extension` elements: +```xml + + + +``` + +Next, we will add the `organization` slice: +```xml + + + + + + + + +``` +Finally, we will add the `practitionerRole` slice: + +```xml + + + + + + + + + + + + + + +``` + +Notice that there is no `binding` element specified for `practitionerRole.value[x]`. This is intentional. In the example we used a code from the +[dsf-practitioner-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml) CodeSystem. +This CodeSystem includes a standard set of codes which are often sufficient for DSF use cases. You can freely add other CodeSystems if you find these codes +do not apply for your use case. The code you set here can be used in the [DSF role config](https://dsf.dev/stable/maintain/fhir/access-control.html) +to allow certain users with this `practitioner-role` to send requests. + +Working our way back up to the Coding we selected, we will now add the extension we just created as the `Coding.extension:organization-practitioner` element: +```xml + + + + + + + + + + + + + + + + + + +``` +Now might be a good time to look at the [differential](#coding-differential) from the Coding again. +Our next elements to be added are `Coding.system` and `Coding.code`: +```xml + + + + + + + + + + + + + + + + + + + + +``` +Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md) under +the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). + +
+This is how your ActivityDefinition should look like so far + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` +
+ +Now we are back to looking at the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) again. +The last slice for this extension is `recipient`: +```xml + + ... + + ... + + + + + + + + + + + + + + + + + + + + + + + + ... + + +``` + +The `recipient` will decide which DSF instance is allowed to process that message. That is the reason why you will not find any Codings for `remote` or `practitioner` here. +For `requester`, we already decided that we will only allow users with a certain role from our own (local) organization to send this message. +So now we will only allow the DSF instance run by that same local organization to process the message. The right Coding for this job is +the [coding-process-authorization-local-organization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-1.0.0.xml). +The configuration of a local requester and local receiver is often used for the message that starts up the first BPMN process of the plugin. +The process of adding the `recipient` slice is the exact same as it is for `requester`. You can follow the steps for the `requester` slice again +but just use a different Coding. + +
+Using the Coding we just decided on, this is how your ActivityDefinition should look like + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` +
+ +The last element defined in the [process authorization extension](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) +is `Extension.url`. But since we added this element at the very beginning of the working through the extension, we are finished with it here. + +#### 3. BPE Managed Elements + +Some elements of [ActivityDefinitions](../concepts/fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values +at appropriate times. + +The following elements are managed by the DSF BPE: +- `ActivityDefinition.version` should use the [placeholder](../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) `#{version}` +- `ActivityDefinition.date` is not required, but should you decide to include it, use the [placeholder](../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) `#{date}` +- `ActivityDefinition.status` must have a value of `unknown` + +
+Your ActivityDefinition should now look like this + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` +
+ +#### 4. Regular Elements + +The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. +Check out the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` +must have the value `Task`. +All other elements can technically be omitted. Still, we recommend you include the following elements: +- `AcitivityDefinition.name` +- `AcitivityDefinition.title` +- `AcitivityDefinition.subtitle` +- `AcitivityDefinition.experimental` +- `AcitivityDefinition.publisher` +- `AcitivityDefinition.contact` +- `AcitivityDefinition.description` + +
+Your finished ActivityDefinition should now look something like this + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <subtitle value="Information Processing Process"/> + <experimental value="false"/> + <publisher value="DSF"/> + <contact> + <name value="DSF"/> + <telecom> + <system value="email"/> + <value value="noreply@dsf.dev"/> + </telecom> + </contact> + <description value="My Process processes information"/> +</ActivityDefinition> +``` +</details> \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md new file mode 100644 index 000000000..5c65e3078 --- /dev/null +++ b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md @@ -0,0 +1,42 @@ +### Creating CodeSystems for DSF Processes + +You might find yourself in a situation where you need to create a [CodeSystem](../concepts/fhir/codesystem.md). +For example, when defining the type of an [Input Parameter](../concepts/fhir/task.md#task-input-parameters). +[CodeSystems](../concepts/fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../concepts/fhir/codesystem.md) +in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: +```xml +<CodeSystem xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <url value="http://dsf.dev/fhir/CodeSystem/my-code-system" /> <!--dummy value--> + <!-- version managed by bpe --> + <version value="#{version}" /> + <name value="My CodeSystem" /> <!--dummy value--> + <title value="My CodeSystem Title" /> <!--dummy value--> + <!-- status managed by bpe --> + <status value="unknown" /> + <experimental value="false" /> + <!-- date managed by bpe --> + <date value="#{date}" /> + <publisher value="DSF" /> <!--dummy value--> + <description value="CodeSystem with codes for me" /> <!--dummy value--> + <caseSensitive value="true" /> + <hierarchyMeaning value="grouped-by" /> + <versionNeeded value="false" /> + <content value="complete" /> + <concept> + <code value="my-code" /> <!--dummy value--> + <display value="My Code" /> <!--dummy value--> + <definition value="My code used for myself" /> <!--dummy value--> + </concept> +</CodeSystem> +``` +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. +You can add as many codes as you like by defining more `concept` elements. + +The DSF BPE server will read your [CodeSystem](../concepts/fhir/codesystem.md) from +`tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md new file mode 100644 index 000000000..d6da6bff4 --- /dev/null +++ b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md @@ -0,0 +1,266 @@ +### Creating Task Resources Based on a Definition + +This short guide should help you understand how you can create [Task](../concepts/fhir/task.md) +resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). +We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help +with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant +views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). +As an example, we will create a [Task](../concepts/fhir/task.md) resource from the `task-start-dic-process.xml` profile. + +#### 1st Step: Removing Placeholders +`task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, +you can either remove or comment these elements, so Forge does not try to perform type checking on them, which +would result in an error and Forge not loading the file. + +#### 2nd Step: Differential Chain +If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our +case, we will want to aggregate the changes made to the base resource (in this case [Task](../concepts/fhir/task.md)) by all profiles to make +it more readable. +To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. +It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be +found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). +Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` +element, we are done with this chain. +In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. +It should look something like this: + +![Forge overview](../../exercises/figures/forge_overview.png) + +#### 3rd Step: Building the Task Resource +We will now go through each element one by one and include it into our [Task](../concepts/fhir/task.md) +resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important +that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case +if we want a [Task](../concepts/fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). +But, placeholders should be used in [Draft Task Resources](../concepts/dsf/draft-task-resources.md) instead of actual values wherever possible, +since those are read by the DSF BPE server. This guide will create a [Task](../concepts/fhir/task.md) resource without placeholders. +We will start out with the base element for all [Task](../concepts/fhir/task.md) resources: +```xml +<Task xmlns="http://hl7.org/fhir"> + +</Task> +``` + +Before we start adding any elements listed in Forge's element tree, we have to include the `Task.meta.profile` element. +Its requirement cannot be seen here which is why we mention it specifically. This is the only instance you will not see +it in the element tree. It should look like this: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> +</Task> +``` + +The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we +will create an XML element with the same name and the value according to [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls): +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> +</Task> +``` +We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct +data type (e.g. proper coding value for elements with `coding` type). + +By now your [Task](../concepts/fhir/task.md) resources should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> +</Task> +``` +</details> + +Let us look at a more complex element like the `requester` element: + +![Forge requester view](../../exercises/figures/forge_requester_view.png) + +We will start the same way we started with primitive elements, by adding the `requester` element: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + + </requester> +</Task> +``` + +Then, we will add primitive elements to `requester` like we did before for `Task`: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + </requester> +</Task> +``` +*Important to note here that the value for the `status` will always be `requested` for Tasks being posted using cURL and the `type` element for `requester` and `recipient` will always have the value `Organization` in the DSF context.* + +Next, we will add the `identifier` element and its primitive sub-elements just like we started out doing it for the `requester` element. The `identifier.value` in this case will be `dic.dsf.test`. To understand why, take a look at the topic on [organization identifiers](../concepts/dsf/organization-identifiers.md): +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> +</Task> +``` +*Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed +to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including +the actual value for `Fixed value`.* + +You should now be able to fill out all elements in your [Task](../concepts/fhir/task.md) resource until you reach +the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../concepts/fhir/task.md) +resource should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> + <restriction> + <recipient> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier" /> + <value value="dic.dsf.test" /> + </identifier> + </recipient> + </restriction> +</Task> +``` +</details> + + +[Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the +slice `message-name`: + +![Forge slice message name](../../exercises/figures/forge_slice_message_name.png) + +If we were to continue including slices to the [Task](../concepts/fhir/task.md) resource like we did so far, +we would add a `message-name` element to our XML like this: + +```xml +<Task xmlns="http://hl7.org/fhir"> + ... + <input> + <message-name> + ... + </message-name> + </input> +</Task> +``` + +This approach however, would not work. FHIR processors do not use the name of the slice to map entries in +your [Task](../concepts/fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). +Discriminators define the elements a processor needs to distinguish slices by. You can see +how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor +would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which +slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` +are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). +All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: + +```xml +<Task xmlns="http://hl7.org/fhir"> + ... + <input> + <type> + <coding> + <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> + <code value="message-name" /> + </coding> + </type> + <valueString value="dicProcess" /> + </input> +</Task> +``` + +Now you should be able to add all remaining mandatory elements to your [Task](../concepts/fhir/task.md) +resource on your own. In the end, it should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> + <restriction> + <recipient> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier" /> + <value value="dic.dsf.test" /> + </identifier> + </recipient> + </restriction> + <input> + <type> + <coding> + <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> + <code value="message-name" /> + </coding> + </type> + <valueString value="dicProcess"/> + </input> +</Task> +``` +</details> + +**Do not forget to restore the version and date placeholders in `task-start-dic-process.xml`!** \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md new file mode 100644 index 000000000..c4ca9e21a --- /dev/null +++ b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md @@ -0,0 +1,69 @@ +### Creating ValueSets for DSF Processes + +You might find yourself in the situation where you need to create a [ValueSet](../concepts/fhir/valueset.md). +For example, when adding [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to DSF [Task](../concepts/fhir/task.md) +resources, you will also have to reference a [ValueSet](../concepts/fhir/valueset.md) resource in your +binding for `Task.input.type` to be able to set the type of your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). +[ValueSets](../concepts/fhir/valueset.md) for the DSF differ from regular [ValueSets](../concepts/fhir/valueset.md) +in that some element's values are managed by the DSF BPE server. You can use the following template for your +[ValueSet](../concepts/fhir/valueset.md): +```xml +<ValueSet xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <url value="http://dsf.dev/fhir/ValueSet/my-value-set"/> <!--dummy value--> + <!-- version managed by bpe --> + <version value="#{version}" /> + <name value="My ValueSet"/> <!--dummy value--> + <title value="My ValueSet Title"/> <!--dummy value--> + <!-- status managed by bpe --> + <status value="unknown" /> + <experimental value="false"/> + <!-- date managed by bpe --> + <date value="#{date}"/> + <publisher value="DSF"/> <!--dummy value--> + <description value="ValueSet with all codes from my-code-system"/> <!--dummy value--> + <immutable value="true"/> + <compose> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> <!--dummy value--> + <version value="#{version}"/> + </include> + </compose> +</ValueSet> +``` +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. +The `compose` element defines the codes included in this [ValueSet](../concepts/fhir/valueset.md). +It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../concepts/fhir/codesystem.md) +and contains a list of `concept` elements which in turn contain the actual `code` element. +Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: +```xml +<ValueSet xmlns="http://hl7.org/fhir"> + ... + <compose> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> + <version value="#{version}"/> + <concept> + <code value="my-code"/> + </concept> + </include> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-other-code-system"/> + <version value="#{version}"/> + <concept> + <code value="my-other-code"/> + </concept> + </include> + </compose> +</ValueSet> +``` +The DSF BPE server will read your [ValueSet](../concepts/fhir/valueset.md) from +`tutorial-process/src/main/resources/fhir/ValueSet`. + +You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) +on how to create [CodeSystems](../concepts/fhir/codesystem.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md new file mode 100644 index 000000000..cdc5de09c --- /dev/null +++ b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -0,0 +1,19 @@ +### Managing Multiple Incoming Messages and Missing Messages + +If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../concepts/fhir/task.md) may never arrive. +Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../concepts/fhir/task.md) resource from being posted to the DSF FHIR server. +This would result in stale process instances that never finish. + +At the same time, you might also expect to receive one out of a number of different message types at once. + +In order to solve both problems we can add an [Event Based Gateway](../concepts/bpmn/gateways.md#event-based-gateway) to the process waiting +for a response and then either handle a [Task](../concepts/fhir/task.md) resource with the response and finish the process in a success +state or trigger a [Timer Intermediate Catching Event](../concepts/bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. +The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages +or missing messages: + +<picture> + <source media="(prefers-color-scheme: dark)" srcset="../../exercises/figures/exercise5_event_based_gateway_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="../../exercises/figures/exercise5_event_based_gateway.svg"> + <img alt="BPMN collaboration diagram with an Event Based Gateway" src="../../exercises/figures/exercise5_event_based_gateway.svg"> +</picture> diff --git a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md new file mode 100644 index 000000000..6cb427fbd --- /dev/null +++ b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md @@ -0,0 +1,14 @@ +### Setting Targets for Message Events + +Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. +You can find these values by visiting the DSF FHIR server's web interface. In the top right corner, click +the `Show Bookmarks` button, then select `Endpoint`. You will be taken to a list of all Endpoints available to the FHIR server. +There are two ways of adding `targets` to the BPMN execution variables: +#### 1. Adding the target in the message event implementation +In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, +add your targets and then call the super-method. +#### 2. Adding the target in a service task right before the message event +This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one +since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../concepts/bpmn/service-tasks.md). + +In both cases you can access methods to create and set `targets` through the `Variables` instance. diff --git a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md new file mode 100644 index 000000000..ec6275622 --- /dev/null +++ b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md @@ -0,0 +1,68 @@ +### Starting a Process via Task Resources + +To start a BPMN process, you need to create new a [Task](../concepts/fhir/task.md) resource in the DSF FHIR server +by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) +a resource for the first time. Also, remember that the [Task](../concepts/fhir/task.md) +resource you are sending needs to comply to the [Task](../concepts/fhir/task.md) profile of the process you +want to start and the [ActivityDefinition's](../concepts/fhir/activitydefinition.md) authorization rules. +There are two major ways of making this HTTP request: +1. Using cURL +2. Using the DSF FHIR server's web interface + +#### Using cURL +Using cURL probably isn't as "pretty", +but since cURL requires the actual [Task](../concepts/fhir/task.md) payload as an XML, it will prove useful to +gain more insight in how actual [Task](../concepts/fhir/task.md) resources look like and how they relate to +your [Task](../concepts/fhir/task.md) profiles and [ActivityDefinitions](../concepts/fhir/activitydefinition.md). You will have to create +an appropriate [Task](../concepts/fhir/task.md) resource for this. +There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. +You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), +or you can check the solution branches for this +file if you need ideas on how to fill it out properly. + +Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the +instance you want to address. For this tutorial this is either one of `dic`, `cos` or `hrp`. [Certificates](../concepts/dsf/certificates.md) can be found in +`test-data-generator/cert`. Client [certificates](../concepts/dsf/certificates.md) and private keys can be found +in the folder of their respective instance e.g. `test-data-generator/cert/dic-client` for the `dic` instance. + +##### Linux: +```shell +curl https://<instance-host-name>/fhir/Task \ +--cacert <path/to/ca-certificate-file.pem> \ +--cert <path/to/client-certificate-file.pem>:password \ +--key <path/to/client-private-key-file.pem> \ +-H "Content-Type: application/fhir+xml" \ +-H "Accept: application/fhir+xml" \ +-d @<path/to/example-task.xml> +``` +##### Windows CMD: +```shell +curl https://<instance-host-name>/fhir/Task ^ +--cacert <path/to/ca-certificate-file.pem> ^ +--cert <path/to/client-certificate-file.pem>:password ^ +--key <path/to/client-private-key-file.pem> ^ +-H "Content-Type: application/fhir+xml" ^ +-H "Accept: application/fhir+xml" ^ +-d @<path/to/example-task.xml> +``` +*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure +you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment +variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* + +#### Using the DSF FHIR Server's Web Interface + +When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you +can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). +These [Task](../concepts/fhir/task.md) resources act like a template you can use to +instantiate [Task](../concepts/fhir/task.md) resources which start BPMN processes. +Instead of querying the DSF FHIR server manually, you can use a predefined bookmark +to navigate to the query URL. You can find a list of Bookmarks in the top right corner of +the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under +the `Task` section, and you will be taken to the list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). +Once there, you can select the one which starts your BPMN process. It will take you to a detailed view +of the resource where you will also have the chance to fill any [Task Input Parameters](../concepts/fhir/task.md#task-input-parameters) +you might need to specify. +If everything is filled out correctly, you may start your process by clicking `Start Process`. +Keep in mind that, for [Draft Task Resources](../concepts/dsf/draft-task-resources.md) to be +available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. +Take a look at [the Process Plugin Definition](../concepts/dsf/the-process-plugin-definition.md) if you need a reminder. \ No newline at end of file From 177d7b7eebae5e7adca3ae1ad99aa08b83ecb2f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Mon, 8 Apr 2024 09:06:48 +0200 Subject: [PATCH 02/42] Added learning material from tutorial. Contents not changed yet and still reference tutorial --- docs/package-lock.json | 2 +- docs/package.json | 2 +- .../exercise3_message_flow.bpmn | 88 ++ .../exercise3_message_flow.svg | 4 + .../exercise3_message_flow_inverted.svg | 678 +++++++++ .../exercise5_event_based_gateway.bpmn | 167 +++ .../exercise5_event_based_gateway.svg | 4 + ...exercise5_event_based_gateway_inverted.svg | 1320 +++++++++++++++++ .../forge_overview.png | Bin 0 -> 195635 bytes .../forge_requester_view.png | Bin 0 -> 42843 bytes .../forge_slice_message_name.png | Bin 0 -> 42421 bytes .../keycloak_realm_dropdown.png | Bin 0 -> 27715 bytes .../remote_debugging_eclipse.png | Bin 0 -> 42092 bytes .../remote_debugging_intellij.png | Bin 0 -> 75066 bytes docs/src/.vuepress/theme.ts | 50 +- .../concepts/bpmn/bpmn-model.md | 4 - .../concepts/bpmn/conditions.md | 5 + .../concepts/bpmn/gateways.md | 5 + .../concepts/bpmn/intro.md | 15 + .../concepts/bpmn/messaging.md | 12 +- .../concepts/bpmn/sequence-flow.md | 5 + .../concepts/bpmn/service-tasks.md | 5 + .../timer-intermediate-catching-events.md | 5 + .../about-version-placeholders-and-urls.md | 5 + .../concepts/dsf/bpmn-process-execution.md | 6 + .../concepts/dsf/bpmn-process-variables.md | 5 + .../concepts/dsf/certificates.md | 5 + .../concepts/dsf/draft-task-resources.md | 5 + .../concepts/dsf/environment-variables.md | 5 + ...es-for-requester-and-recipient-elements.md | 5 + .../concepts/dsf/message-correlation.md | 5 + .../concepts/dsf/message-delegates.md | 5 + .../concepts/dsf/organization-identifiers.md | 5 + .../concepts/dsf/process-api.md | 5 + .../concepts/dsf/read-access-tag.md | 5 + .../concepts/dsf/service-delegates.md | 5 + .../concepts/dsf/spring-integration.md | 5 + .../dsf/the-process-plugin-definition.md | 5 + .../concepts/fhir/activitydefinition.md | 5 + .../concepts/fhir/codesystem.md | 5 + .../fhir/{info.md => introduction.md} | 7 +- .../concepts/fhir/task.md | 5 + .../concepts/fhir/valueset.md | 5 + .../accessing-bpmn-process-variables.md | 5 + ...cessing-task-resources-during-execution.md | 5 + ...-task-input-parameters-to-task-profiles.md | 5 + .../guides/configuring-the-read-access-tag.md | 5 + .../guides/creating-an-activity-definition.md | 5 + .../creating-codesystems-for-dsf-processes.md | 5 + ...ng-task-resources-based-on-a-definition.md | 11 +- .../creating-valuesets-for-dsf-processes.md | 5 + ...-incoming-messages-and-missing-messages.md | 11 +- .../setting-targets-for-message-events.md | 5 + .../starting-a-process-via-task-resources.md | 5 + 54 files changed, 2523 insertions(+), 18 deletions(-) create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/forge_overview.png create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/forge_requester_view.png create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/forge_slice_message_name.png create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/keycloak_realm_dropdown.png create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_eclipse.png create mode 100644 docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_intellij.png delete mode 100644 docs/src/developer-documentation/concepts/bpmn/bpmn-model.md create mode 100644 docs/src/developer-documentation/concepts/bpmn/intro.md rename docs/src/developer-documentation/concepts/fhir/{info.md => introduction.md} (91%) diff --git a/docs/package-lock.json b/docs/package-lock.json index 846fb23bc..6086762fb 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -12,7 +12,7 @@ "@vuepress/bundler-vite": "2.0.0-rc.9", "sass-loader": "14.1.1", "vue": "3.4.21", - "vuepress": "2.0.0-rc.9", + "vuepress": "^2.0.0-rc.9", "vuepress-plugin-search-pro": "2.0.0-rc.32", "vuepress-theme-hope": "2.0.0-rc.32" }, diff --git a/docs/package.json b/docs/package.json index 4c911d911..bcadeb134 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "@vuepress/bundler-vite": "2.0.0-rc.9", "sass-loader": "14.1.1", "vue": "3.4.21", - "vuepress": "2.0.0-rc.9", + "vuepress": "^2.0.0-rc.9", "vuepress-plugin-search-pro": "2.0.0-rc.32", "vuepress-theme-hope": "2.0.0-rc.32" }, diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn new file mode 100644 index 000000000..b95e9860e --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1ngfywh" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.12.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"> + <bpmn:collaboration id="Collaboration_1viusst"> + <bpmn:participant id="Participant_0dhadtt" name="Organization 1" processRef="Process_0m41ech" /> + <bpmn:participant id="Participant_0bv9zcu" name="Organization 2" processRef="Process_00ufu87" /> + <bpmn:messageFlow id="Flow_12vbpmr" sourceRef="Event_09zqce0" targetRef="Event_0psf27b" /> + </bpmn:collaboration> + <bpmn:process id="Process_0m41ech" isExecutable="true"> + <bpmn:sequenceFlow id="Flow_07xocd4" sourceRef="StartEvent_1" targetRef="Activity_0r3b2gx" /> + <bpmn:sequenceFlow id="Flow_0s5758j" sourceRef="Activity_0r3b2gx" targetRef="Event_09zqce0" /> + <bpmn:endEvent id="Event_09zqce0"> + <bpmn:incoming>Flow_0s5758j</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_1gjfdrm" /> + </bpmn:endEvent> + <bpmn:task id="Activity_0r3b2gx" name="Task 1"> + <bpmn:incoming>Flow_07xocd4</bpmn:incoming> + <bpmn:outgoing>Flow_0s5758j</bpmn:outgoing> + </bpmn:task> + <bpmn:startEvent id="StartEvent_1"> + <bpmn:outgoing>Flow_07xocd4</bpmn:outgoing> + </bpmn:startEvent> + </bpmn:process> + <bpmn:process id="Process_00ufu87" isExecutable="false"> + <bpmn:task id="Activity_0er9stz" name="Task 2"> + <bpmn:incoming>Flow_0tzyqri</bpmn:incoming> + <bpmn:outgoing>Flow_1hk1a7w</bpmn:outgoing> + </bpmn:task> + <bpmn:endEvent id="Event_0lwy8y1"> + <bpmn:incoming>Flow_1hk1a7w</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_1hk1a7w" sourceRef="Activity_0er9stz" targetRef="Event_0lwy8y1" /> + <bpmn:sequenceFlow id="Flow_0tzyqri" sourceRef="Event_0psf27b" targetRef="Activity_0er9stz" /> + <bpmn:startEvent id="Event_0psf27b"> + <bpmn:outgoing>Flow_0tzyqri</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_05qgs4w" /> + </bpmn:startEvent> + </bpmn:process> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1viusst"> + <bpmndi:BPMNShape id="Participant_0dhadtt_di" bpmnElement="Participant_0dhadtt" isHorizontal="true"> + <dc:Bounds x="129" y="110" width="351" height="120" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_07xocd4_di" bpmnElement="Flow_07xocd4"> + <di:waypoint x="215" y="170" /> + <di:waypoint x="270" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0s5758j_di" bpmnElement="Flow_0s5758j"> + <di:waypoint x="370" y="170" /> + <di:waypoint x="422" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="Event_0l1zhuy_di" bpmnElement="Event_09zqce0"> + <dc:Bounds x="422" y="152" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0r3b2gx_di" bpmnElement="Activity_0r3b2gx"> + <dc:Bounds x="270" y="130" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"> + <dc:Bounds x="179" y="152" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Participant_0bv9zcu_di" bpmnElement="Participant_0bv9zcu" isHorizontal="true"> + <dc:Bounds x="540" y="110" width="351" height="120" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1hk1a7w_di" bpmnElement="Flow_1hk1a7w"> + <di:waypoint x="781" y="170" /> + <di:waypoint x="833" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0tzyqri_di" bpmnElement="Flow_0tzyqri"> + <di:waypoint x="629" y="170" /> + <di:waypoint x="681" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="Activity_0er9stz_di" bpmnElement="Activity_0er9stz"> + <dc:Bounds x="681" y="130" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_178omd2_di" bpmnElement="Event_0lwy8y1"> + <dc:Bounds x="833" y="152" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_12u4qj5_di" bpmnElement="Event_0psf27b"> + <dc:Bounds x="593" y="152" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_12vbpmr_di" bpmnElement="Flow_12vbpmr"> + <di:waypoint x="440" y="188" /> + <di:waypoint x="440" y="260" /> + <di:waypoint x="611" y="260" /> + <di:waypoint x="611" y="188" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</bpmn:definitions> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg new file mode 100644 index 000000000..8b45bb326 --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- created with bpmn-js / http://bpmn.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" width="774" height="162" viewBox="123 104 774 162" version="1.1"><defs><marker id="sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b" viewBox="0 0 20 20" refX="11" refY="10" markerWidth="10" markerHeight="10" orient="auto"><path d="M 1 5 L 11 10 L 1 15 Z" style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b" viewBox="0 0 20 20" refX="8.5" refY="5" markerWidth="20" markerHeight="20" orient="auto"><path d="m 1 5 l 0 -3 l 7 3 l -7 3 z" style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-start-white-black-b8nwy39adcp2a2ytggevv2s2b" viewBox="0 0 20 20" refX="6" refY="6" markerWidth="20" markerHeight="20" orient="auto"><circle cx="6" cy="6" r="3.5" style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker></defs><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_0dhadtt" style="display: block;" transform="matrix(1 0 0 1 129 110)"><g class="djs-visual"><rect x="0" y="0" width="351" height="120" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,120 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 120)"><tspan x="20.9765625" y="18.6">Organization 1</tspan></text></g><rect x="-6" y="-6" width="363" height="132" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="351" height="120" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="120" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_07xocd4" style="display: block;"><g class="djs-visual"><path d="m 215,170L270,170 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');"/></g><polyline points="215,170 270,170 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="209" y="164" width="67" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0s5758j" style="display: block;"><g class="djs-visual"><path d="m 370,170L422,170 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');"/></g><polyline points="370,170 422,170 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="364" y="164" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_09zqce0" style="display: block;" transform="matrix(1 0 0 1 422 152)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: black; stroke-width: 1px; stroke: white;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Activity_0r3b2gx" style="display: block;" transform="matrix(1 0 0 1 270 130)"><g class="djs-visual"><rect x="0" y="0" width="100" height="80" rx="10" ry="10" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;"><tspan x="32.65625" y="43.599999999999994">Task 1</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="100" height="80" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="112" height="92" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="StartEvent_1" style="display: block;" transform="matrix(1 0 0 1 179 152)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_0bv9zcu" style="display: block;" transform="matrix(1 0 0 1 540 110)"><g class="djs-visual"><rect x="0" y="0" width="351" height="120" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,120 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 120)"><tspan x="20.9765625" y="18.6">Organization 2</tspan></text></g><rect x="-6" y="-6" width="363" height="132" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="351" height="120" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="120" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1hk1a7w" style="display: block;"><g class="djs-visual"><path d="m 781,170L833,170 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');"/></g><polyline points="781,170 833,170 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="775" y="164" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0tzyqri" style="display: block;"><g class="djs-visual"><path d="m 629,170L681,170 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');"/></g><polyline points="629,170 681,170 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="623" y="164" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Activity_0er9stz" style="display: block;" transform="matrix(1 0 0 1 681 130)"><g class="djs-visual"><rect x="0" y="0" width="100" height="80" rx="10" ry="10" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;"><tspan x="32.65625" y="43.599999999999994">Task 2</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="100" height="80" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="112" height="92" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0lwy8y1" style="display: block;" transform="matrix(1 0 0 1 833 152)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0psf27b" style="display: block;" transform="matrix(1 0 0 1 593 152)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_12vbpmr" style="display: block;"><g class="djs-visual"><path d="m 440,188L440,260 L611,260 L611,188 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b'); marker-start: url('#messageflow-start-white-black-b8nwy39adcp2a2ytggevv2s2b'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="440,188 440,260 611,260 611,188 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="434" y="182" width="183" height="84" class="djs-outline" style="fill: none;"/></g></g></svg> \ No newline at end of file diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg new file mode 100644 index 000000000..267c4e969 --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg @@ -0,0 +1,678 @@ +<?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="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="774" + height="162" + viewBox="123 104 774 162" + version="1.1" + id="svg203" + sodipodi:docname="exercise3_message_flow_inverted.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + <metadata + id="metadata207"> + <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></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="3840" + inkscape:window-height="2081" + id="namedview205" + showgrid="false" + inkscape:zoom="1.5581395" + inkscape:cx="387" + inkscape:cy="81" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg203" /> + <defs + id="defs11"> + <marker + id="sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b" + viewBox="0 0 20 20" + refX="11" + refY="10" + markerWidth="10" + markerHeight="10" + orient="auto"> + <path + d="M 1 5 L 11 10 L 1 15 Z" + style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="path2" /> + </marker> + <marker + id="messageflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b" + viewBox="0 0 20 20" + refX="8.5" + refY="5" + markerWidth="20" + markerHeight="20" + orient="auto"> + <path + d="m 1 5 l 0 -3 l 7 3 l -7 3 z" + style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;" + id="path5" /> + </marker> + <marker + id="messageflow-start-white-black-b8nwy39adcp2a2ytggevv2s2b" + viewBox="0 0 20 20" + refX="6" + refY="6" + markerWidth="20" + markerHeight="20" + orient="auto"> + <circle + cx="6" + cy="6" + r="3.5" + style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="circle8" /> + </marker> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1342"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1338" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.7994 0 " + result="color2" + id="feColorMatrix1340" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1348"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1344" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.7994 0 " + result="color2" + id="feColorMatrix1346" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1354"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1350" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.7994 0 " + result="color2" + id="feColorMatrix1352" /> + </filter> + </defs> + <g + class="djs-group" + id="g101" + style="filter:url(#filter1354)"> + <g + class="djs-element djs-shape" + data-element-id="Participant_0dhadtt" + style="display: block;" + transform="matrix(1 0 0 1 129 110)" + id="g29"> + <g + class="djs-visual" + id="g21"> + <rect + x="0" + y="0" + width="351" + height="120" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect13" /> + <polyline + points="30,0 30,120 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline15" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 120)" + id="text19"><tspan + x="20.9765625" + y="18.6" + id="tspan17">Organization 1</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="363" + height="132" + class="djs-outline" + style="fill: none;" + id="rect23" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="351" + height="120" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect25" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="120" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect27" /> + </g> + <g + class="djs-children" + id="g99"> + <g + class="djs-group" + id="g41"> + <g + class="djs-element djs-connection" + data-element-id="Flow_07xocd4" + style="display: block;" + id="g39"> + <g + class="djs-visual" + id="g33"> + <path + d="m 215,170L270,170 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');" + id="path31" /> + </g> + <polyline + points="215,170 270,170 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline35" /> + <rect + x="209" + y="164" + width="67" + height="12" + class="djs-outline" + style="fill: none;" + id="rect37" /> + </g> + </g> + <g + class="djs-group" + id="g53"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0s5758j" + style="display: block;" + id="g51"> + <g + class="djs-visual" + id="g45"> + <path + d="m 370,170L422,170 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');" + id="path43" /> + </g> + <polyline + points="370,170 422,170 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline47" /> + <rect + x="364" + y="164" + width="64" + height="12" + class="djs-outline" + style="fill: none;" + id="rect49" /> + </g> + </g> + <g + class="djs-group" + id="g67"> + <g + class="djs-element djs-shape" + data-element-id="Event_09zqce0" + style="display: block;" + transform="matrix(1 0 0 1 422 152)" + id="g65"> + <g + class="djs-visual" + id="g59"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle55" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: black; stroke-width: 1px; stroke: white;" + id="path57" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect61" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect63" /> + </g> + </g> + <g + class="djs-group" + id="g83"> + <g + class="djs-element djs-shape" + data-element-id="Activity_0r3b2gx" + style="display: block;" + transform="matrix(1 0 0 1 270 130)" + id="g81"> + <g + class="djs-visual" + id="g75"> + <rect + x="0" + y="0" + width="100" + height="80" + rx="10" + ry="10" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect69" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + id="text73"><tspan + x="32.65625" + y="43.599999999999994" + id="tspan71">Task 1</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="100" + height="80" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect77" /> + <rect + x="-6" + y="-6" + width="112" + height="92" + class="djs-outline" + style="fill: none;" + id="rect79" /> + </g> + </g> + <g + class="djs-group" + id="g97"> + <g + class="djs-element djs-shape" + data-element-id="StartEvent_1" + style="display: block;" + transform="matrix(1 0 0 1 179 152)" + id="g95"> + <g + class="djs-visual" + id="g89"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="circle85" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path87" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect91" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect93" /> + </g> + </g> + </g> + </g> + <g + class="djs-group" + id="g189" + style="filter:url(#filter1348)"> + <g + class="djs-element djs-shape" + data-element-id="Participant_0bv9zcu" + style="display: block;" + transform="matrix(1 0 0 1 540 110)" + id="g119"> + <g + class="djs-visual" + id="g111"> + <rect + x="0" + y="0" + width="351" + height="120" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect103" /> + <polyline + points="30,0 30,120 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline105" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 120)" + id="text109"><tspan + x="20.9765625" + y="18.6" + id="tspan107">Organization 2</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="363" + height="132" + class="djs-outline" + style="fill: none;" + id="rect113" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="351" + height="120" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect115" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="120" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect117" /> + </g> + <g + class="djs-children" + id="g187"> + <g + class="djs-group" + id="g131"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1hk1a7w" + style="display: block;" + id="g129"> + <g + class="djs-visual" + id="g123"> + <path + d="m 781,170L833,170 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');" + id="path121" /> + </g> + <polyline + points="781,170 833,170 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline125" /> + <rect + x="775" + y="164" + width="64" + height="12" + class="djs-outline" + style="fill: none;" + id="rect127" /> + </g> + </g> + <g + class="djs-group" + id="g143"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0tzyqri" + style="display: block;" + id="g141"> + <g + class="djs-visual" + id="g135"> + <path + d="m 629,170L681,170 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b');" + id="path133" /> + </g> + <polyline + points="629,170 681,170 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline137" /> + <rect + x="623" + y="164" + width="64" + height="12" + class="djs-outline" + style="fill: none;" + id="rect139" /> + </g> + </g> + <g + class="djs-group" + id="g159"> + <g + class="djs-element djs-shape" + data-element-id="Activity_0er9stz" + style="display: block;" + transform="matrix(1 0 0 1 681 130)" + id="g157"> + <g + class="djs-visual" + id="g151"> + <rect + x="0" + y="0" + width="100" + height="80" + rx="10" + ry="10" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect145" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + id="text149"><tspan + x="32.65625" + y="43.599999999999994" + id="tspan147">Task 2</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="100" + height="80" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect153" /> + <rect + x="-6" + y="-6" + width="112" + height="92" + class="djs-outline" + style="fill: none;" + id="rect155" /> + </g> + </g> + <g + class="djs-group" + id="g171"> + <g + class="djs-element djs-shape" + data-element-id="Event_0lwy8y1" + style="display: block;" + transform="matrix(1 0 0 1 833 152)" + id="g169"> + <g + class="djs-visual" + id="g163"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle161" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect165" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect167" /> + </g> + </g> + <g + class="djs-group" + id="g185"> + <g + class="djs-element djs-shape" + data-element-id="Event_0psf27b" + style="display: block;" + transform="matrix(1 0 0 1 593 152)" + id="g183"> + <g + class="djs-visual" + id="g177"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="circle173" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path175" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect179" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect181" /> + </g> + </g> + </g> + </g> + <g + class="djs-group" + id="g201" + style="filter:url(#filter1342)"> + <g + class="djs-element djs-connection" + data-element-id="Flow_12vbpmr" + style="display: block;" + id="g199"> + <g + class="djs-visual" + id="g193"> + <path + d="m 440,188L440,260 L611,260 L611,188 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-b8nwy39adcp2a2ytggevv2s2b'); marker-start: url('#messageflow-start-white-black-b8nwy39adcp2a2ytggevv2s2b'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path191" /> + </g> + <polyline + points="440,188 440,260 611,260 611,188 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline195" /> + <rect + x="434" + y="182" + width="183" + height="84" + class="djs-outline" + style="fill: none;" + id="rect197" /> + </g> + </g> +</svg> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn new file mode 100644 index 000000000..8e2ae90b6 --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn @@ -0,0 +1,167 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0tk7cp7" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.12.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"> + <bpmn:collaboration id="Collaboration_05uc86r"> + <bpmn:participant id="Participant_1u3es88" name="Organization 1" processRef="Process_0fb99l2" /> + <bpmn:participant id="Participant_0h427kw" name="Organization 2" processRef="Process_0zdj0xt" /> + <bpmn:messageFlow id="Flow_0sswg90" sourceRef="Event_1ndrm5j" targetRef="Participant_0h427kw" /> + <bpmn:messageFlow id="Flow_1wjv8rh" sourceRef="Participant_0h427kw" targetRef="Event_0qbztd3" /> + <bpmn:messageFlow id="Flow_0j7hwxl" sourceRef="Participant_0h427kw" targetRef="Event_0pq5qbd" /> + </bpmn:collaboration> + <bpmn:process id="Process_0fb99l2" isExecutable="true"> + <bpmn:task id="Activity_1qh9sf8" name="Task 1"> + <bpmn:incoming>Flow_1vux1af</bpmn:incoming> + <bpmn:outgoing>Flow_1i7hh0u</bpmn:outgoing> + </bpmn:task> + <bpmn:eventBasedGateway id="Gateway_0bsqjma"> + <bpmn:incoming>Flow_1cwt97i</bpmn:incoming> + <bpmn:outgoing>Flow_19hvbdm</bpmn:outgoing> + <bpmn:outgoing>Flow_1pre2mk</bpmn:outgoing> + <bpmn:outgoing>Flow_1bf7gvl</bpmn:outgoing> + </bpmn:eventBasedGateway> + <bpmn:intermediateCatchEvent id="Event_0qbztd3"> + <bpmn:incoming>Flow_19hvbdm</bpmn:incoming> + <bpmn:outgoing>Flow_0fn66bz</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_0n8fufh" /> + </bpmn:intermediateCatchEvent> + <bpmn:endEvent id="Event_1pwd0kq" name="Option A"> + <bpmn:incoming>Flow_0fn66bz</bpmn:incoming> + </bpmn:endEvent> + <bpmn:endEvent id="Event_1voo3le" name="Option B"> + <bpmn:incoming>Flow_1qeyly0</bpmn:incoming> + </bpmn:endEvent> + <bpmn:intermediateThrowEvent id="Event_1ndrm5j"> + <bpmn:incoming>Flow_1i7hh0u</bpmn:incoming> + <bpmn:outgoing>Flow_1cwt97i</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_0kl5mue" /> + </bpmn:intermediateThrowEvent> + <bpmn:sequenceFlow id="Flow_1vux1af" sourceRef="StartEvent_1" targetRef="Activity_1qh9sf8" /> + <bpmn:sequenceFlow id="Flow_1i7hh0u" sourceRef="Activity_1qh9sf8" targetRef="Event_1ndrm5j" /> + <bpmn:sequenceFlow id="Flow_19hvbdm" sourceRef="Gateway_0bsqjma" targetRef="Event_0qbztd3" /> + <bpmn:sequenceFlow id="Flow_1pre2mk" sourceRef="Gateway_0bsqjma" targetRef="Event_0pq5qbd" /> + <bpmn:sequenceFlow id="Flow_0fn66bz" sourceRef="Event_0qbztd3" targetRef="Event_1pwd0kq" /> + <bpmn:sequenceFlow id="Flow_1qeyly0" sourceRef="Event_0pq5qbd" targetRef="Event_1voo3le" /> + <bpmn:sequenceFlow id="Flow_1cwt97i" sourceRef="Event_1ndrm5j" targetRef="Gateway_0bsqjma" /> + <bpmn:sequenceFlow id="Flow_1bf7gvl" sourceRef="Gateway_0bsqjma" targetRef="Event_18u9tw6" /> + <bpmn:intermediateCatchEvent id="Event_0pq5qbd"> + <bpmn:incoming>Flow_1pre2mk</bpmn:incoming> + <bpmn:outgoing>Flow_1qeyly0</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_0ivkvzp" /> + </bpmn:intermediateCatchEvent> + <bpmn:intermediateCatchEvent id="Event_18u9tw6"> + <bpmn:incoming>Flow_1bf7gvl</bpmn:incoming> + <bpmn:outgoing>Flow_0u7wl2h</bpmn:outgoing> + <bpmn:timerEventDefinition id="TimerEventDefinition_1697w25" /> + </bpmn:intermediateCatchEvent> + <bpmn:endEvent id="Event_1uh09e9" name="Failure"> + <bpmn:incoming>Flow_0u7wl2h</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_0u7wl2h" sourceRef="Event_18u9tw6" targetRef="Event_1uh09e9" /> + <bpmn:startEvent id="StartEvent_1"> + <bpmn:outgoing>Flow_1vux1af</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_19ffoug" /> + </bpmn:startEvent> + </bpmn:process> + <bpmn:process id="Process_0zdj0xt" isExecutable="false" /> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_05uc86r"> + <bpmndi:BPMNShape id="Participant_1u3es88_di" bpmnElement="Participant_1u3es88" isHorizontal="true"> + <dc:Bounds x="129" y="100" width="660" height="360" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1vux1af_di" bpmnElement="Flow_1vux1af"> + <di:waypoint x="215" y="177" /> + <di:waypoint x="270" y="177" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1i7hh0u_di" bpmnElement="Flow_1i7hh0u"> + <di:waypoint x="370" y="177" /> + <di:waypoint x="422" y="177" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_19hvbdm_di" bpmnElement="Flow_19hvbdm"> + <di:waypoint x="575" y="177" /> + <di:waypoint x="632" y="177" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1pre2mk_di" bpmnElement="Flow_1pre2mk"> + <di:waypoint x="550" y="202" /> + <di:waypoint x="550" y="290" /> + <di:waypoint x="632" y="290" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0fn66bz_di" bpmnElement="Flow_0fn66bz"> + <di:waypoint x="668" y="177" /> + <di:waypoint x="732" y="177" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1qeyly0_di" bpmnElement="Flow_1qeyly0"> + <di:waypoint x="668" y="290" /> + <di:waypoint x="732" y="290" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1cwt97i_di" bpmnElement="Flow_1cwt97i"> + <di:waypoint x="458" y="177" /> + <di:waypoint x="525" y="177" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1bf7gvl_di" bpmnElement="Flow_1bf7gvl"> + <di:waypoint x="550" y="202" /> + <di:waypoint x="550" y="400" /> + <di:waypoint x="632" y="400" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0u7wl2h_di" bpmnElement="Flow_0u7wl2h"> + <di:waypoint x="668" y="400" /> + <di:waypoint x="732" y="400" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="Activity_1qh9sf8_di" bpmnElement="Activity_1qh9sf8"> + <dc:Bounds x="270" y="137" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_15df8vt_di" bpmnElement="Gateway_0bsqjma"> + <dc:Bounds x="525" y="152" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0qbztd3_di" bpmnElement="Event_0qbztd3"> + <dc:Bounds x="632" y="159" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1pwd0kq_di" bpmnElement="Event_1pwd0kq"> + <dc:Bounds x="732" y="159" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="729" y="202" width="44" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1voo3le_di" bpmnElement="Event_1voo3le"> + <dc:Bounds x="732" y="272" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="729" y="315" width="43" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0adyu75_di" bpmnElement="Event_1ndrm5j"> + <dc:Bounds x="422" y="159" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0wivlva_di" bpmnElement="Event_0pq5qbd"> + <dc:Bounds x="632" y="272" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1sevlq3_di" bpmnElement="Event_18u9tw6"> + <dc:Bounds x="632" y="382" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1uh09e9_di" bpmnElement="Event_1uh09e9"> + <dc:Bounds x="732" y="382" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="733" y="425" width="34" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0zf8okn_di" bpmnElement="StartEvent_1"> + <dc:Bounds x="179" y="159" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Participant_0h427kw_di" bpmnElement="Participant_0h427kw" isHorizontal="true"> + <dc:Bounds x="890" y="100" width="300" height="360" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0sswg90_di" bpmnElement="Flow_0sswg90"> + <di:waypoint x="440" y="159" /> + <di:waypoint x="440" y="130" /> + <di:waypoint x="890" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1wjv8rh_di" bpmnElement="Flow_1wjv8rh"> + <di:waypoint x="890" y="230" /> + <di:waypoint x="650" y="230" /> + <di:waypoint x="650" y="195" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0j7hwxl_di" bpmnElement="Flow_0j7hwxl"> + <di:waypoint x="890" y="340" /> + <di:waypoint x="650" y="340" /> + <di:waypoint x="650" y="308" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</bpmn:definitions> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg new file mode 100644 index 000000000..e4c6a2552 --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- created with bpmn-js / http://bpmn.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" width="1073" height="372" viewBox="123 94 1073 372" version="1.1"><defs><marker id="sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="11" refY="10" markerWidth="10" markerHeight="10" orient="auto"><path d="M 1 5 L 11 10 L 1 15 Z" style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="8.5" refY="5" markerWidth="20" markerHeight="20" orient="auto"><path d="m 1 5 l 0 -3 l 7 3 l -7 3 z" style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="6" refY="6" markerWidth="20" markerHeight="20" orient="auto"><circle cx="6" cy="6" r="3.5" style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker></defs><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_1u3es88" style="display: block;" transform="matrix(1 0 0 1 129 100)"><g class="djs-visual"><rect x="0" y="0" width="660" height="360" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,360 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)"><tspan x="140.9765625" y="18.6">Organization 1</tspan></text></g><rect x="-6" y="-6" width="672" height="372" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="660" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1vux1af" style="display: block;"><g class="djs-visual"><path d="m 215,177L270,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="215,177 270,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="209" y="171" width="67" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1i7hh0u" style="display: block;"><g class="djs-visual"><path d="m 370,177L422,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="370,177 422,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="364" y="171" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_19hvbdm" style="display: block;"><g class="djs-visual"><path d="m 575,177L632,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="575,177 632,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="569" y="171" width="69" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1pre2mk" style="display: block;"><g class="djs-visual"><path d="m 550,202L550,290 L632,290 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="550,202 550,290 632,290 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="544" y="196" width="94" height="100" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0fn66bz" style="display: block;"><g class="djs-visual"><path d="m 668,177L732,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,177 732,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="171" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1qeyly0" style="display: block;"><g class="djs-visual"><path d="m 668,290L732,290 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,290 732,290 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="284" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1cwt97i" style="display: block;"><g class="djs-visual"><path d="m 458,177L525,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="458,177 525,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="452" y="171" width="79" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1bf7gvl" style="display: block;"><g class="djs-visual"><path d="m 550,202L550,400 L632,400 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="550,202 550,400 632,400 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="544" y="196" width="94" height="210" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0u7wl2h" style="display: block;"><g class="djs-visual"><path d="m 668,400L732,400 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,400 732,400 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="394" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Activity_1qh9sf8" style="display: block;" transform="matrix(1 0 0 1 270 137)"><g class="djs-visual"><rect x="0" y="0" width="100" height="80" rx="10" ry="10" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;"><tspan x="32.65625" y="43.599999999999994">Task 1</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="100" height="80" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="112" height="92" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Gateway_0bsqjma" style="display: block;" transform="matrix(1 0 0 1 525 152)"><g class="djs-visual"><polygon points="25,0 50,25 25,50 0,25" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><circle cx="25" cy="25" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><circle cx="25" cy="25" r="12" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 18,22 7.363636363636364,-4.909090909090909 7.363636363636364,4.909090909090909 -2.4545454545454546,9.818181818181818 -9.818181818181818,0 z" style="fill: none; stroke-width: 2px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="50" height="50" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="62" height="62" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0qbztd3" style="display: block;" transform="matrix(1 0 0 1 632 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1pwd0kq" style="display: block;" transform="matrix(1 0 0 1 732 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1voo3le" style="display: block;" transform="matrix(1 0 0 1 732 272)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1ndrm5j" style="display: block;" transform="matrix(1 0 0 1 422 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: black; stroke-width: 1px; stroke: white;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0pq5qbd" style="display: block;" transform="matrix(1 0 0 1 632 272)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_18u9tw6" style="display: block;" transform="matrix(1 0 0 1 632 382)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><circle cx="18" cy="18" r="11" style="stroke: black; stroke-width: 2px; fill: white;"/><path d="M 18,18 l 2.25,-7.5 m -2.25,7.5 l 5.25,1.5 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(0,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(30,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(60,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(90,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(120,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(150,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(180,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(210,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(240,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(270,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(300,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(330,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1uh09e9" style="display: block;" transform="matrix(1 0 0 1 732 382)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1uh09e9_label" style="display: block;" transform="matrix(1 0 0 1 733 425)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Failure</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="34" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="46" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="StartEvent_1" style="display: block;" transform="matrix(1 0 0 1 179 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1pwd0kq_label" style="display: block;" transform="matrix(1 0 0 1 729 202)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Option A</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="44" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="56" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1voo3le_label" style="display: block;" transform="matrix(1 0 0 1 729 315)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Option B</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="43" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="55" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_0h427kw" style="display: block;" transform="matrix(1 0 0 1 890 100)"><g class="djs-visual"><rect x="0" y="0" width="300" height="360" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,360 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)"><tspan x="140.9765625" y="18.6">Organization 2</tspan></text></g><rect x="-6" y="-6" width="312" height="372" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="300" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"/></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0sswg90" style="display: block;"><g class="djs-visual"><path d="m 440,159L440,130 L890,130 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="440,159 440,130 890,130 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="434" y="124" width="462" height="41" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1wjv8rh" style="display: block;"><g class="djs-visual"><path d="m 890,230L650,230 L650,195 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="890,230 650,230 650,195 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="644" y="189" width="252" height="47" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0j7hwxl" style="display: block;"><g class="djs-visual"><path d="m 890,340L650,340 L650,308 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="890,340 650,340 650,308 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="644" y="302" width="252" height="44" class="djs-outline" style="fill: none;"/></g></g></svg> \ No newline at end of file diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg new file mode 100644 index 000000000..e7ad511b9 --- /dev/null +++ b/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg @@ -0,0 +1,1320 @@ +<?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="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1073" + height="372" + viewBox="123 94 1073 372" + version="1.1" + id="svg417" + sodipodi:docname="exercise5_event_based_gateway_inverted.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + <metadata + id="metadata421"> + <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></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="3840" + inkscape:window-height="2081" + id="namedview419" + showgrid="false" + inkscape:zoom="1.1239515" + inkscape:cx="536.5" + inkscape:cy="186" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="svg417" /> + <defs + id="defs11"> + <marker + id="sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="11" + refY="10" + markerWidth="10" + markerHeight="10" + orient="auto"> + <path + d="M 1 5 L 11 10 L 1 15 Z" + style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="path2" /> + </marker> + <marker + id="messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="8.5" + refY="5" + markerWidth="20" + markerHeight="20" + orient="auto"> + <path + d="m 1 5 l 0 -3 l 7 3 l -7 3 z" + style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;" + id="path5" /> + </marker> + <marker + id="messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="6" + refY="6" + markerWidth="20" + markerHeight="20" + orient="auto"> + <circle + cx="6" + cy="6" + r="3.5" + style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="circle8" /> + </marker> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1604"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1600" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1602" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1610"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1606" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1608" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1616"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1612" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1614" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1622"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1618" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1620" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1628"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1624" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1626" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1634"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1630" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1632" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Invert" + id="filter1640"> + <feColorMatrix + type="hueRotate" + values="180" + result="color1" + id="feColorMatrix1636" /> + <feColorMatrix + values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 1.8 0 " + result="color2" + id="feColorMatrix1638" /> + </filter> + </defs> + <g + class="djs-group" + id="g329" + style="filter:url(#filter1640)"> + <g + class="djs-element djs-shape" + data-element-id="Participant_1u3es88" + style="display: block;" + transform="matrix(1 0 0 1 129 100)" + id="g29"> + <g + class="djs-visual" + id="g21"> + <rect + x="0" + y="0" + width="660" + height="360" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect13" /> + <polyline + points="30,0 30,360 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline15" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)" + id="text19"><tspan + x="140.9765625" + y="18.6" + id="tspan17">Organization 1</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="672" + height="372" + class="djs-outline" + style="fill: none;" + id="rect23" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="660" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect25" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect27" /> + </g> + <g + class="djs-children" + id="g327"> + <g + class="djs-group" + id="g41"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1vux1af" + style="display: block;" + id="g39"> + <g + class="djs-visual" + id="g33"> + <path + d="m 215,177L270,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path31" /> + </g> + <polyline + points="215,177 270,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline35" /> + <rect + x="209" + y="171" + width="67" + height="12" + class="djs-outline" + style="fill: none;" + id="rect37" /> + </g> + </g> + <g + class="djs-group" + id="g53"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1i7hh0u" + style="display: block;" + id="g51"> + <g + class="djs-visual" + id="g45"> + <path + d="m 370,177L422,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path43" /> + </g> + <polyline + points="370,177 422,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline47" /> + <rect + x="364" + y="171" + width="64" + height="12" + class="djs-outline" + style="fill: none;" + id="rect49" /> + </g> + </g> + <g + class="djs-group" + id="g65"> + <g + class="djs-element djs-connection" + data-element-id="Flow_19hvbdm" + style="display: block;" + id="g63"> + <g + class="djs-visual" + id="g57"> + <path + d="m 575,177L632,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path55" /> + </g> + <polyline + points="575,177 632,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline59" /> + <rect + x="569" + y="171" + width="69" + height="12" + class="djs-outline" + style="fill: none;" + id="rect61" /> + </g> + </g> + <g + class="djs-group" + id="g77"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1pre2mk" + style="display: block;" + id="g75"> + <g + class="djs-visual" + id="g69"> + <path + d="m 550,202L550,290 L632,290 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path67" /> + </g> + <polyline + points="550,202 550,290 632,290 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline71" /> + <rect + x="544" + y="196" + width="94" + height="100" + class="djs-outline" + style="fill: none;" + id="rect73" /> + </g> + </g> + <g + class="djs-group" + id="g89"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0fn66bz" + style="display: block;" + id="g87"> + <g + class="djs-visual" + id="g81"> + <path + d="m 668,177L732,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path79" /> + </g> + <polyline + points="668,177 732,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline83" /> + <rect + x="662" + y="171" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect85" /> + </g> + </g> + <g + class="djs-group" + id="g101"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1qeyly0" + style="display: block;" + id="g99"> + <g + class="djs-visual" + id="g93"> + <path + d="m 668,290L732,290 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path91" /> + </g> + <polyline + points="668,290 732,290 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline95" /> + <rect + x="662" + y="284" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect97" /> + </g> + </g> + <g + class="djs-group" + id="g113"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1cwt97i" + style="display: block;" + id="g111"> + <g + class="djs-visual" + id="g105"> + <path + d="m 458,177L525,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path103" /> + </g> + <polyline + points="458,177 525,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline107" /> + <rect + x="452" + y="171" + width="79" + height="12" + class="djs-outline" + style="fill: none;" + id="rect109" /> + </g> + </g> + <g + class="djs-group" + id="g125"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1bf7gvl" + style="display: block;" + id="g123"> + <g + class="djs-visual" + id="g117"> + <path + d="m 550,202L550,400 L632,400 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path115" /> + </g> + <polyline + points="550,202 550,400 632,400 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline119" /> + <rect + x="544" + y="196" + width="94" + height="210" + class="djs-outline" + style="fill: none;" + id="rect121" /> + </g> + </g> + <g + class="djs-group" + id="g137"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0u7wl2h" + style="display: block;" + id="g135"> + <g + class="djs-visual" + id="g129"> + <path + d="m 668,400L732,400 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path127" /> + </g> + <polyline + points="668,400 732,400 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline131" /> + <rect + x="662" + y="394" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect133" /> + </g> + </g> + <g + class="djs-group" + id="g153"> + <g + class="djs-element djs-shape" + data-element-id="Activity_1qh9sf8" + style="display: block;" + transform="matrix(1 0 0 1 270 137)" + id="g151"> + <g + class="djs-visual" + id="g145"> + <rect + x="0" + y="0" + width="100" + height="80" + rx="10" + ry="10" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect139" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + id="text143"><tspan + x="32.65625" + y="43.599999999999994" + id="tspan141">Task 1</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="100" + height="80" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect147" /> + <rect + x="-6" + y="-6" + width="112" + height="92" + class="djs-outline" + style="fill: none;" + id="rect149" /> + </g> + </g> + <g + class="djs-group" + id="g171"> + <g + class="djs-element djs-shape" + data-element-id="Gateway_0bsqjma" + style="display: block;" + transform="matrix(1 0 0 1 525 152)" + id="g169"> + <g + class="djs-visual" + id="g163"> + <polygon + points="25,0 50,25 25,50 0,25" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="polygon155" /> + <circle + cx="25" + cy="25" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle157" /> + <circle + cx="25" + cy="25" + r="12" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle159" /> + <path + d="m 18,22 7.363636363636364,-4.909090909090909 7.363636363636364,4.909090909090909 -2.4545454545454546,9.818181818181818 -9.818181818181818,0 z" + style="fill: none; stroke-width: 2px; stroke: black;" + id="path161" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="50" + height="50" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect165" /> + <rect + x="-6" + y="-6" + width="62" + height="62" + class="djs-outline" + style="fill: none;" + id="rect167" /> + </g> + </g> + <g + class="djs-group" + id="g187"> + <g + class="djs-element djs-shape" + data-element-id="Event_0qbztd3" + style="display: block;" + transform="matrix(1 0 0 1 632 159)" + id="g185"> + <g + class="djs-visual" + id="g179"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle173" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle175" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path177" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect181" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect183" /> + </g> + </g> + <g + class="djs-group" + id="g199"> + <g + class="djs-element djs-shape" + data-element-id="Event_1pwd0kq" + style="display: block;" + transform="matrix(1 0 0 1 732 159)" + id="g197"> + <g + class="djs-visual" + id="g191"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle189" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect193" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect195" /> + </g> + </g> + <g + class="djs-group" + id="g211"> + <g + class="djs-element djs-shape" + data-element-id="Event_1voo3le" + style="display: block;" + transform="matrix(1 0 0 1 732 272)" + id="g209"> + <g + class="djs-visual" + id="g203"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle201" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect205" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect207" /> + </g> + </g> + <g + class="djs-group" + id="g227"> + <g + class="djs-element djs-shape" + data-element-id="Event_1ndrm5j" + style="display: block;" + transform="matrix(1 0 0 1 422 159)" + id="g225"> + <g + class="djs-visual" + id="g219"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle213" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle215" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: black; stroke-width: 1px; stroke: white;" + id="path217" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect221" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect223" /> + </g> + </g> + <g + class="djs-group" + id="g243"> + <g + class="djs-element djs-shape" + data-element-id="Event_0pq5qbd" + style="display: block;" + transform="matrix(1 0 0 1 632 272)" + id="g241"> + <g + class="djs-visual" + id="g235"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle229" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle231" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path233" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect237" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect239" /> + </g> + </g> + <g + class="djs-group" + id="g285"> + <g + class="djs-element djs-shape" + data-element-id="Event_18u9tw6" + style="display: block;" + transform="matrix(1 0 0 1 632 382)" + id="g283"> + <g + class="djs-visual" + id="g277"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle245" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle247" /> + <circle + cx="18" + cy="18" + r="11" + style="stroke: black; stroke-width: 2px; fill: white;" + id="circle249" /> + <path + d="M 18,18 l 2.25,-7.5 m -2.25,7.5 l 5.25,1.5 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linecap: square;" + id="path251" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(0,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path253" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(30,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path255" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(60,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path257" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(90,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path259" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(120,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path261" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(150,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path263" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(180,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path265" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(210,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path267" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(240,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path269" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(270,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path271" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(300,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path273" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(330,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path275" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect279" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect281" /> + </g> + </g> + <g + class="djs-group" + id="g297"> + <g + class="djs-element djs-shape" + data-element-id="Event_1uh09e9" + style="display: block;" + transform="matrix(1 0 0 1 732 382)" + id="g295"> + <g + class="djs-visual" + id="g289"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle287" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect291" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect293" /> + </g> + </g> + <g + class="djs-group" + id="g311"> + <g + class="djs-element djs-shape" + data-element-id="Event_1uh09e9_label" + style="display: block;" + transform="matrix(1 0 0 1 733 425)" + id="g309"> + <g + class="djs-visual" + id="g303"> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" + id="text301"><tspan + x="0" + y="9.899999999999999" + id="tspan299">Failure</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="34" + height="14" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect305" /> + <rect + x="-6" + y="-6" + width="46" + height="26" + class="djs-outline" + style="fill: none;" + id="rect307" /> + </g> + </g> + <g + class="djs-group" + id="g325"> + <g + class="djs-element djs-shape" + data-element-id="StartEvent_1" + style="display: block;" + transform="matrix(1 0 0 1 179 159)" + id="g323"> + <g + class="djs-visual" + id="g317"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="circle313" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path315" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect319" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect321" /> + </g> + </g> + </g> + </g> + <g + class="djs-group" + id="g343" + style="filter:url(#filter1634)"> + <g + class="djs-element djs-shape" + data-element-id="Event_1pwd0kq_label" + style="display: block;" + transform="matrix(1 0 0 1 729 202)" + id="g341"> + <g + class="djs-visual" + id="g335"> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" + id="text333"><tspan + x="0" + y="9.899999999999999" + id="tspan331">Option A</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="44" + height="14" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect337" /> + <rect + x="-6" + y="-6" + width="56" + height="26" + class="djs-outline" + style="fill: none;" + id="rect339" /> + </g> + </g> + <g + class="djs-group" + id="g357" + style="filter:url(#filter1628)"> + <g + class="djs-element djs-shape" + data-element-id="Event_1voo3le_label" + style="display: block;" + transform="matrix(1 0 0 1 729 315)" + id="g355"> + <g + class="djs-visual" + id="g349"> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" + id="text347"><tspan + x="0" + y="9.899999999999999" + id="tspan345">Option B</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="43" + height="14" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect351" /> + <rect + x="-6" + y="-6" + width="55" + height="26" + class="djs-outline" + style="fill: none;" + id="rect353" /> + </g> + </g> + <g + class="djs-group" + id="g379" + style="filter:url(#filter1622)"> + <g + class="djs-element djs-shape" + data-element-id="Participant_0h427kw" + style="display: block;" + transform="matrix(1 0 0 1 890 100)" + id="g375"> + <g + class="djs-visual" + id="g367"> + <rect + x="0" + y="0" + width="300" + height="360" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect359" /> + <polyline + points="30,0 30,360 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline361" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)" + id="text365"><tspan + x="140.9765625" + y="18.6" + id="tspan363">Organization 2</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="312" + height="372" + class="djs-outline" + style="fill: none;" + id="rect369" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="300" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect371" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect373" /> + </g> + <g + class="djs-children" + id="g377" /> + </g> + <g + class="djs-group" + id="g391" + style="filter:url(#filter1616)"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0sswg90" + style="display: block;" + id="g389"> + <g + class="djs-visual" + id="g383"> + <path + d="m 440,159L440,130 L890,130 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path381" /> + </g> + <polyline + points="440,159 440,130 890,130 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline385" /> + <rect + x="434" + y="124" + width="462" + height="41" + class="djs-outline" + style="fill: none;" + id="rect387" /> + </g> + </g> + <g + class="djs-group" + id="g403" + style="filter:url(#filter1610)"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1wjv8rh" + style="display: block;" + id="g401"> + <g + class="djs-visual" + id="g395"> + <path + d="m 890,230L650,230 L650,195 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path393" /> + </g> + <polyline + points="890,230 650,230 650,195 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline397" /> + <rect + x="644" + y="189" + width="252" + height="47" + class="djs-outline" + style="fill: none;" + id="rect399" /> + </g> + </g> + <g + class="djs-group" + id="g415" + style="filter:url(#filter1604)"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0j7hwxl" + style="display: block;" + id="g413"> + <g + class="djs-visual" + id="g407"> + <path + d="m 890,340L650,340 L650,308 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path405" /> + </g> + <polyline + points="890,340 650,340 650,308 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline409" /> + <rect + x="644" + y="302" + width="252" + height="44" + class="djs-outline" + style="fill: none;" + id="rect411" /> + </g> + </g> +</svg> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/forge_overview.png b/docs/src/.vuepress/public/photos/developer-documentation/forge_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..f94299ec4d851ef8ebc073632c7a74acf33bd542 GIT binary patch literal 195635 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 h zEdYqyRTZ0L>xegjpKgaAA#zmy+m`_H?V-08tnTW2M7OB8;Lc!EhPXPluC7CdkPtXE zHHotWX6AHE>cuxqVWtz20q=X)Z%VSRTB4Cn3K_TaXc@`8`McguNZi@6y!ibatr>qJ zp#Yot3F!$^7?m^YBLVj2OBA_H?fAnS2*_skJ>9$VfvW~(HBie$N3mm4^7fVfl)?is zaOEGo?*4yH!Ni25jZNwQM1+I;|FRF>vg%fS8i=R--^hGFN_9Owue)PX=6}lSPH4k5 z<=^{?+5%X?@8)Hv2*UrI7<yA!U!UC8CMJyk&&EF%u6qXkx5y{E<)%0i6F-gr$P5BJ zJUrUE-T#v##y*XHDVhQODT_aS&4=OWwRzS4_hGwO3gIMpJ7W01jgn7!{;Ogn{8!+Z zBo%%6-#+B-aQ|UXe5LhA`@7EOQG~a_;mmZC`2R66{LnsGTK*3a2;UTyTx3&J{df4_ r*Jadqe+qOS#l-&|?Jo;>F+Ni}D9l`jMQeH@z+Xyos<KtmAHVz`hKWu_ literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/photos/developer-documentation/forge_requester_view.png b/docs/src/.vuepress/public/photos/developer-documentation/forge_requester_view.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bff02b926fe03b1b8cbd21570f652740081f9a GIT binary patch literal 42843 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 literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/photos/developer-documentation/forge_slice_message_name.png b/docs/src/.vuepress/public/photos/developer-documentation/forge_slice_message_name.png new file mode 100644 index 0000000000000000000000000000000000000000..720749418e650a737f306b5034815fa5909d36fd GIT binary patch literal 42421 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 DF|YO+ literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/photos/developer-documentation/keycloak_realm_dropdown.png b/docs/src/.vuepress/public/photos/developer-documentation/keycloak_realm_dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..493fd025ff9b9da228b320987f0a2c12a0139392 GIT binary patch literal 27715 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 U#v%uZ>(5Y!+z(d#eCoIV0@(u{fB*mh literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_eclipse.png b/docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_eclipse.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1399cf4dbcef4723119cce44ec4d86a60cf143 GIT binary patch literal 42092 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 literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_intellij.png b/docs/src/.vuepress/public/photos/developer-documentation/remote_debugging_intellij.png new file mode 100644 index 0000000000000000000000000000000000000000..5873982bb1c0e1f8eb58581b0acf77ac4df4e855 GIT binary patch literal 75066 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 Zx*@NRtGYj2hH%*d3@pa`7{etj^ADHL7U2K@ literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index b43967aa5..3f5eece31 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -34,6 +34,11 @@ export default hopeTheme({ text: "Security", icon: "safe", link: "/security/", + }, + { + text: "Developer Documentation", + icon: "info", + link: "/developer-documentation/" } ] }, @@ -88,7 +93,7 @@ export default hopeTheme({ icon: "info", prefix: "intro/", link: "intro/", - children: ["info/introduction.md", "info/basics", "info/architecture", "info/security", "info/allowList", "info/process-plugins"], + children: ["info/introduction.md", "info/basics", "info/architecture", "info/security", "info/allowList", "info/process-plugins", ""], }, { text: "Security", @@ -762,7 +767,48 @@ export default hopeTheme({ icon: "guide", children: ["introduction", "generalinformation/", "code/", "build/", "releases/", "tutorial/"], }, - ] + ], + "/developer-documentation/": [ + { + text: "Developer Documentation", + icon: "info", + link: "/developer-documentation/", + children: [{ + text: "Concepts", + icon: "info", + prefix: "concepts/", + link: "concepts/", + children: [{ + text: "BPMN", + icon: "info", + prefix: "bpmn/", + link: "bpmn/", + children: ["intro.md", "sequence-flow.md", "service-tasks.md", "gateways.md", "conditions.md", "messaging.md", "timer-intermediate-catching-events.md"], + }, + { + text: "FHIR", + icon: "info", + prefix: "fhir/", + link: "fhir/", + children: ["introduction.md", "task.md", "activitydefinition.md", "codesystem.md", "valueset.md"], + }, + { + text: "DSF", + icon: "info", + prefix: "dsf/", + link: "dsf/", + children: ["about-version-placeholders-and-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "certificates.md", "draft-task-resources.md", "environment-variables.md", "examples-for-requester-and-recipient-elements.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-api.md", "read-access-tag.md", "service-delegates.md", "spring-integration.md", "the-process-plugin-definition.md"], + }] + }, + { + text: "Guides", + icon: "info", + prefix: "guides/", + link: "guides/", + children: ["accessing-bpmn-process-variables.md", "accessing-task-resources-during-execution.md", "adding-task-input-parameters-to-task-profiles.md", "configuring-the-read-access-tag.md", "creating-an-activity-definition.md", "creating-codesystems-for-dsf-processes.md", "creating-task-resources-based-on-a-definition.md", "creating-valuesets-for-dsf-processes.md", "managing-mutiple-incoming-messages-and-missing-messages.md", "setting-targets-for-message-events.md", "starting-a-process-via-task-resources.md"] + }] + } + ], }, footer: "<a href='https://www.hs-heilbronn.de/impressum'>Imprint</a> • <a href='https://www.hs-heilbronn.de/de/datenschutz'>Data Privacy</a>", diff --git a/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md b/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md deleted file mode 100644 index 66e2e5314..000000000 --- a/docs/src/developer-documentation/concepts/bpmn/bpmn-model.md +++ /dev/null @@ -1,4 +0,0 @@ -## BPMN Model - -The DSF expects BPMN 2.0 for its process execution. This write-up covers the BPMN elements -most commonly used in DSF process plugins. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/conditions.md b/docs/src/developer-documentation/concepts/bpmn/conditions.md index c523ee82c..631c2817d 100644 --- a/docs/src/developer-documentation/concepts/bpmn/conditions.md +++ b/docs/src/developer-documentation/concepts/bpmn/conditions.md @@ -1,3 +1,8 @@ +--- +title: Conditions +icon: creative +--- + ### Conditions [Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) diff --git a/docs/src/developer-documentation/concepts/bpmn/gateways.md b/docs/src/developer-documentation/concepts/bpmn/gateways.md index 6732c17f7..8c9834215 100644 --- a/docs/src/developer-documentation/concepts/bpmn/gateways.md +++ b/docs/src/developer-documentation/concepts/bpmn/gateways.md @@ -1,3 +1,8 @@ +--- +title: Gateways +icon: creative +--- + ### Gateways [Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different diff --git a/docs/src/developer-documentation/concepts/bpmn/intro.md b/docs/src/developer-documentation/concepts/bpmn/intro.md new file mode 100644 index 000000000..de7f59511 --- /dev/null +++ b/docs/src/developer-documentation/concepts/bpmn/intro.md @@ -0,0 +1,15 @@ +--- +title: Introduction +icon: creative +--- + +The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.20/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). +Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. + +### Common BPMN Components +- Sequence Flow +- Service Tasks +- User Tasks +- Message Events +- Timer Events +- \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/developer-documentation/concepts/bpmn/messaging.md index d9bb2b812..a7bf57612 100644 --- a/docs/src/developer-documentation/concepts/bpmn/messaging.md +++ b/docs/src/developer-documentation/concepts/bpmn/messaging.md @@ -1,3 +1,9 @@ +--- +title: Messaging +icon: creative +--- + + ### Messaging In order to enable communication with other lanes, pools or even entirely separate processes you need to be able @@ -7,9 +13,9 @@ uses Message Flow. Message Flow is typically represented by a dashed line arrow The following BPMN collaboration diagram shows message exchange between two processes. <picture> - <source media="(prefers-color-scheme: dark)" srcset="figures/exercise3_message_flow_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="figures/exercise3_message_flow.svg"> - <img alt="BPMN collaboration diagram with two processes using message flow to exchange information between two organizations" src="figures/exercise3_message_flow.svg"> + <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/exercise3_message_flow_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/exercise3_message_flow.svg"> + <img alt="BPMN collaboration diagram with two processes using message flow to exchange information between two organizations" src="/photos/developer-documentation/exercise3_message_flow.svg"> </picture> #### Message Start Event diff --git a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md index ab4c470e9..715e8de49 100644 --- a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md +++ b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md @@ -1,3 +1,8 @@ +--- +title: Sequence Flow +icon: creative +--- + ### Sequence Flow BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. diff --git a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md index 6e7c9d528..e690669df 100644 --- a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md +++ b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md @@ -1,3 +1,8 @@ +--- +title: Service Tasks +icon: creative +--- + ### Service Tasks You will primarily use [Service Tasks](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) diff --git a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md index 6651f52cb..bd467ca2d 100644 --- a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md +++ b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md @@ -1,3 +1,8 @@ +--- +title: Timer Intermediate Catching Events +icon: creative +--- + ### Timer Intermediate Catching Events A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) diff --git a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md index 218bb9cea..0fddea685 100644 --- a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md +++ b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md @@ -1,3 +1,8 @@ +--- +title: About Versions, Placeholders und URLs +icon: creative +--- + ### About Versions, Placeholders and URLs #### Version Pattern diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md index 18e331962..29c7c3b0d 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md @@ -1,3 +1,9 @@ +--- +title: BPMN Process Execution +icon: creative +--- + + ### BPMN Process Execution The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md index 3a63ae94d..802de45c0 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md @@ -1,3 +1,8 @@ +--- +title: BPMN Process Variables +icon: creative +--- + ### BPMN Process Variables BPMN process variables hold additional information which has to be available during BPMN process execution. diff --git a/docs/src/developer-documentation/concepts/dsf/certificates.md b/docs/src/developer-documentation/concepts/dsf/certificates.md index 28591b8a2..89cf5f958 100644 --- a/docs/src/developer-documentation/concepts/dsf/certificates.md +++ b/docs/src/developer-documentation/concepts/dsf/certificates.md @@ -1,3 +1,8 @@ +--- +title: Certificates +icon: creative +--- + ### Certificates There is a number of certificates that need to be generated in order for DSF instances to communicate with each other securely. diff --git a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md index 6c412ddd5..66e38dff6 100644 --- a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md +++ b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md @@ -1,3 +1,8 @@ +--- +title: Draft Task Resources +icon: creative +--- + ### Draft Task Resources [Task](../../concepts/fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality diff --git a/docs/src/developer-documentation/concepts/dsf/environment-variables.md b/docs/src/developer-documentation/concepts/dsf/environment-variables.md index a5208920a..e6a28648a 100644 --- a/docs/src/developer-documentation/concepts/dsf/environment-variables.md +++ b/docs/src/developer-documentation/concepts/dsf/environment-variables.md @@ -1,3 +1,8 @@ +--- +title: Environment Variables +icon: creative +--- + ### Environment Variables Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md). diff --git a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md index 51dbdff1b..8b145aa43 100644 --- a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md +++ b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md @@ -1,3 +1,8 @@ +--- +title: Examples for Requester and Recipient Elements +icon: creative +--- + ### Examples for Requester and Recipient Elements Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from diff --git a/docs/src/developer-documentation/concepts/dsf/message-correlation.md b/docs/src/developer-documentation/concepts/dsf/message-correlation.md index 45610c5f2..51836aecf 100644 --- a/docs/src/developer-documentation/concepts/dsf/message-correlation.md +++ b/docs/src/developer-documentation/concepts/dsf/message-correlation.md @@ -1,3 +1,8 @@ +--- +title: Message Correlation +icon: creative +--- + ### Message Correlation In order for messages to be able to be sent back and forth between organizations with potentially multiple of the diff --git a/docs/src/developer-documentation/concepts/dsf/message-delegates.md b/docs/src/developer-documentation/concepts/dsf/message-delegates.md index 621f3d688..c1d21e01b 100644 --- a/docs/src/developer-documentation/concepts/dsf/message-delegates.md +++ b/docs/src/developer-documentation/concepts/dsf/message-delegates.md @@ -1,3 +1,8 @@ +--- +title: Message Delegates +icon: creative +--- + ### Message Delegates Message Delegates are the Java representation of the [Message Events](../../concepts/bpmn/messaging.md) in your BPMN model. diff --git a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md index 6576882d6..f632ca7b8 100644 --- a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md +++ b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md @@ -1,3 +1,8 @@ +--- +title: Organization Identifiers +icon: creative +--- + ### Organization Identifiers DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). diff --git a/docs/src/developer-documentation/concepts/dsf/process-api.md b/docs/src/developer-documentation/concepts/dsf/process-api.md index bc50946f4..a18dfdd0d 100644 --- a/docs/src/developer-documentation/concepts/dsf/process-api.md +++ b/docs/src/developer-documentation/concepts/dsf/process-api.md @@ -1,3 +1,8 @@ +--- +title: DSF Process API Package +icon: creative +--- + ### DSF Process API Package The [DSF Process API package](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. diff --git a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md index 9cc75a2f7..0c4131790 100644 --- a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md +++ b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md @@ -1,3 +1,8 @@ +--- +title: Read Access Tag +icon: creative +--- + ### Read Access Tag Axiomatically, nobody is allowed to write FHIR resources (except [Task](../../concepts/fhir/task.md)) to the DSF FHIR server diff --git a/docs/src/developer-documentation/concepts/dsf/service-delegates.md b/docs/src/developer-documentation/concepts/dsf/service-delegates.md index 4eb2645fb..c393d1e13 100644 --- a/docs/src/developer-documentation/concepts/dsf/service-delegates.md +++ b/docs/src/developer-documentation/concepts/dsf/service-delegates.md @@ -1,3 +1,8 @@ +--- +title: Service Delegates +icon: creative +--- + ### Service Delegates Service Delegates are the Java representation of the [Service Tasks](../../concepts/bpmn/service-tasks.md) in your BPMN model. diff --git a/docs/src/developer-documentation/concepts/dsf/spring-integration.md b/docs/src/developer-documentation/concepts/dsf/spring-integration.md index 8aacf65ab..c49e9973f 100644 --- a/docs/src/developer-documentation/concepts/dsf/spring-integration.md +++ b/docs/src/developer-documentation/concepts/dsf/spring-integration.md @@ -1,3 +1,8 @@ +--- +title: Spring Integration +icon: creative +--- + ### Spring Integration Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also diff --git a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md index d3e05595a..ac7810b5e 100644 --- a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md +++ b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md @@ -1,3 +1,8 @@ +--- +title: The Process Plugin Definition +icon: creative +--- + ### The Process Plugin Definition In order for the DSF BPE server to load your plugin you need to provide it with the following information: diff --git a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md index 1ebc78282..b51904c0a 100644 --- a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md +++ b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md @@ -1,3 +1,8 @@ +--- +title: ActivityDefinition +icon: creative +--- + ### ActivityDefinition [ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are diff --git a/docs/src/developer-documentation/concepts/fhir/codesystem.md b/docs/src/developer-documentation/concepts/fhir/codesystem.md index f9418e37f..6e2bcc8cc 100644 --- a/docs/src/developer-documentation/concepts/fhir/codesystem.md +++ b/docs/src/developer-documentation/concepts/fhir/codesystem.md @@ -1,3 +1,8 @@ +--- +title: CodeSystem +icon: creative +--- + ### CodeSystem [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which diff --git a/docs/src/developer-documentation/concepts/fhir/info.md b/docs/src/developer-documentation/concepts/fhir/introduction.md similarity index 91% rename from docs/src/developer-documentation/concepts/fhir/info.md rename to docs/src/developer-documentation/concepts/fhir/introduction.md index de33a5d62..16614fb74 100644 --- a/docs/src/developer-documentation/concepts/fhir/info.md +++ b/docs/src/developer-documentation/concepts/fhir/introduction.md @@ -1,4 +1,9 @@ -## FHIR +--- +title: Introduction +icon: creative +--- + +## FHIR Introduction The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](../../concepts/fhir/activitydefinition.md), [Tasks](../../concepts/fhir/task.md), diff --git a/docs/src/developer-documentation/concepts/fhir/task.md b/docs/src/developer-documentation/concepts/fhir/task.md index 484b46ba2..573cb9028 100644 --- a/docs/src/developer-documentation/concepts/fhir/task.md +++ b/docs/src/developer-documentation/concepts/fhir/task.md @@ -1,3 +1,8 @@ +--- +title: Task +icon: creative +--- + ### Task The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. diff --git a/docs/src/developer-documentation/concepts/fhir/valueset.md b/docs/src/developer-documentation/concepts/fhir/valueset.md index 807de4324..d53f19990 100644 --- a/docs/src/developer-documentation/concepts/fhir/valueset.md +++ b/docs/src/developer-documentation/concepts/fhir/valueset.md @@ -1,3 +1,8 @@ +--- +title: ValueSet +icon: creative +--- + ### ValueSet [ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](../../concepts/fhir/codesystem.md) to coded elements like diff --git a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md index 0177613ee..1a4410686 100644 --- a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md +++ b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md @@ -1,3 +1,8 @@ +--- +title: Accessing BPMN Process Variables +icon: creative +--- + ### Accessing BPMN Process Variables After creating a [Service Delegate](../concepts/dsf/service-delegates.md) or [Message Delegate](../concepts/dsf/message-delegates.md), you might want to diff --git a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md index 1b1bf4ce6..b40b2c31a 100644 --- a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md +++ b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md @@ -1,3 +1,8 @@ +--- +title: Accessing Task Resources During Execution +icon: creative +--- + ### Accessing Task Resources During Execution If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will diff --git a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md index 8c64cc47b..c3bbf0a21 100644 --- a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md +++ b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md @@ -1,3 +1,8 @@ +--- +title: Adding Task Input Parameters to Task Profiles +icon: creative +--- + ### Adding Task Input Parameters to Task Profiles When adding a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) to a [Task](../concepts/fhir/task.md) diff --git a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md index f8a6dfb59..320e12b31 100644 --- a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md +++ b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md @@ -1,3 +1,8 @@ +--- +title: Configuring the Read Access Tag +icon: creative +--- + ### Configuring the Read Access Tag To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../concepts/dsf/read-access-tag.md) diff --git a/docs/src/developer-documentation/guides/creating-an-activity-definition.md b/docs/src/developer-documentation/guides/creating-an-activity-definition.md index c0e2295a9..be8a6ed68 100644 --- a/docs/src/developer-documentation/guides/creating-an-activity-definition.md +++ b/docs/src/developer-documentation/guides/creating-an-activity-definition.md @@ -1,3 +1,8 @@ +--- +title: Creating an ActivityDefinition +icon: creative +--- + ### Creating an ActivityDefinition This guide will teach you how to create an ActivityDefinition based on the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile for your process plugin. diff --git a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md index 5c65e3078..20b240875 100644 --- a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md +++ b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md @@ -1,3 +1,8 @@ +--- +title: Creating CodeSystems for DSF Processes +icon: creative +--- + ### Creating CodeSystems for DSF Processes You might find yourself in a situation where you need to create a [CodeSystem](../concepts/fhir/codesystem.md). diff --git a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md index d6da6bff4..16ccbddd1 100644 --- a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md +++ b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md @@ -1,3 +1,8 @@ +--- +title: Creating Task Resources Based on a Definition +icon: creative +--- + ### Creating Task Resources Based on a Definition This short guide should help you understand how you can create [Task](../concepts/fhir/task.md) @@ -24,7 +29,7 @@ element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: -![Forge overview](../../exercises/figures/forge_overview.png) +![Forge overview](/photos/developer-documentation/forge_overview.png) #### 3rd Step: Building the Task Resource We will now go through each element one by one and include it into our [Task](../concepts/fhir/task.md) @@ -83,7 +88,7 @@ By now your [Task](../concepts/fhir/task.md) resources should look something lik Let us look at a more complex element like the `requester` element: -![Forge requester view](../../exercises/figures/forge_requester_view.png) +![Forge requester view](/photos/developer-documentation/forge_requester_view.png) We will start the same way we started with primitive elements, by adding the `requester` element: ```xml @@ -180,7 +185,7 @@ resource should look something like this: [Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the slice `message-name`: -![Forge slice message name](../../exercises/figures/forge_slice_message_name.png) +![Forge slice message name](/photos/developer-documentation/forge_slice_message_name.png) If we were to continue including slices to the [Task](../concepts/fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: diff --git a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md index c4ca9e21a..b22e0e018 100644 --- a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md +++ b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md @@ -1,3 +1,8 @@ +--- +title: Creating ValueSets for DSF Processes +icon: creative +--- + ### Creating ValueSets for DSF Processes You might find yourself in the situation where you need to create a [ValueSet](../concepts/fhir/valueset.md). diff --git a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md index cdc5de09c..6a6c089ab 100644 --- a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md +++ b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -1,3 +1,8 @@ +--- +title: Managing Multiple Incoming Messages and Missing Messages +icon: creative +--- + ### Managing Multiple Incoming Messages and Missing Messages If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../concepts/fhir/task.md) may never arrive. @@ -13,7 +18,7 @@ The following BPMN collaboration diagram shows how the process at the first orga or missing messages: <picture> - <source media="(prefers-color-scheme: dark)" srcset="../../exercises/figures/exercise5_event_based_gateway_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="../../exercises/figures/exercise5_event_based_gateway.svg"> - <img alt="BPMN collaboration diagram with an Event Based Gateway" src="../../exercises/figures/exercise5_event_based_gateway.svg"> + <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/exercise5_event_based_gateway.svg"> + <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/exercise5_event_based_gateway.svg"> </picture> diff --git a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md index 6cb427fbd..7b6490a42 100644 --- a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md +++ b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md @@ -1,3 +1,8 @@ +--- +title: Setting Targets for Message Events +icon: creative +--- + ### Setting Targets for Message Events Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. diff --git a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md index ec6275622..6bcd9db67 100644 --- a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md +++ b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md @@ -1,3 +1,8 @@ +--- +title: Starting a Process via Task Resources +icon: creative +--- + ### Starting a Process via Task Resources To start a BPMN process, you need to create new a [Task](../concepts/fhir/task.md) resource in the DSF FHIR server From 34f8849bb07fb823166d8538072aadf6cc9547f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Fri, 12 Apr 2024 11:19:23 +0200 Subject: [PATCH 03/42] Fixed newlines from tutorial .md files rendering ugly. Moved explenation of certificates to tutorial because it was too specific --- docs/src/.vuepress/theme.ts | 2 +- .../concepts/bpmn/conditions.md | 11 +-- .../concepts/bpmn/gateways.md | 15 +-- .../concepts/bpmn/intro.md | 11 +-- .../concepts/bpmn/messaging.md | 29 ++---- .../concepts/bpmn/sequence-flow.md | 3 +- .../concepts/bpmn/service-tasks.md | 6 +- .../timer-intermediate-catching-events.md | 6 +- .../about-version-placeholders-and-urls.md | 33 ++----- .../concepts/dsf/bpmn-process-execution.md | 9 +- .../concepts/dsf/bpmn-process-variables.md | 6 +- .../concepts/dsf/certificates.md | 24 ----- .../concepts/dsf/draft-task-resources.md | 16 +--- .../concepts/dsf/environment-variables.md | 13 +-- ...es-for-requester-and-recipient-elements.md | 4 +- .../concepts/dsf/message-correlation.md | 12 +-- .../concepts/dsf/message-delegates.md | 20 +--- .../concepts/dsf/organization-identifiers.md | 14 +-- .../concepts/dsf/process-api.md | 6 +- .../concepts/dsf/read-access-tag.md | 15 +-- .../concepts/dsf/service-delegates.md | 11 +-- .../concepts/dsf/spring-integration.md | 10 +- .../dsf/the-process-plugin-definition.md | 6 +- .../concepts/fhir/activitydefinition.md | 17 +--- .../concepts/fhir/codesystem.md | 4 +- .../concepts/fhir/introduction.md | 6 +- .../concepts/fhir/task.md | 12 +-- .../concepts/fhir/valueset.md | 6 +- .../accessing-bpmn-process-variables.md | 8 +- ...cessing-task-resources-during-execution.md | 22 +---- ...-task-input-parameters-to-task-profiles.md | 61 +++--------- .../guides/configuring-the-read-access-tag.md | 35 ++----- .../guides/creating-an-activity-definition.md | 94 +++++-------------- .../creating-codesystems-for-dsf-processes.md | 11 +-- ...ng-task-resources-based-on-a-definition.md | 66 +++---------- .../creating-valuesets-for-dsf-processes.md | 19 +--- ...-incoming-messages-and-missing-messages.md | 10 +- .../setting-targets-for-message-events.md | 11 +-- .../starting-a-process-via-task-resources.md | 42 ++------- 39 files changed, 139 insertions(+), 567 deletions(-) delete mode 100644 docs/src/developer-documentation/concepts/dsf/certificates.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 3f5eece31..7fcbca535 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -797,7 +797,7 @@ export default hopeTheme({ icon: "info", prefix: "dsf/", link: "dsf/", - children: ["about-version-placeholders-and-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "certificates.md", "draft-task-resources.md", "environment-variables.md", "examples-for-requester-and-recipient-elements.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-api.md", "read-access-tag.md", "service-delegates.md", "spring-integration.md", "the-process-plugin-definition.md"], + children: ["about-version-placeholders-and-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "draft-task-resources.md", "environment-variables.md", "examples-for-requester-and-recipient-elements.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-api.md", "read-access-tag.md", "service-delegates.md", "spring-integration.md", "the-process-plugin-definition.md"], }] }, { diff --git a/docs/src/developer-documentation/concepts/bpmn/conditions.md b/docs/src/developer-documentation/concepts/bpmn/conditions.md index 631c2817d..5aa85f5e2 100644 --- a/docs/src/developer-documentation/concepts/bpmn/conditions.md +++ b/docs/src/developer-documentation/concepts/bpmn/conditions.md @@ -5,13 +5,4 @@ icon: creative ### Conditions -[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) -allow you to change the behaviour of BPMN processes during execution. There are two ways you -are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of -certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity -to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. -Expressions have the following syntax: `${expression}`. For this tutorial, _expression_ will -use a boolean condition like `var == true`. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/). -For this to work during BPMN process execution, the variable you want to use for the boolean -condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) -reaches the evaluation of the expression. \ No newline at end of file +[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/gateways.md b/docs/src/developer-documentation/concepts/bpmn/gateways.md index 8c9834215..083fbbb26 100644 --- a/docs/src/developer-documentation/concepts/bpmn/gateways.md +++ b/docs/src/developer-documentation/concepts/bpmn/gateways.md @@ -5,21 +5,12 @@ icon: creative ### Gateways -[Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different -types of gateways will be useful for different scenarios. +[Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different types of gateways will be useful for different scenarios. #### Exclusive Gateways -[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) -allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions). -[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) are not part of the -[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them -through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/). -In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting -a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to -use Conditions [here](../../concepts/bpmn/conditions.md). +[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](../../concepts/bpmn/conditions.md). #### Event-based Gateway -The [Event-based Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/event-based-gateway/) -allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file +The [Event-based Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/intro.md b/docs/src/developer-documentation/concepts/bpmn/intro.md index de7f59511..2922e2b4b 100644 --- a/docs/src/developer-documentation/concepts/bpmn/intro.md +++ b/docs/src/developer-documentation/concepts/bpmn/intro.md @@ -3,13 +3,4 @@ title: Introduction icon: creative --- -The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.20/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). -Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. - -### Common BPMN Components -- Sequence Flow -- Service Tasks -- User Tasks -- Message Events -- Timer Events -- \ No newline at end of file +The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.20/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/developer-documentation/concepts/bpmn/messaging.md index a7bf57612..a8bec3071 100644 --- a/docs/src/developer-documentation/concepts/bpmn/messaging.md +++ b/docs/src/developer-documentation/concepts/bpmn/messaging.md @@ -6,34 +6,19 @@ icon: creative ### Messaging -In order to enable communication with other lanes, pools or even entirely separate processes you need to be able -to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) -to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) in the same diagram -uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. -The following BPMN collaboration diagram shows message exchange between two processes. - -<picture> - <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/exercise3_message_flow_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/exercise3_message_flow.svg"> - <img alt="BPMN collaboration diagram with two processes using message flow to exchange information between two organizations" src="/photos/developer-documentation/exercise3_message_flow.svg"> -</picture> +In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. + +![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/exercise3_message_flow.svg) #### Message Start Event -[Message Start Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) -allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, -you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) at -the beginning of all of your BPMN models. +[Message Start Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) at the beginning of all of your BPMN models. #### Message Intermediate Throwing Event -[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) -are used to send messages during process execution. +[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) are used to send messages during process execution. #### Message Intermediate Catching Event -[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as -the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). -Use them whenever you expect to receive a message from another process or organization during execution. +[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). Use them whenever you expect to receive a message from another process or organization during execution. #### Message End Event -The [Message End Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-end-event) will -stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file +The [Message End Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-end-event) will stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md index 715e8de49..3650cc635 100644 --- a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md +++ b/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md @@ -4,5 +4,4 @@ icon: creative --- ### Sequence Flow -BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. -Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. +BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. diff --git a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md index e690669df..50849d488 100644 --- a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md +++ b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md @@ -5,8 +5,4 @@ icon: creative ### Service Tasks -You will primarily use [Service Tasks](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) -when creating BPMN models. They are different from regular BPMN Tasks in that they offer the ability to -link an implementation to the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) -which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages -this engine to execute your BPMN processes. \ No newline at end of file +One of the most common types of BPMN Tasks used for modeling DSF processes is the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/). They are different from regular BPMN Tasks in that they offer the ability to link an implementation to the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages this engine to execute your BPMN processes. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md index bd467ca2d..c8e8b8ffc 100644 --- a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md +++ b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md @@ -5,8 +5,4 @@ icon: creative ### Timer Intermediate Catching Events -A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) -allows you model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. -The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. -Examples can be found [here](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following -the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file +A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md index 0fddea685..8ca7c542d 100644 --- a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md +++ b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md @@ -12,20 +12,11 @@ Process plugin versions have to obey the pattern: \d+\.\d+\.\d+\.\d+ Example: 1.0.1.2 ``` -The first two numbers (`1.0`) are used in FHIR resources and signal changes which break compatibility with previous -process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`1.2`) signal changes which do not break compatibility with previous process versions. Specifically, -the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. +The first two numbers (`1.0`) are used in FHIR resources and signal changes which break compatibility with previous process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`1.2`) signal changes which do not break compatibility with previous process versions. Specifically, the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. #### Placeholders -To avoid the need to specify the version and release date for each [ActivityDefinition](../../concepts/fhir/activitydefinition.md), [CodeSystem](../../concepts/fhir/codesystem.md), -[Task](../../concepts/fhir/task.md) profile and [ValueSet](../../concepts/fhir/valueset.md) resource, -the placeholders `#{version}` and `#{date}` can be used when creating FHIR resources or even in BPMN models. -They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` -and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. -There is also a placeholder for the organization the DSF instance is running in: `#{organization}`. You would typically use -this placeholder in [Draft Task Resources](draft-task-resources.md) but like the other placeholders, it can be used anywhere -as long as the file gets loaded by the [BPE](https://dsf.dev/intro/info/architecture.html#business-process-engine-bpe). +To avoid the need to specify the version and release date, the placeholders `#{version}` and `#{date}` can be used when creating FHIR resources or even in BPMN models. They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. There is also a placeholder for the organization the DSF instance is running in: `#{organization}`. You would typically use this placeholder in [Draft Task Resources](draft-task-resources.md) but like the other placeholders, it can be used anywhere as long as the file gets loaded by the [BPE](https://dsf.dev/intro/info/architecture.html#business-process-engine-bpe). #### URLs @@ -33,26 +24,14 @@ BPMN models have an ID we call process definition key. The BPMN process definiti ``` ^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey ``` -In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](../../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) -for this as well. The DSF will also reference this process in URL form in FHIR resources: +In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](../../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) for this as well. The DSF will also reference this process in URL form in FHIR resources: ``` http://domain.org/bpe/Process/processKey|1.0 ``` -As you can see, the version in the URL ``|1.0`` only uses the resource version and omits the code base version. -As mentioned in [Version Pattern](about-version-placeholders-and-urls.md#version-pattern), this means that only changes to the first two -version numbers are significant to signal compatibility when communicating with other process plugin instances. -The process definition key and URL are also related to each other. The DSF will try to match BPMN models -to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey -the pattern above. - -You will use the above URL as your instantiatesCanonical value for [Task](../../concepts/fhir/task.md) profile definitions as well as references -to [Task](../../concepts/fhir/task.md) profiles in other resources. -You will also use it as the URL value for your [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). In this case though, you -have to split up the URL into two parts. You will separate the version (``|1.0``) from the URL and use it as a value for the -`ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` -[placeholder](about-version-placeholders-and-urls.md#placeholders) here instead. Going by the example from above, you will be left with a URL that looks -like this: +As you can see, the version in the URL ``|1.0`` only uses the resource version and omits the code base version. As mentioned in [Version Pattern](about-version-placeholders-and-urls.md#version-pattern), this means that only changes to the first two version numbers are significant to signal compatibility when communicating with other process plugin instances. The process definition key and URL are also related to each other. The DSF will try to match BPMN models to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey the pattern above. + +You will use the above URL as your instantiatesCanonical value for [Task](../../concepts/fhir/task.md) profile definitions as well as references to [Task](../../concepts/fhir/task.md) profiles in other resources. You will also use it as the URL value for your [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). In this case though, you have to split up the URL into two parts. You will separate the version (``|1.0``) from the URL and use it as a value for the `ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` [placeholder](about-version-placeholders-and-urls.md#placeholders) here instead. Going by the example from above, you will be left with a URL that looks like this: ``` http://domain.org/bpe/Process/processKey ``` diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md index 29c7c3b0d..e9aea7a67 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md @@ -6,11 +6,4 @@ icon: creative ### BPMN Process Execution -The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their -executions structured as a tree hierarchy. Each BPMN process -starts with the [process instance](https://docs.camunda.org/manual/7.20/user-guide/process-engine/process-engine-concepts/#process-instances) -as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions -under itself for them to process all tasks along their paths on their own. -Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). -You have access to this representation in your Java code when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates -like `doExecute` or `getAdditionalInputParameters` through the `execution` parameter. \ No newline at end of file +The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.20/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md index 802de45c0..ce456d542 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md @@ -5,10 +5,6 @@ icon: creative ### BPMN Process Variables -BPMN process variables hold additional information which has to be available during BPMN process execution. -Variables can be directly related to BPMN elements like the boolean value for [Conditions](../../concepts/bpmn/conditions.md), but -do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. -They are accessible during the entirety of the execution to all [Service](../../concepts/dsf/service-delegates.md) / -[Message](../../concepts/dsf/message-delegates.md) Delegates. +BPMN process variables hold additional information which has to be available during BPMN process execution. Variables can be directly related to BPMN elements like the boolean value for [Conditions](../../concepts/bpmn/conditions.md), but do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. They are accessible during the entirety of the execution to all [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates. You can learn how to access to the BPMN process variables [here](../../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/certificates.md b/docs/src/developer-documentation/concepts/dsf/certificates.md deleted file mode 100644 index 89cf5f958..000000000 --- a/docs/src/developer-documentation/concepts/dsf/certificates.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Certificates -icon: creative ---- - -### Certificates - -There is a number of certificates that need to be generated in order for DSF instances to communicate with each other securely. -You can find a comprehensive lists of certificates needed by the [DSF FHIR](https://dsf.dev/stable/maintain/fhir/configuration.html) -and [DSF BPE](https://dsf.dev/stable/maintain/bpe/configuration.html) servers on the DSF website. -Certificates will be created by the `test-data-generator` project through Maven by the time of the `package` phase in your process plugin build. -You can also invoke the generation of certificates separately by running the Maven build of `test-data-generator` until (and including) the `package` phase. -Since this tutorial comes with three preconfigured DSF instances, the only time you will need to interact with certificates -is when you want to make requests to the DSF FHIR server. Either for access to the web frontend under https://instance-host-name/fhir/, -or when [starting your process plugin](../../guides/starting-a-process-via-task-resources.md). -In case of the web frontend, you will need to add the CA certificate and client certificate of the DSF instance you want to access to your browser. -Certificates can be found in `test-data-generator/cert`. - -**Example:** -You want to access the `dic` DSF FHIR server. You add the CA certificate located in `test-data-generator/cert/ca` to your -browser's certificate store. You also add the client certificate for `dic` located in `test-data-generator/cert/dic-client` -to your browser's client certificates. - -**Important: Passwords for .p12 files are always "password"** diff --git a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md index 66e38dff6..4f0444422 100644 --- a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md +++ b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md @@ -5,14 +5,7 @@ icon: creative ### Draft Task Resources -[Task](../../concepts/fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality -of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. -Compared to regular [Task](../../concepts/fhir/task.md) resources used to -start BPMN processes, this type of [Task](../../concepts/fhir/task.md) resource requires the status `draft` instead the usual `requested`. -It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization -identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. -Additionally, it requires setting the `Task.identifier` -element. It should look something like this: +[Task](../../concepts/fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. Compared to regular [Task](../../concepts/fhir/task.md) resources used to start BPMN processes, this type of [Task](../../concepts/fhir/task.md) resource requires the status `draft` instead the usual `requested`. It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. Additionally, it requires setting the `Task.identifier` element. It should look something like this: ```xml <identifier> @@ -23,9 +16,6 @@ element. It should look something like this: `processKey` should be the same one used in [URLs](../../concepts/dsf/about-version-placeholders-and-urls.md#urls). `task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. -For a complete example you can take a look at the Draft Task Resource in one of the solution branches -and compare it to the one needed for cURL. The [Task](../../concepts/fhir/task.md) resource created -for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. +For a complete example you can take a look at the Draft Task Resource in one of the solution branches and compare it to the one needed for cURL. The [Task](../../concepts/fhir/task.md) resource created for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. -You might also want to check out [this guide](../../guides/creating-task-resources-based-on-a-definition.md) -if you do not know how to create [Task](../../concepts/fhir/task.md) resources in general. \ No newline at end of file +You might also want to check out [this guide](../../guides/creating-task-resources-based-on-a-definition.md) if you do not know how to create [Task](../../concepts/fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/environment-variables.md b/docs/src/developer-documentation/concepts/dsf/environment-variables.md index e6a28648a..2ce877cc5 100644 --- a/docs/src/developer-documentation/concepts/dsf/environment-variables.md +++ b/docs/src/developer-documentation/concepts/dsf/environment-variables.md @@ -5,15 +5,6 @@ icon: creative ### Environment Variables -Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md). -They are the same for all running process instances. They can be defined by adding a member variable with -the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses -the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds -to an underscore in the equivalent environment variable. Environment variables are always written upper-case. -The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. +Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md). They are the same for all running process instances. They can be defined by adding a member variable with the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds to an underscore in the equivalent environment variable. Environment variables are always written upper-case. The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. -The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. -You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. -You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. -You can take a look at the `pom.xml` for the `tutorial-process` submodule to see how you can add it to your own project. -Keep in mind to point the `<workingPackage>` field to the package you want documentation for. \ No newline at end of file +The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. You can take a look at the `pom.xml` for the `tutorial-process` submodule [here](https://github.com/datasharingframework/dsf-process-tutorial/blob/main/tutorial-process/pom.xml) to see how you can add it to your own project. Keep in mind to point the `<workingPackage>` field to the package you want documentation for. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md index 8b145aa43..64d0164f8 100644 --- a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md +++ b/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md @@ -5,9 +5,7 @@ icon: creative ### Examples for Requester and Recipient Elements -Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from -the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). -Use this collection as a reference point when creating your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). +Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). Use this collection as a reference point when creating your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). #### Requester The `requester` element uses one of the following Codings: diff --git a/docs/src/developer-documentation/concepts/dsf/message-correlation.md b/docs/src/developer-documentation/concepts/dsf/message-correlation.md index 51836aecf..4e91e1515 100644 --- a/docs/src/developer-documentation/concepts/dsf/message-correlation.md +++ b/docs/src/developer-documentation/concepts/dsf/message-correlation.md @@ -5,14 +5,6 @@ icon: creative ### Message Correlation -In order for messages to be able to be sent back and forth between organizations with potentially multiple of the -same process plugin instances running at the same time and still arriving at the correct process instance, -we need some mechanism to map messages to their rightful process instance. -This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. -This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. +In order for messages to be able to be sent back and forth between organizations with potentially multiple of the same process plugin instances running at the same time and still arriving at the correct process instance, we need some mechanism to map messages to their rightful process instance. This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. -It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens -when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. -To solve this issue, [Task](../../concepts/fhir/task.md) resources also come with an [Input Parameter](../../concepts/fhir/task.md#task-input-parameters) called `correlation-key`. -This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. -You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file +It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. To solve this issue, [Task](../../concepts/fhir/task.md) resources also come with an [Input Parameter](../../concepts/fhir/task.md#task-input-parameters) called `correlation-key`. This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/message-delegates.md b/docs/src/developer-documentation/concepts/dsf/message-delegates.md index c1d21e01b..a5aada5d0 100644 --- a/docs/src/developer-documentation/concepts/dsf/message-delegates.md +++ b/docs/src/developer-documentation/concepts/dsf/message-delegates.md @@ -5,25 +5,11 @@ icon: creative ### Message Delegates -Message Delegates are the Java representation of the [Message Events](../../concepts/bpmn/messaging.md) in your BPMN model. -You link a Message Delegate to a certain [Message Event](../../concepts/bpmn/messaging.md) by selecting the Message Event -in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. -Make sure you use the fully qualified class name. Like this: +Message Delegates are the Java representation of the [Message Events](../../concepts/bpmn/messaging.md) in your BPMN model. You link a Message Delegate to a certain [Message Event](../../concepts/bpmn/messaging.md) by selecting the Message Event in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: ``` org.package.myClass ``` -You will only need Message Delegates for [Message Send Events](../../concepts/bpmn/messaging.md). Incoming messages will -be resolved to the correct [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) automatically using [Message Correlation](../../concepts/dsf/message-correlation.md) -and the message inputs will be added to that execution's [process variables](../../concepts/dsf/bpmn-process-variables.md). +You will only need Message Delegates for [Message Send Events](../../concepts/bpmn/messaging.md). Incoming messages will be resolved to the correct [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) automatically using [Message Correlation](../../concepts/dsf/message-correlation.md) and the message inputs will be added to that execution's [process variables](../../concepts/dsf/bpmn-process-variables.md). -To make a Message Delegate for [Message Send Events](../../concepts/bpmn/messaging.md), your Java class needs to extend -`AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting -the `doExecute` method like with [Service Delegates](../../concepts/dsf/service-delegates.md). Instead, you most likely want to -aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the -`getAdditionalInputParamters` method. The DSF translates BPMN messages -into FHIR [Task](../../concepts/fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information -you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../../concepts/fhir/task.md#task-input-parameters), -hence the name of the method. -The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. -You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). +To make a Message Delegate for [Message Send Events](../../concepts/bpmn/messaging.md), your Java class needs to extend `AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting the `doExecute` method like with [Service Delegates](../../concepts/dsf/service-delegates.md). Instead, you most likely want to aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the `getAdditionalInputParamters` method. The DSF translates BPMN messages into FHIR [Task](../../concepts/fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../../concepts/fhir/task.md#task-input-parameters), hence the name of the method. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). diff --git a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md index f632ca7b8..265f75958 100644 --- a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md +++ b/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md @@ -4,17 +4,7 @@ icon: creative --- ### Organization Identifiers -DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies -the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). -It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). -You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server -instance running under `domain`. The results will also include the `organization identifier` of each organization. +DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server instance running under `domain`. The results will also include the `organization identifier` of each organization. #### Organization Identifiers in Task Resources -[Task](../../concepts/fhir/task.md) resources require you to reference an organization via its identifier as -the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements -depend on the [ActivityDefinition](../../concepts/fhir/activitydefinition.md) the [Task](../../concepts/fhir/task.md) resource -should conform to. -As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements -for [Task](../../concepts/fhir/task.md) resources which initially start processes. All other cases depend on the context of -the message being sent during process execution. \ No newline at end of file +[Task](../../concepts/fhir/task.md) resources require you to reference an organization via its identifier as the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements depend on the [ActivityDefinition](../../concepts/fhir/activitydefinition.md) the [Task](../../concepts/fhir/task.md) resource should conform to. As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements for [Task](../../concepts/fhir/task.md) resources which initially start processes. All other cases depend on the context of the message being sent during process execution. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/process-api.md b/docs/src/developer-documentation/concepts/dsf/process-api.md index a18dfdd0d..24774372e 100644 --- a/docs/src/developer-documentation/concepts/dsf/process-api.md +++ b/docs/src/developer-documentation/concepts/dsf/process-api.md @@ -5,12 +5,10 @@ icon: creative ### DSF Process API Package -The [DSF Process API package](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. -This includes for example the `Variables` class, which provides access to the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). +The [DSF Process API package](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. This includes for example the `Variables` class, which provides access to the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). #### Process Plugin Api -When creating [Service Delegates](../../concepts/dsf/service-delegates.md) or [Message Delegates](../../concepts/dsf/message-delegates.md) you will -notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. +When creating [Service Delegates](../../concepts/dsf/service-delegates.md) or [Message Delegates](../../concepts/dsf/message-delegates.md) you wil notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. This API instance provides a variety of utility classes: - `ProxyConfig`**:** forward proxy configuration - `EndpointProvider`**:** access to Endpoint resources diff --git a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md index 0c4131790..98c947241 100644 --- a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md +++ b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md @@ -5,13 +5,7 @@ icon: creative ### Read Access Tag -Axiomatically, nobody is allowed to write FHIR resources (except [Task](../../concepts/fhir/task.md)) to the DSF FHIR server -unless it is your own organization. By default, the same applies to reading FHIR resources -(again except [Task](../../concepts/fhir/task.md)). But since the DSF is often used to offer medical data in form of -FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. -The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the -exception of [Task](../../concepts/fhir/task.md) resources. We will explain the reason for this exception shortly. -For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: +Axiomatically, nobody is allowed to write FHIR resources (except [Task](../../concepts/fhir/task.md)) to the DSF FHIR server unless it is your own organization. By default, the same applies to reading FHIR resources (again except [Task](../../concepts/fhir/task.md)). But since the DSF is often used to offer medical data in form of FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the exception of [Task](../../concepts/fhir/task.md) resources. We will explain the reason for this exception shortly. For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: ```xml <meta> @@ -23,9 +17,6 @@ For example, allowing read access for all organizations, you would use the follo ``` You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). -The read access rules for [Task](../../concepts/fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's -[ActivityDefinitions](../../concepts/fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. +The read access rules for [Task](../../concepts/fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. -It is also possible to restrict read access of FHIR resources to organizations with -a specific role in a parent organization or a specific identifier. -If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../../guides/configuring-the-read-access-tag.md). +It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../../guides/configuring-the-read-access-tag.md). diff --git a/docs/src/developer-documentation/concepts/dsf/service-delegates.md b/docs/src/developer-documentation/concepts/dsf/service-delegates.md index c393d1e13..e39c4bd69 100644 --- a/docs/src/developer-documentation/concepts/dsf/service-delegates.md +++ b/docs/src/developer-documentation/concepts/dsf/service-delegates.md @@ -5,15 +5,8 @@ icon: creative ### Service Delegates -Service Delegates are the Java representation of the [Service Tasks](../../concepts/bpmn/service-tasks.md) in your BPMN model. -You link a Service Delegate to a certain [Service Task](../../concepts/bpmn/service-tasks.md) by selecting the [Service Task](../../concepts/bpmn/service-tasks.md) -in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. -Make sure you use the fully qualified class name. Like this: +Service Delegates are the Java representation of the [Service Tasks](../../concepts/bpmn/service-tasks.md) in your BPMN model. You link a Service Delegate to a certain [Service Task](../../concepts/bpmn/service-tasks.md) by selecting the [Service Task](../../concepts/bpmn/service-tasks.md) in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: ``` org.package.myClass ``` -All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. -This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) -arrives at the [Service Task](../../concepts/bpmn/service-tasks.md) your Service Delegate is linked to. -The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. -You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). \ No newline at end of file +All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) arrives at the [Service Task](../../concepts/bpmn/service-tasks.md) your Service Delegate is linked to. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/spring-integration.md b/docs/src/developer-documentation/concepts/dsf/spring-integration.md index c49e9973f..74fe000f0 100644 --- a/docs/src/developer-documentation/concepts/dsf/spring-integration.md +++ b/docs/src/developer-documentation/concepts/dsf/spring-integration.md @@ -5,16 +5,10 @@ icon: creative ### Spring Integration -Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also -have to provide some Spring functionality. -When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you -have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): +Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also have to provide some Spring functionality. When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): - `AbstractTaskMessageSend` - `AbstractServiceDelegate` - `DefaultUserTaskListener` - `ProcessPluginDeploymentStateListener` -A [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) located in `spring/config` is expected to provide the Spring Beans. -For this tutorial, the `TutorialConfig` class will take this role. -If you are unfamiliar with the Spring Framework, you might want to check out the chapter [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) -of the Spring Framework documentation, specifically the topics [Using the @Bean Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/bean-annotation.html) and [Using the @Configuration Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html). \ No newline at end of file +A [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) located in `spring/config` is expected to provide the Spring Beans. For this tutorial, the `TutorialConfig` class will take this role. If you are unfamiliar with the Spring Framework, you might want to check out the chapter [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) of the Spring Framework documentation, specifically the topics [Using the @Bean Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/bean-annotation.html) and [Using the @Configuration Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md index ac7810b5e..06297175a 100644 --- a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md +++ b/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md @@ -13,8 +13,4 @@ In order for the DSF BPE server to load your plugin you need to provide it with * The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../../concepts/fhir/task.md) resources needed for messages specific to that BPMN model) * The Class holding your [Spring Configuration](../../concepts/dsf/spring-integration.md) -You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. -The DSF BPE server then searches for classes implementing this interface using the -Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. -For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, -has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file +You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. The DSF BPE server then searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md index b51904c0a..4a5bf5e1b 100644 --- a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md +++ b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md @@ -5,9 +5,7 @@ icon: creative ### ActivityDefinition -[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are -available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements -for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. +[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. The most important elements in ActivityDefinitions are: @@ -16,17 +14,10 @@ The most important elements in ActivityDefinitions are: - `requester` - `recipient` -The `message-name` element contains the name of the [BPMN message start event](../../concepts/bpmn/messaging.md#message-start-event) or -[BPMN message intermediate catching event](../../concepts/bpmn/messaging.md#message-intermediate-catching-event) which expects -a [Task](../../concepts/fhir/task.md) resource complying to the profile defined by `task-profile`. +The `message-name` element contains the name of the [BPMN message start event](../../concepts/bpmn/messaging.md#message-start-event) or [BPMN message intermediate catching event](../../concepts/bpmn/messaging.md#message-intermediate-catching-event) which expects a [Task](../../concepts/fhir/task.md) resource complying to the profile defined by `task-profile`. -The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message -specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. +The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. -You will have to create your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md) when developing a process plugin. -If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the -DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). -ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). -If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../../guides/creating-an-activity-definition.md). +You will have to create your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../../guides/creating-an-activity-definition.md). You can also find examples for all possible `requester` and `recipient` elements [here](../../concepts/dsf/examples-for-requester-and-recipient-elements.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/codesystem.md b/docs/src/developer-documentation/concepts/fhir/codesystem.md index 6e2bcc8cc..6787445c9 100644 --- a/docs/src/developer-documentation/concepts/fhir/codesystem.md +++ b/docs/src/developer-documentation/concepts/fhir/codesystem.md @@ -5,9 +5,7 @@ icon: creative ### CodeSystem -[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which -can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a -[ValueSet](../../concepts/fhir/valueset.md). +[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a [ValueSet](../../concepts/fhir/valueset.md). Plugin development for the DSF requires the use of [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) in two major ways: 1. Using existing [DSF CodeSystems](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem) in other FHIR resources like the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). diff --git a/docs/src/developer-documentation/concepts/fhir/introduction.md b/docs/src/developer-documentation/concepts/fhir/introduction.md index 16614fb74..19d3e9b23 100644 --- a/docs/src/developer-documentation/concepts/fhir/introduction.md +++ b/docs/src/developer-documentation/concepts/fhir/introduction.md @@ -5,8 +5,4 @@ icon: creative ## FHIR Introduction -The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. -The most important resources for plugin development are [ActivityDefinitions](../../concepts/fhir/activitydefinition.md), [Tasks](../../concepts/fhir/task.md), -[CodeSystems](../../concepts/fhir/codesystem.md) and [ValueSets](../../concepts/fhir/valueset.md). -There is also a catalogue of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official -DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). +The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](../../concepts/fhir/activitydefinition.md), [Tasks](../../concepts/fhir/task.md), [CodeSystems](../../concepts/fhir/codesystem.md) and [ValueSets](../../concepts/fhir/valueset.md). There is also a catalogue of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). diff --git a/docs/src/developer-documentation/concepts/fhir/task.md b/docs/src/developer-documentation/concepts/fhir/task.md index 573cb9028..85e6dab5e 100644 --- a/docs/src/developer-documentation/concepts/fhir/task.md +++ b/docs/src/developer-documentation/concepts/fhir/task.md @@ -5,12 +5,7 @@ icon: creative ### Task -The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. -Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource -based on parameters you set in the BPMN model and during execution. It will then -automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. -All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). -This profile includes a splicing for `Task.input` with three additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters): +The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource based on parameters you set in the BPMN model and during execution. It will then automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). This profile includes a splicing for `Task.input` with three additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters): - `message-name` - `business-key` - `correlation-key` @@ -19,9 +14,6 @@ When creating your own plugin, you will want to create your own profiles based o #### Task Input Parameters -Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. -For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same -way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](../../concepts/fhir/codesystem.md) and -including it in a [ValueSet](../../concepts/fhir/valueset.md) to be able to use it in the Task resource. +Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](../../concepts/fhir/codesystem.md) and including it in a [ValueSet](../../concepts/fhir/valueset.md) to be able to use it in the Task resource. If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/valueset.md b/docs/src/developer-documentation/concepts/fhir/valueset.md index d53f19990..918ec2ffe 100644 --- a/docs/src/developer-documentation/concepts/fhir/valueset.md +++ b/docs/src/developer-documentation/concepts/fhir/valueset.md @@ -5,8 +5,6 @@ icon: creative ### ValueSet -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](../../concepts/fhir/codesystem.md) to coded elements like -`code`, `Coding` or `CodeableConcept`. +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](../../concepts/fhir/codesystem.md) to coded elements like `code`, `Coding` or `CodeableConcept`. -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](../../concepts/fhir/codesystem.md) -in your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](../../concepts/fhir/codesystem.md) in your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md index 1a4410686..97e355c9f 100644 --- a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md +++ b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md @@ -5,10 +5,6 @@ icon: creative ### Accessing BPMN Process Variables -After creating a [Service Delegate](../concepts/dsf/service-delegates.md) or [Message Delegate](../concepts/dsf/message-delegates.md), you might want to -retrieve data from or store data in the [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). -You can achieve this either through the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) or via the `Variables` class. +After creating a [Service Delegate](../concepts/dsf/service-delegates.md) or [Message Delegate](../concepts/dsf/message-delegates.md), you might want to retrieve data from or store data in the [BPMN process variables](../concepts/dsf/bpmn-process-variables.md).You can achieve this either through the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) or via the `Variables` class. *It is very much recommended you use the latter method*. -The `Variables` class provides lots of utility methods to read or write certain types -of [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) -to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). +The `Variables` class provides lots of utility methods to read or write certain types of [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md index b40b2c31a..808b0fa4f 100644 --- a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md +++ b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md @@ -5,20 +5,8 @@ icon: creative ### Accessing Task Resources During Execution -If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will -provide methods which return certain kinds of [Task](../concepts/fhir/task.md) resources. The most commonly used ones are -the start [Task](../concepts/fhir/task.md), referring to the [Task](../concepts/fhir/task.md) / [Message Start Event](../concepts/bpmn/messaging.md#message-start-event) responsible for starting the process, -and the latest [Task](../concepts/fhir/task.md), referring to most recently received [Task](../concepts/fhir/task.md) / Message. -In principle, this is sufficient to access all information in a [Task](basic-concepts-and-guides.md#task) resource, since you have -the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. -Instead of navigating the [Task](../concepts/fhir/task.md) resource's element tree, -you should first try to use the [ProcessPluginApi's](../concepts/dsf/process-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class -offers specific methods related to [Task](../concepts/fhir/task.md) resources. -The most common use case for this is retrieving data from a [Task's](../concepts/fhir/task.md) [Input Parameter](../concepts/fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) -for a [Message Delegate's](../concepts/dsf/message-delegates.md) `getAdditionalInputParameters` method. -When retrieving data from a [Task's](../concepts/fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../concepts/fhir/task.md#task-input-parameters) you are looking to extract -data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to find the right one. The methods will try to match -the provided [CodeSystem](../concepts/fhir/codesystem.md) and Code to any [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of the provided [Task](../concepts/fhir/task.md) resource. -Depending on the method you chose you will for example receive all matches or just the first one. -To create new [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to attach to a [Task](../concepts/fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This -is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../concepts/dsf/message-delegates.md). \ No newline at end of file +If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../concepts/fhir/task.md) resources. The most commonly used ones are the start [Task](../concepts/fhir/task.md), referring to the [Task](../concepts/fhir/task.md) / [Message Start Event](../concepts/bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../concepts/fhir/task.md), referring to most recently received [Task](../concepts/fhir/task.md) / Message. +In principle, this is sufficient to access all information in a [Task](basic-concepts-and-guides.md#task) resource, since you have the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. +Instead of navigating the [Task](../concepts/fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../concepts/dsf/process-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../concepts/fhir/task.md) resources. +The most common use case for this is retrieving data from a [Task's](../concepts/fhir/task.md) [Input Parameter](../concepts/fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) for a [Message Delegate's](../concepts/dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../concepts/fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../concepts/fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../concepts/fhir/codesystem.md) and Code to any [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of the provided [Task](../concepts/fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. +To create new [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to attach to a [Task](../concepts/fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../concepts/dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md index c3bbf0a21..3fded3631 100644 --- a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md +++ b/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md @@ -5,20 +5,11 @@ icon: creative ### Adding Task Input Parameters to Task Profiles -When adding a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) to a [Task](../concepts/fhir/task.md) -profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part -of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own -FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists -like `Task.input` e.g. by only allowing the elements to be of certain types. For example, you -might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include -fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). -This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource -context. Our goal will be to add a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) -of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. - -Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined -on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. -As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). +When adding a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) to a [Task](../concepts/fhir/task.md) profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists like `Task.input` e.g. by only allowing the elements to be of certain types. +For example, you might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). +This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource context. Our goal will be to add a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. + +Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). The slicing for `Task.input` is defined in this part of the `baseDefinition`: ```xml <element id="Task.input"> @@ -42,12 +33,7 @@ The slicing for `Task.input` is defined in this part of the `baseDefinition`: ``` *The resource can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml)* -We will only need to take a look at the `discrimitator` tag for now. -Discriminators define the elements a FHIR processor needs to distinguish slices by. In our case, a processor -would look at the values for `type.coding.system` and `type.coding.code` to determine which -slice this element belongs to. The discriminator type `value` implies that `type.coding.system` and `type.coding.code` -have to be present in all slices and need to have a fixed value. -You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). +We will only need to take a look at the `discrimitator` tag for now. Discriminators define the elements a FHIR processor needs to distinguish slices by. In our case, a processor would look at the values for `type.coding.system` and `type.coding.code` to determine which slice this element belongs to. The discriminator type `value` implies that `type.coding.system` and `type.coding.code` have to be present in all slices and need to have a fixed value. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Let us revisit `task-start-dic-process.xml` and start adding a slice called `example-input` to it: ```xml @@ -64,17 +50,11 @@ Let us revisit `task-start-dic-process.xml` and start adding a slice called `exa </differential> </StructureDefinition> ``` -*Unnecessary elements for this guide are hidden by ... placeholders.* +*Irrelevant elements for this guide are hidden by ... placeholders.* -We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might -want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) -and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper -values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) -hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). +We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). -Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` -is a `CodeableConcept` which uses codings from a [ValueSet](../concepts/fhir/valueset.md), -the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: +Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` is a `CodeableConcept` which uses codings from a [ValueSet](../concepts/fhir/valueset.md), the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> ... @@ -96,12 +76,9 @@ the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) re </differential> </StructureDefinition> ``` -As you can see, we referenced a [ValueSet](../concepts/fhir/valueset.md) in this binding. -When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../concepts/fhir/valueset.md) resource or create a new -one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). +As you can see, we referenced a [ValueSet](../concepts/fhir/valueset.md) in this binding. When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../concepts/fhir/valueset.md) resource or create a new one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). -Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires -`Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: +Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires `Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> ... @@ -128,8 +105,7 @@ Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminat </StructureDefinition> ``` -In the beginning we mentioned how `Task.input.type.coding.system` and `Task.input.type.coding.code` -have to use fixed values. Here is how we accomplish this: +In the beginning we mentioned how `Task.input.type.coding.system` and `Task.input.type.coding.code` have to use fixed values. Here is how we accomplish this: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> @@ -168,11 +144,7 @@ have to use fixed values. Here is how we accomplish this: ``` *Notice that we also made the two elements mandatory because they are required by the discriminator.* -For the `type.coding.system` element we referenced a [CodeSystem](../concepts/fhir/codesystem.md). -The `type.coding.code` element uses a code from this [CodeSystem](../concepts/fhir/codesystem.md) called `example-input`. -This is the mechanism by which you actually "name" your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). The -`type.coding.code` value will identify your [Input Parameter](../concepts/fhir/task.md#task-input-parameters) when you use -it in an actual [Task](../concepts/fhir/task.md#task-input-parameters) resource. Here is how this would look like: +For the `type.coding.system` element we referenced a [CodeSystem](../concepts/fhir/codesystem.md). The `type.coding.code` element uses a code from this [CodeSystem](../concepts/fhir/codesystem.md) called `example-input`. This is the mechanism by which you actually "name" your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). The `type.coding.code` value will identify your [Input Parameter](../concepts/fhir/task.md#task-input-parameters) when you use it in an actual [Task](../concepts/fhir/task.md#task-input-parameters) resource. Here is how this would look like: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -189,12 +161,9 @@ it in an actual [Task](../concepts/fhir/task.md#task-input-parameters) resource. </Task> ``` -When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../concepts/fhir/codesystem.md) resource or create a new one to reference. -A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). +When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../concepts/fhir/codesystem.md) resource or create a new one to reference. A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). -`Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it -any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` -refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: +`Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> diff --git a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md index 320e12b31..983d7cdba 100644 --- a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md +++ b/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md @@ -5,8 +5,7 @@ icon: creative ### Configuring the Read Access Tag -To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../concepts/dsf/read-access-tag.md) -and choose one of the codes from it: +To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../concepts/dsf/read-access-tag.md) and choose one of the codes from it: ```xml <CodeSystem xmlns="http://hl7.org/fhir"> ... @@ -135,8 +134,7 @@ The most important part of it is the `differential` statement. It uses [element </StructureDefinition> ``` -All extensions for the [Read Access Tag](../concepts/dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through -the extension's `context` element: +All extensions for the [Read Access Tag](../concepts/dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through the extension's `context` element: ```xml <context> <type value="element" /> @@ -177,11 +175,7 @@ We will now go through the `differential` statement one element at a time, start </StructureDefinition> ``` -It defines a [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for the `Extension.extension` element, meaning we are dealing -with a nested extension. The `discriminator` element tells us that slices will be identified by the value of their `url` attribute. -A `rules` element with value `open` means other types of slices may be added later on e.g. when creating a profile. We do not have to -add any elements from here to the `meta.tag.extension` element. -Next up is the first slice called `parentOrganization`: +It defines a [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for the `Extension.extension` element, meaning we are dealing with a nested extension. The `discriminator` element tells us that slices will be identified by the value of their `url` attribute. A `rules` element with value `open` means other types of slices may be added later on e.g. when creating a profile. We do not have to add any elements from here to the `meta.tag.extension` element. Next up is the first slice called `parentOrganization`: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> @@ -219,10 +213,7 @@ Next up is the first slice called `parentOrganization`: </StructureDefinition> ``` -The first element defines a slice called `parentOrganization` on the `Extension.extension` element with cardinality `1..1`. -The second element defines the url attribute of the `parentOrganization` slice to be fixed to the value `parent-organization`. -With this information we can add the next element to `meta.tag`. Since it is defined on `Extension.extension` we will add it to -`meta.tag.extension.extension` like this: +The first element defines a slice called `parentOrganization` on the `Extension.extension` element with cardinality `1..1`. The second element defines the url attribute of the `parentOrganization` slice to be fixed to the value `parent-organization`. With this information we can add the next element to `meta.tag`. Since it is defined on `Extension.extension` we will add it to `meta.tag.extension.extension` like this: ```xml <meta> <tag> @@ -237,10 +228,7 @@ With this information we can add the next element to `meta.tag`. Since it is def </meta> ``` -After that, it defines `parentOrganization.value[x]` to occur at least once and have a type of `Identifier`. To turn this into an -element to add to `meta.tag.extension.extension` we have to replace `[x]` with our code in `value[x].type`, which in this case is `Identifier`. It is important -to note, that should the value in the code element be lowercase, you will have make it uppercase before replacement. In our case this means we will have a -`meta.tag.extension.extension.valueIdentifier` element: +After that, it defines `parentOrganization.value[x]` to occur at least once and have a type of `Identifier`. To turn this into an element to add to `meta.tag.extension.extension` we have to replace `[x]` with our code in `value[x].type`, which in this case is `Identifier`. It is important to note, that should the value in the code element be lowercase, you will have make it uppercase before replacement. In our case this means we will have a `meta.tag.extension.extension.valueIdentifier` element: ```xml <meta> <tag> @@ -257,11 +245,7 @@ to note, that should the value in the code element be lowercase, you will have m </meta> ``` -The last two elements define a `system` element with a fixed value and `value` element we can fill in on our own, since it does not have any constraints applied. Notice that -the element definition still uses `value[x].system` and `value[x].value`. The replacement mentioned earlier does not happen in -the element definition, but since `value[x]` is defined to have the type `Identifier` it is inferred that we mean to reference `Identifier.system` -and `Identifier.value`. -We will choose an arbitrary `Idenfier` value, but you should be using an actual organization identifier depending on who you want to allow read access to the resource. +The last two elements define a `system` element with a fixed value and `value` element we can fill in on our own, since it does not have any constraints applied. Notice that the element definition still uses `value[x].system` and `value[x].value`. The replacement mentioned earlier does not happen in the element definition, but since `value[x]` is defined to have the type `Identifier` it is inferred that we mean to reference `Identifier.system` and `Identifier.value`. We will choose an arbitrary `Idenfier` value, but you should be using an actual organization identifier depending on who you want to allow read access to the resource. ```xml <meta> @@ -360,9 +344,7 @@ Instead of `Identifier`, the `value[x]` element is now defined as a `Coding` typ </meta> ``` -A `Coding` has to belong to some [CodeSystem](../concepts/fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). -Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. -For demonstration purposes, we will be using the `DIC` role: +A `Coding` has to belong to some [CodeSystem](../concepts/fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. For demonstration purposes, we will be using the `DIC` role: ```xml <meta> <tag> @@ -405,8 +387,7 @@ Now we only have two elements left in the `differential` statement: </StructureDefinition> ``` -The `Extension.url` element tells us to add a url attribute to `meta.tag.extension`. The last element makes it so we must not -add a `meta.tag.extension.value[x]` element. This leaves us with this final Read Access Tag: +The `Extension.url` element tells us to add a url attribute to `meta.tag.extension`. The last element makes it so we must not add a `meta.tag.extension.value[x]` element. This leaves us with this final Read Access Tag: ```xml <meta> diff --git a/docs/src/developer-documentation/guides/creating-an-activity-definition.md b/docs/src/developer-documentation/guides/creating-an-activity-definition.md index be8a6ed68..f83c866bf 100644 --- a/docs/src/developer-documentation/guides/creating-an-activity-definition.md +++ b/docs/src/developer-documentation/guides/creating-an-activity-definition.md @@ -14,8 +14,7 @@ It is divided into steps for each of the main components of ActivityDefinitions: *Regular elements* are all elements not part of the first 3 main components. -*We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. -If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* +*We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* #### 1. Read Access Tag Let us start out with an empty [ActivityDefinition](../concepts/fhir/activitydefinition.md): @@ -25,9 +24,7 @@ Let us start out with an empty [ActivityDefinition](../concepts/fhir/activitydef </ActivityDefinition> ``` -The first element in DSF FHIR resources is always the [Read Access Tag](../concepts/dsf/read-access-tag.md). It describes who is -allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the -[Read Access Tag](../concepts/dsf/read-access-tag.md) in [this guide](../concepts/dsf/read-access-tag.md). In this case, we will allow read access to everyone: +The first element in DSF FHIR resources is always the [Read Access Tag](../concepts/dsf/read-access-tag.md). It describes who is allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the [Read Access Tag](../concepts/dsf/read-access-tag.md) in [this guide](../concepts/dsf/read-access-tag.md). In this case, we will allow read access to everyone: ```xml <ActivityDefinition xmlns="http://hl7.org/fhir"> @@ -41,13 +38,7 @@ allowed to read this resource through the DSF FHIR server's REST API. You can le ``` #### 2. Extension: Process Authorization -This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../concepts/fhir/task.md) resources) -for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../concepts/fhir/activitydefinition.md) -for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. -This includes the message starting your BPMN process initially. -You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). -Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the -value for the URL from the `Extension.url` element: +This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../concepts/fhir/task.md) resources) for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../concepts/fhir/activitydefinition.md) for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. This includes the message starting your BPMN process initially. You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the value for the URL from the `Extension.url` element: ```xml <ActivityDefinition xmlns="http://hl7.org/fhir"> ... @@ -58,8 +49,7 @@ value for the URL from the `Extension.url` element: ``` *Elements not relevant to the current component are hidden with ... to increase readability.* -The [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement -starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) for the `Extension.extension` element: +The [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) for the `Extension.extension` element: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> @@ -84,10 +74,7 @@ starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snap </StructureDefinition> ``` -The above states that whenever this extension is used in a profile, the profile needs to include this extension at least once (`<min value="1" />`). -The [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension` tells us that elements of this [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) -are identified by the value of their URL (`<discriminator>`), which is always the case for extensions, and that other extensions can be added to the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) (`<rules value="open" />`). -Since there is a [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension`, we are dealing with a nested extension. +The above states that whenever this extension is used in a profile, the profile needs to include this extension at least once (`<min value="1" />`). The [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension` tells us that elements of this [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) are identified by the value of their URL (`<discriminator>`), which is always the case for extensions, and that other extensions can be added to the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) (`<rules value="open" />`). Since there is a [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension`, we are dealing with a nested extension. After these initial element definitions come the elements relevant for your process plugin. The first one is the `message-name` slice: ```xml @@ -117,12 +104,7 @@ After these initial element definitions come the elements relevant for your proc </StructureDefinition> ``` -This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../concepts/fhir/activitydefinition.md). -The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. -Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, -FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. -FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. -This results in the following extension element we will add to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../concepts/fhir/activitydefinition.md). The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. This results in the following extension element we will add to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): ```xml <extension url="message-name"> <valueString value="myMessage"/> @@ -179,11 +161,7 @@ The next slice is called `task-profile`: </StructureDefinition> ``` -This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. -This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. -Canonical values referring to [Task](../concepts/fhir/task.md) profiles in ActivityDefinitions have to conform -to the rules outlined by the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls). -From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. Canonical values referring to [Task](../concepts/fhir/task.md) profiles in ActivityDefinitions have to conform to the rules outlined by the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls). From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): ```xml <extension url="task-profile"> <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> @@ -252,11 +230,7 @@ The next slice is `requester`: </differential> </StructureDefinition> ``` -Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) -for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also -have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../concepts/fhir/valueset.md). This is the -responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the -elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. +Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../concepts/fhir/valueset.md). This is the responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. Here is what they mean: - `local-all`: All local requests will be allowed. Local requests are identified by matching the requester's certificate to a thumbprint which was internally marked by the DSF FHIR server as belonging to a local organization. - `local-organization`: All local requests made from an organization with a specific `organization-identifier` will be allowed. @@ -266,12 +240,9 @@ Here is what they mean: can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml). This allows for more granularity when defining authorization rules within an organization and can be integrated into local user management via [OpenID Connect](https://dsf.dev/stable/maintain/fhir/access-control.html). -As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, -remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. -You can also find examples of all Codings from above [here](../concepts/dsf/examples-for-requester-and-recipient-elements.md). +As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. You can also find examples of all Codings from above [here](../concepts/dsf/examples-for-requester-and-recipient-elements.md). -It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../concepts/fhir/activitydefinition.md). -Let us start out by adding a `requester` element like we did for previous elements: +It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../concepts/fhir/activitydefinition.md). Let us start out by adding a `requester` element like we did for previous elements: ```xml <extension url="requester"> @@ -281,9 +252,7 @@ Let us start out by adding a `requester` element like we did for previous elemen </extension> ``` -We now have to look at the elements that are defined in one of the profiles to fill in the remaining elements since they are not defined by the `requester` extension. For demonstration -purposes, we will choose the [dsf-coding-process-authorization-local-organization-practitioner](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-practitioner-1.0.0.xml) profile. -Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4/datatypes.html#codesystem) are optional, we only have to look at the `differential` element from the profile we just selected: +We now have to look at the elements that are defined in one of the profiles to fill in the remaining elements since they are not defined by the `requester` extension. For demonstration purposes, we will choose the [dsf-coding-process-authorization-local-organization-practitioner](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-practitioner-1.0.0.xml) profile. Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4/datatypes.html#codesystem) are optional, we only have to look at the `differential` element from the profile we just selected: <a id="coding-differential"></a> ```xml <differential> @@ -319,9 +288,7 @@ Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4 </element> </differential> ``` -It defines an extension called `organization-practitioner` which is identified through its url attribute. Again, the extension -is only referenced, its location is in a different file. You can find it [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-organization-practitioner-1.0.0.xml). -Let us look at its `differential` element in the extension file to see how we need to populate the extension: +It defines an extension called `organization-practitioner` which is identified through its url attribute. Again, the extension is only referenced, its location is in a different file. You can find it [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-organization-practitioner-1.0.0.xml). Let us look at its `differential` element in the extension file to see how we need to populate the extension: ```xml <differential> <element id="Extension"> @@ -401,9 +368,7 @@ Let us look at its `differential` element in the extension file to see how we ne </differential> ``` -This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this -definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element -definitions from the Coding resource and adding everything to our [ActivityDefinition](../concepts/fhir/activitydefinition.md). +This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element definitions from the Coding resource and adding everything to our [ActivityDefinition](../concepts/fhir/activitydefinition.md). We will start with the `Extension.url` element, since the `Extension` element is the parent element for all slices on the `Extension.extension` elements: ```xml @@ -442,11 +407,7 @@ Finally, we will add the `practitionerRole` slice: </extension> ``` -Notice that there is no `binding` element specified for `practitionerRole.value[x]`. This is intentional. In the example we used a code from the -[dsf-practitioner-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml) CodeSystem. -This CodeSystem includes a standard set of codes which are often sufficient for DSF use cases. You can freely add other CodeSystems if you find these codes -do not apply for your use case. The code you set here can be used in the [DSF role config](https://dsf.dev/stable/maintain/fhir/access-control.html) -to allow certain users with this `practitioner-role` to send requests. +Notice that there is no `binding` element specified for `practitionerRole.value[x]`. This is intentional. In the example we used a code from the [dsf-practitioner-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml) CodeSystem. This CodeSystem includes a standard set of codes which are often sufficient for DSF use cases. You can freely add other CodeSystems if you find these codes do not apply for your use case. The code you set here can be used in the [DSF role config](https://dsf.dev/stable/maintain/fhir/access-control.html) to allow certain users with this `practitioner-role` to send requests. Working our way back up to the Coding we selected, we will now add the extension we just created as the `Coding.extension:organization-practitioner` element: ```xml @@ -469,8 +430,7 @@ Working our way back up to the Coding we selected, we will now add the extension </valueCoding> </extension> ``` -Now might be a good time to look at the [differential](#coding-differential) from the Coding again. -Our next elements to be added are `Coding.system` and `Coding.code`: +Now might be a good time to look at the [differential](#coding-differential) from the Coding again. Our next elements to be added are `Coding.system` and `Coding.code`: ```xml <extension url="requester"> <valueCoding> @@ -493,8 +453,7 @@ Our next elements to be added are `Coding.system` and `Coding.code`: </valueCoding> </extension> ``` -Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md) under -the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). +Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md) under the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). <details> <summary>This is how your ActivityDefinition should look like so far</summary> @@ -539,8 +498,7 @@ the [dsf-extension-process-authorization](https://github.com/datasharingframewor ``` </details> -Now we are back to looking at the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) again. -The last slice for this extension is `recipient`: +Now we are back to looking at the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) again. The last slice for this extension is `recipient`: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> ... @@ -574,13 +532,7 @@ The last slice for this extension is `recipient`: </StructureDefinition> ``` -The `recipient` will decide which DSF instance is allowed to process that message. That is the reason why you will not find any Codings for `remote` or `practitioner` here. -For `requester`, we already decided that we will only allow users with a certain role from our own (local) organization to send this message. -So now we will only allow the DSF instance run by that same local organization to process the message. The right Coding for this job is -the [coding-process-authorization-local-organization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-1.0.0.xml). -The configuration of a local requester and local receiver is often used for the message that starts up the first BPMN process of the plugin. -The process of adding the `recipient` slice is the exact same as it is for `requester`. You can follow the steps for the `requester` slice again -but just use a different Coding. +The `recipient` will decide which DSF instance is allowed to process that message. That is the reason why you will not find any Codings for `remote` or `practitioner` here. For `requester`, we already decided that we will only allow users with a certain role from our own (local) organization to send this message. So now we will only allow the DSF instance run by that same local organization to process the message. The right Coding for this job is the [coding-process-authorization-local-organization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-1.0.0.xml). The configuration of a local requester and local receiver is often used for the message that starts up the first BPMN process of the plugin. The process of adding the `recipient` slice is the exact same as it is for `requester`. You can follow the steps for the `requester` slice again but just use a different Coding. <details> <summary>Using the Coding we just decided on, this is how your ActivityDefinition should look like</summary> @@ -637,13 +589,11 @@ but just use a different Coding. ``` </details> -The last element defined in the [process authorization extension](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) -is `Extension.url`. But since we added this element at the very beginning of the working through the extension, we are finished with it here. +The last element defined in the [process authorization extension](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) is `Extension.url`. But since we added this element at the very beginning of the working through the extension, we are finished with it here. #### 3. BPE Managed Elements -Some elements of [ActivityDefinitions](../concepts/fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values -at appropriate times. +Some elements of [ActivityDefinitions](../concepts/fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values at appropriate times. The following elements are managed by the DSF BPE: - `ActivityDefinition.version` should use the [placeholder](../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) `#{version}` @@ -713,9 +663,7 @@ The following elements are managed by the DSF BPE: #### 4. Regular Elements -The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. -Check out the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` -must have the value `Task`. +The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. Check out the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` must have the value `Task`. All other elements can technically be omitted. Still, we recommend you include the following elements: - `AcitivityDefinition.name` - `AcitivityDefinition.title` diff --git a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md index 20b240875..d939acc41 100644 --- a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md +++ b/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md @@ -5,10 +5,7 @@ icon: creative ### Creating CodeSystems for DSF Processes -You might find yourself in a situation where you need to create a [CodeSystem](../concepts/fhir/codesystem.md). -For example, when defining the type of an [Input Parameter](../concepts/fhir/task.md#task-input-parameters). -[CodeSystems](../concepts/fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../concepts/fhir/codesystem.md) -in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: +You might find yourself in a situation where you need to create a [CodeSystem](../concepts/fhir/codesystem.md). For example, when defining the type of an [Input Parameter](../concepts/fhir/task.md#task-input-parameters). [CodeSystems](../concepts/fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../concepts/fhir/codesystem.md) in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: ```xml <CodeSystem xmlns="http://hl7.org/fhir"> <meta> @@ -40,8 +37,6 @@ in that some element's values are managed by the DSF BPE server. You can use the </concept> </CodeSystem> ``` -Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. -You can add as many codes as you like by defining more `concept` elements. +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. You can add as many codes as you like by defining more `concept` elements. -The DSF BPE server will read your [CodeSystem](../concepts/fhir/codesystem.md) from -`tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file +The DSF BPE server will read your [CodeSystem](../concepts/fhir/codesystem.md) from `tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md index 16ccbddd1..220b519dd 100644 --- a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md +++ b/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md @@ -5,49 +5,25 @@ icon: creative ### Creating Task Resources Based on a Definition -This short guide should help you understand how you can create [Task](../concepts/fhir/task.md) -resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). -We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help -with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant -views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). -As an example, we will create a [Task](../concepts/fhir/task.md) resource from the `task-start-dic-process.xml` profile. +This short guide should help you understand how you can create [Task](../concepts/fhir/task.md) resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). As an example, we will create a [Task](../concepts/fhir/task.md) resource from the `task-start-dic-process.xml` profile. #### 1st Step: Removing Placeholders -`task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, -you can either remove or comment these elements, so Forge does not try to perform type checking on them, which -would result in an error and Forge not loading the file. +`task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, you can either remove or comment these elements, so Forge does not try to perform type checking on them, which would result in an error and Forge not loading the file. #### 2nd Step: Differential Chain -If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our -case, we will want to aggregate the changes made to the base resource (in this case [Task](../concepts/fhir/task.md)) by all profiles to make -it more readable. -To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. -It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be -found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). -Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` -element, we are done with this chain. -In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. -It should look something like this: +If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our case, we will want to aggregate the changes made to the base resource (in this case [Task](../concepts/fhir/task.md)) by all profiles to make it more readable. To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: ![Forge overview](/photos/developer-documentation/forge_overview.png) #### 3rd Step: Building the Task Resource -We will now go through each element one by one and include it into our [Task](../concepts/fhir/task.md) -resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important -that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case -if we want a [Task](../concepts/fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). -But, placeholders should be used in [Draft Task Resources](../concepts/dsf/draft-task-resources.md) instead of actual values wherever possible, -since those are read by the DSF BPE server. This guide will create a [Task](../concepts/fhir/task.md) resource without placeholders. -We will start out with the base element for all [Task](../concepts/fhir/task.md) resources: +We will now go through each element one by one and include it into our [Task](../concepts/fhir/task.md) resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case if we want a [Task](../concepts/fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). But, placeholders should be used in [Draft Task Resources](../concepts/dsf/draft-task-resources.md) instead of actual values wherever possible, since those are read by the DSF BPE server. This guide will create a [Task](../concepts/fhir/task.md) resource without placeholders. We will start out with the base element for all [Task](../concepts/fhir/task.md) resources: ```xml <Task xmlns="http://hl7.org/fhir"> </Task> ``` -Before we start adding any elements listed in Forge's element tree, we have to include the `Task.meta.profile` element. -Its requirement cannot be seen here which is why we mention it specifically. This is the only instance you will not see -it in the element tree. It should look like this: +Before we start adding any elements listed in Forge's element tree, we have to include the `Task.meta.profile` element. Its requirement cannot be seen here which is why we mention it specifically. This is the only instance you will not see it in the element tree. It should look like this: ```xml <Task xmlns="http://hl7.org/fhir"> <meta> @@ -56,8 +32,7 @@ it in the element tree. It should look like this: </Task> ``` -The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we -will create an XML element with the same name and the value according to [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls): +The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we will create an XML element with the same name and the value according to [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls): ```xml <Task xmlns="http://hl7.org/fhir"> <meta> @@ -66,8 +41,7 @@ will create an XML element with the same name and the value according to [URLs]( <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> </Task> ``` -We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct -data type (e.g. proper coding value for elements with `coding` type). +We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct data type (e.g. proper coding value for elements with `coding` type). By now your [Task](../concepts/fhir/task.md) resources should look something like this: <details> @@ -142,13 +116,9 @@ Next, we will add the `identifier` element and its primitive sub-elements just l </requester> </Task> ``` -*Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed -to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including -the actual value for `Fixed value`.* +*Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including the actual value for `Fixed value`.* -You should now be able to fill out all elements in your [Task](../concepts/fhir/task.md) resource until you reach -the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../concepts/fhir/task.md) -resource should look something like this: +You should now be able to fill out all elements in your [Task](../concepts/fhir/task.md) resource until you reach the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../concepts/fhir/task.md) resource should look something like this: <details> <summary>Suggested solution</summary> @@ -182,13 +152,11 @@ resource should look something like this: </details> -[Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the -slice `message-name`: +[Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the slice `message-name`: ![Forge slice message name](/photos/developer-documentation/forge_slice_message_name.png) -If we were to continue including slices to the [Task](../concepts/fhir/task.md) resource like we did so far, -we would add a `message-name` element to our XML like this: +If we were to continue including slices to the [Task](../concepts/fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -201,14 +169,7 @@ we would add a `message-name` element to our XML like this: </Task> ``` -This approach however, would not work. FHIR processors do not use the name of the slice to map entries in -your [Task](../concepts/fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). -Discriminators define the elements a processor needs to distinguish slices by. You can see -how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor -would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which -slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` -are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). -All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: +This approach however, would not work. FHIR processors do not use the name of the slice to map entries in your [Task](../concepts/fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Discriminators define the elements a processor needs to distinguish slices by. You can see how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -225,8 +186,7 @@ All this means is that we effectively ignore the name of the slice as an element </Task> ``` -Now you should be able to add all remaining mandatory elements to your [Task](../concepts/fhir/task.md) -resource on your own. In the end, it should look something like this: +Now you should be able to add all remaining mandatory elements to your [Task](../concepts/fhir/task.md) resource on your own. In the end, it should look something like this: <details> <summary>Suggested solution</summary> diff --git a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md index b22e0e018..3e9398d41 100644 --- a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md +++ b/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md @@ -5,12 +5,7 @@ icon: creative ### Creating ValueSets for DSF Processes -You might find yourself in the situation where you need to create a [ValueSet](../concepts/fhir/valueset.md). -For example, when adding [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to DSF [Task](../concepts/fhir/task.md) -resources, you will also have to reference a [ValueSet](../concepts/fhir/valueset.md) resource in your -binding for `Task.input.type` to be able to set the type of your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). -[ValueSets](../concepts/fhir/valueset.md) for the DSF differ from regular [ValueSets](../concepts/fhir/valueset.md) -in that some element's values are managed by the DSF BPE server. You can use the following template for your +You might find yourself in the situation where you need to create a [ValueSet](../concepts/fhir/valueset.md). For example, when adding [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to DSF [Task](../concepts/fhir/task.md) resources, you will also have to reference a [ValueSet](../concepts/fhir/valueset.md) resource in your binding for `Task.input.type` to be able to set the type of your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). [ValueSets](../concepts/fhir/valueset.md) for the DSF differ from regular [ValueSets](../concepts/fhir/valueset.md) in that some element's values are managed by the DSF BPE server. You can use the following template for your [ValueSet](../concepts/fhir/valueset.md): ```xml <ValueSet xmlns="http://hl7.org/fhir"> @@ -41,11 +36,7 @@ in that some element's values are managed by the DSF BPE server. You can use the </compose> </ValueSet> ``` -Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. -The `compose` element defines the codes included in this [ValueSet](../concepts/fhir/valueset.md). -It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../concepts/fhir/codesystem.md) -and contains a list of `concept` elements which in turn contain the actual `code` element. -Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. The `compose` element defines the codes included in this [ValueSet](../concepts/fhir/valueset.md). It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../concepts/fhir/codesystem.md) and contains a list of `concept` elements which in turn contain the actual `code` element. Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: ```xml <ValueSet xmlns="http://hl7.org/fhir"> ... @@ -67,8 +58,6 @@ Using one code from `my-code-system` and one code from `my-other-code-system` wo </compose> </ValueSet> ``` -The DSF BPE server will read your [ValueSet](../concepts/fhir/valueset.md) from -`tutorial-process/src/main/resources/fhir/ValueSet`. +The DSF BPE server will read your [ValueSet](../concepts/fhir/valueset.md) from `tutorial-process/src/main/resources/fhir/ValueSet`. -You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) -on how to create [CodeSystems](../concepts/fhir/codesystem.md). \ No newline at end of file +You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) on how to create [CodeSystems](../concepts/fhir/codesystem.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md index 6a6c089ab..4a6f3a08d 100644 --- a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md +++ b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -5,17 +5,11 @@ icon: creative ### Managing Multiple Incoming Messages and Missing Messages -If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../concepts/fhir/task.md) may never arrive. -Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../concepts/fhir/task.md) resource from being posted to the DSF FHIR server. -This would result in stale process instances that never finish. +If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../concepts/fhir/task.md) may never arrive. Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../concepts/fhir/task.md) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. At the same time, you might also expect to receive one out of a number of different message types at once. -In order to solve both problems we can add an [Event Based Gateway](../concepts/bpmn/gateways.md#event-based-gateway) to the process waiting -for a response and then either handle a [Task](../concepts/fhir/task.md) resource with the response and finish the process in a success -state or trigger a [Timer Intermediate Catching Event](../concepts/bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. -The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages -or missing messages: +In order to solve both problems we can add an [Event Based Gateway](../concepts/bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../concepts/fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../concepts/bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: <picture> <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg"> diff --git a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md index 7b6490a42..d3d3961ee 100644 --- a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md +++ b/docs/src/developer-documentation/guides/setting-targets-for-message-events.md @@ -5,15 +5,10 @@ icon: creative ### Setting Targets for Message Events -Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. -You can find these values by visiting the DSF FHIR server's web interface. In the top right corner, click -the `Show Bookmarks` button, then select `Endpoint`. You will be taken to a list of all Endpoints available to the FHIR server. -There are two ways of adding `targets` to the BPMN execution variables: +Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. You can find these values by visiting the DSF FHIR server's web interface. In the top right corner, click the `Show Bookmarks` button, then select `Endpoint`. You will be taken to a list of all Endpoints available to the FHIR server. There are two ways of adding `targets` to the BPMN execution variables: #### 1. Adding the target in the message event implementation -In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, -add your targets and then call the super-method. +In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, add your targets and then call the super-method. #### 2. Adding the target in a service task right before the message event -This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one -since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../concepts/bpmn/service-tasks.md). +This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../concepts/bpmn/service-tasks.md). In both cases you can access methods to create and set `targets` through the `Variables` instance. diff --git a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md index 6bcd9db67..c16336561 100644 --- a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md +++ b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md @@ -5,30 +5,16 @@ icon: creative ### Starting a Process via Task Resources -To start a BPMN process, you need to create new a [Task](../concepts/fhir/task.md) resource in the DSF FHIR server -by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) -a resource for the first time. Also, remember that the [Task](../concepts/fhir/task.md) -resource you are sending needs to comply to the [Task](../concepts/fhir/task.md) profile of the process you -want to start and the [ActivityDefinition's](../concepts/fhir/activitydefinition.md) authorization rules. +To start a BPMN process, you need to create new a [Task](../concepts/fhir/task.md) resource in the DSF FHIR server by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) +a resource for the first time. Also, remember that the [Task](../concepts/fhir/task.md) resource you are sending needs to comply to the [Task](../concepts/fhir/task.md) profile of the process you want to start and the [ActivityDefinition's](../concepts/fhir/activitydefinition.md) authorization rules. There are two major ways of making this HTTP request: 1. Using cURL 2. Using the DSF FHIR server's web interface #### Using cURL -Using cURL probably isn't as "pretty", -but since cURL requires the actual [Task](../concepts/fhir/task.md) payload as an XML, it will prove useful to -gain more insight in how actual [Task](../concepts/fhir/task.md) resources look like and how they relate to -your [Task](../concepts/fhir/task.md) profiles and [ActivityDefinitions](../concepts/fhir/activitydefinition.md). You will have to create -an appropriate [Task](../concepts/fhir/task.md) resource for this. -There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. -You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), -or you can check the solution branches for this -file if you need ideas on how to fill it out properly. +In order to use cURL, you will have to create an appropriate [Task](../concepts/fhir/task.md) resource to post to the DSF FHIR server. There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), or you can check the solution branches for this file if you need ideas on how to fill it out properly. -Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the -instance you want to address. For this tutorial this is either one of `dic`, `cos` or `hrp`. [Certificates](../concepts/dsf/certificates.md) can be found in -`test-data-generator/cert`. Client [certificates](../concepts/dsf/certificates.md) and private keys can be found -in the folder of their respective instance e.g. `test-data-generator/cert/dic-client` for the `dic` instance. +Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the instance you want to address. ##### Linux: ```shell @@ -50,24 +36,8 @@ curl https://<instance-host-name>/fhir/Task ^ -H "Accept: application/fhir+xml" ^ -d @<path/to/example-task.xml> ``` -*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure -you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment -variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* +*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* #### Using the DSF FHIR Server's Web Interface -When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you -can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). -These [Task](../concepts/fhir/task.md) resources act like a template you can use to -instantiate [Task](../concepts/fhir/task.md) resources which start BPMN processes. -Instead of querying the DSF FHIR server manually, you can use a predefined bookmark -to navigate to the query URL. You can find a list of Bookmarks in the top right corner of -the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under -the `Task` section, and you will be taken to the list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). -Once there, you can select the one which starts your BPMN process. It will take you to a detailed view -of the resource where you will also have the chance to fill any [Task Input Parameters](../concepts/fhir/task.md#task-input-parameters) -you might need to specify. -If everything is filled out correctly, you may start your process by clicking `Start Process`. -Keep in mind that, for [Draft Task Resources](../concepts/dsf/draft-task-resources.md) to be -available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. -Take a look at [the Process Plugin Definition](../concepts/dsf/the-process-plugin-definition.md) if you need a reminder. \ No newline at end of file +When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). These [Task](../concepts/fhir/task.md) resources act like a template you can use to instantiate [Task](../concepts/fhir/task.md) resources which start BPMN processes. Instead of querying the DSF FHIR server manually, you can use a predefined bookmark to navigate to the query URL. You can find a list of Bookmarks in the top right corner of the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under the `Task` section, and you will be taken to the list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). Once there, you can select the one which starts your BPMN process. It will take you to a detailed view of the resource where you will also have the chance to fill any [Task Input Parameters](../concepts/fhir/task.md#task-input-parameters) you might need to specify. If everything is filled out correctly, you may start your process by clicking `Start Process`. Keep in mind that, for [Draft Task Resources](../concepts/dsf/draft-task-resources.md) to be available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. Take a look at [the Process Plugin Definition](../concepts/dsf/the-process-plugin-definition.md) if you need a reminder. \ No newline at end of file From ce885f95b9d825279aa0868d9c601bdf2966a842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Tue, 7 May 2024 13:43:22 +0200 Subject: [PATCH 04/42] Reverted --- docs/package-lock.json | 2 +- docs/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 6086762fb..846fb23bc 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -12,7 +12,7 @@ "@vuepress/bundler-vite": "2.0.0-rc.9", "sass-loader": "14.1.1", "vue": "3.4.21", - "vuepress": "^2.0.0-rc.9", + "vuepress": "2.0.0-rc.9", "vuepress-plugin-search-pro": "2.0.0-rc.32", "vuepress-theme-hope": "2.0.0-rc.32" }, diff --git a/docs/package.json b/docs/package.json index bcadeb134..4c911d911 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "@vuepress/bundler-vite": "2.0.0-rc.9", "sass-loader": "14.1.1", "vue": "3.4.21", - "vuepress": "^2.0.0-rc.9", + "vuepress": "2.0.0-rc.9", "vuepress-plugin-search-pro": "2.0.0-rc.32", "vuepress-theme-hope": "2.0.0-rc.32" }, From cafeee158eeabf981796b0d16a4682d496a23568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Tue, 7 May 2024 13:51:19 +0200 Subject: [PATCH 05/42] Renamed tutorial files --- ...e5_event_based_gateway.bpmn => event_based_gateway.bpmn} | 0 ...ise5_event_based_gateway.svg => event_based_gateway.svg} | 0 ...ateway_inverted.svg => event_based_gateway_inverted.svg} | 2 +- .../{exercise3_message_flow.bpmn => message_flow.bpmn} | 0 .../{exercise3_message_flow.svg => message_flow.svg} | 0 ..._message_flow_inverted.svg => message_flow_inverted.svg} | 2 +- docs/src/developer-documentation/concepts/bpmn/messaging.md | 2 +- ...naging-mutiple-incoming-messages-and-missing-messages.md | 6 +++--- 8 files changed, 6 insertions(+), 6 deletions(-) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise5_event_based_gateway.bpmn => event_based_gateway.bpmn} (100%) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise5_event_based_gateway.svg => event_based_gateway.svg} (100%) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise5_event_based_gateway_inverted.svg => event_based_gateway_inverted.svg} (99%) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise3_message_flow.bpmn => message_flow.bpmn} (100%) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise3_message_flow.svg => message_flow.svg} (100%) rename docs/src/.vuepress/public/photos/developer-documentation/{exercise3_message_flow_inverted.svg => message_flow_inverted.svg} (99%) diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.bpmn similarity index 100% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.bpmn rename to docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.bpmn diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg similarity index 100% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway.svg rename to docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg similarity index 99% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg rename to docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg index e7ad511b9..d278f7db6 100644 --- a/docs/src/.vuepress/public/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg +++ b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg @@ -11,7 +11,7 @@ viewBox="123 94 1073 372" version="1.1" id="svg417" - sodipodi:docname="exercise5_event_based_gateway_inverted.svg" + sodipodi:docname="event_based_gateway_inverted.svg" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> <metadata id="metadata421"> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn b/docs/src/.vuepress/public/photos/developer-documentation/message_flow.bpmn similarity index 100% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.bpmn rename to docs/src/.vuepress/public/photos/developer-documentation/message_flow.bpmn diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg b/docs/src/.vuepress/public/photos/developer-documentation/message_flow.svg similarity index 100% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow.svg rename to docs/src/.vuepress/public/photos/developer-documentation/message_flow.svg diff --git a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg b/docs/src/.vuepress/public/photos/developer-documentation/message_flow_inverted.svg similarity index 99% rename from docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg rename to docs/src/.vuepress/public/photos/developer-documentation/message_flow_inverted.svg index 267c4e969..a1c8b17bc 100644 --- a/docs/src/.vuepress/public/photos/developer-documentation/exercise3_message_flow_inverted.svg +++ b/docs/src/.vuepress/public/photos/developer-documentation/message_flow_inverted.svg @@ -11,7 +11,7 @@ viewBox="123 104 774 162" version="1.1" id="svg203" - sodipodi:docname="exercise3_message_flow_inverted.svg" + sodipodi:docname="message_flow_inverted.svg" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> <metadata id="metadata207"> diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/developer-documentation/concepts/bpmn/messaging.md index a8bec3071..fb6c455bd 100644 --- a/docs/src/developer-documentation/concepts/bpmn/messaging.md +++ b/docs/src/developer-documentation/concepts/bpmn/messaging.md @@ -8,7 +8,7 @@ icon: creative In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. -![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/exercise3_message_flow.svg) +![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/message_flow.svg) #### Message Start Event diff --git a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md index 4a6f3a08d..5cf1241df 100644 --- a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md +++ b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -12,7 +12,7 @@ At the same time, you might also expect to receive one out of a number of differ In order to solve both problems we can add an [Event Based Gateway](../concepts/bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../concepts/fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../concepts/bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: <picture> - <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/exercise5_event_based_gateway_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/exercise5_event_based_gateway.svg"> - <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/exercise5_event_based_gateway.svg"> + <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/event_based_gateway_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/event_based_gateway.svg"> + <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/event_based_gateway.svg"> </picture> From 478189bbc8902f51164831c3e7598f9bab0647e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Tue, 7 May 2024 14:05:52 +0200 Subject: [PATCH 06/42] Elevated camunda docs versions to 7.21. All links are working as of the time of this commit --- .../concepts/bpmn/conditions.md | 2 +- .../concepts/bpmn/gateways.md | 6 +++--- .../concepts/bpmn/intro.md | 2 +- .../concepts/bpmn/messaging.md | 10 +++++----- .../concepts/bpmn/service-tasks.md | 2 +- .../bpmn/timer-intermediate-catching-events.md | 2 +- .../concepts/dsf/bpmn-process-execution.md | 2 +- .../tutorial/exercise1-simpleProcess.md | 2 +- .../tutorial/exercise3-messageEvents.md | 8 ++++---- .../tutorial/exercise4-exclusiveGateways.md | 6 +++--- .../tutorial/exercise5-eventBasedGateways.md | 18 +++++++++--------- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/src/developer-documentation/concepts/bpmn/conditions.md b/docs/src/developer-documentation/concepts/bpmn/conditions.md index 5aa85f5e2..4ac23388d 100644 --- a/docs/src/developer-documentation/concepts/bpmn/conditions.md +++ b/docs/src/developer-documentation/concepts/bpmn/conditions.md @@ -5,4 +5,4 @@ icon: creative ### Conditions -[Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/). \ No newline at end of file +[Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/gateways.md b/docs/src/developer-documentation/concepts/bpmn/gateways.md index 083fbbb26..5b17a4205 100644 --- a/docs/src/developer-documentation/concepts/bpmn/gateways.md +++ b/docs/src/developer-documentation/concepts/bpmn/gateways.md @@ -5,12 +5,12 @@ icon: creative ### Gateways -[Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different types of gateways will be useful for different scenarios. +[Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different types of gateways will be useful for different scenarios. #### Exclusive Gateways -[Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.20/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](../../concepts/bpmn/conditions.md). +[Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](../../concepts/bpmn/conditions.md). #### Event-based Gateway -The [Event-based Gateway](https://docs.camunda.org/manual/7.20/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file +The [Event-based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/intro.md b/docs/src/developer-documentation/concepts/bpmn/intro.md index 2922e2b4b..aa901e9da 100644 --- a/docs/src/developer-documentation/concepts/bpmn/intro.md +++ b/docs/src/developer-documentation/concepts/bpmn/intro.md @@ -3,4 +3,4 @@ title: Introduction icon: creative --- -The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.20/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. \ No newline at end of file +The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/developer-documentation/concepts/bpmn/messaging.md index fb6c455bd..97d05703b 100644 --- a/docs/src/developer-documentation/concepts/bpmn/messaging.md +++ b/docs/src/developer-documentation/concepts/bpmn/messaging.md @@ -6,19 +6,19 @@ icon: creative ### Messaging -In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. +In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. ![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/message_flow.svg) #### Message Start Event -[Message Start Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-start-event) at the beginning of all of your BPMN models. +[Message Start Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) at the beginning of all of your BPMN models. #### Message Intermediate Throwing Event -[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) are used to send messages during process execution. +[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) are used to send messages during process execution. #### Message Intermediate Catching Event -[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). Use them whenever you expect to receive a message from another process or organization during execution. +[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). Use them whenever you expect to receive a message from another process or organization during execution. #### Message End Event -The [Message End Event](https://docs.camunda.org/manual/7.20/reference/bpmn20/events/message-events/#message-end-event) will stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file +The [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) will stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md index 50849d488..ebe8ad3c9 100644 --- a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md +++ b/docs/src/developer-documentation/concepts/bpmn/service-tasks.md @@ -5,4 +5,4 @@ icon: creative ### Service Tasks -One of the most common types of BPMN Tasks used for modeling DSF processes is the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/). They are different from regular BPMN Tasks in that they offer the ability to link an implementation to the [Service Task](https://docs.camunda.org/manual/7.20/reference/bpmn20/tasks/service-task/) which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages this engine to execute your BPMN processes. \ No newline at end of file +One of the most common types of BPMN Tasks used for modeling DSF processes is the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/). They are different from regular BPMN Tasks in that they offer the ability to link an implementation to the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/) which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages this engine to execute your BPMN processes. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md index c8e8b8ffc..bb4a0eb80 100644 --- a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md +++ b/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md @@ -5,4 +5,4 @@ icon: creative ### Timer Intermediate Catching Events -A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file +A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md index e9aea7a67..643f371fc 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md +++ b/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md @@ -6,4 +6,4 @@ icon: creative ### BPMN Process Execution -The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.20/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file +The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.21/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md b/docs/src/oldstable/tutorial/exercise1-simpleProcess.md index b50920c6c..79b0ff39e 100644 --- a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md +++ b/docs/src/oldstable/tutorial/exercise1-simpleProcess.md @@ -22,7 +22,7 @@ Java code for the `tutorial-process` project is located at `src/main/java`, FHIR The most imported Java class used to specify the process plugin for the DSF BPE server is a class that implements the `org.highmed.dsf.bpe.ProcessPluginDefinition` interface from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module. The DSF BPE server searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. For this tutorial the `TutorialProcessPluginDefinition` class implements this interface. It is appropriately specified in the `src/main/resources/META-INF/services/org.highmed.dsf.bpe`.ProcessPluginDefinition file. The `TutorialProcessPluginDefinition` class is used to specify name and version of the process plugin, what BPMN processes are to be deployed and what FHIR resources and required by the BPMN processes. For the implementation of service task and message events of the processes a special Spring context is used for every process plugin. The `TutorialProcessPluginDefinition` class specifies what via [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) with Spring Beans are used for the process plugin specific Spring Context. For this plugin the `TutorialConfig` cass is used to define Spring Beans. -The business process engine used by the DSF BPE server is based on the OpenSource Camunda Process Engine 7. In order to specify what Java code should be executed for a BPMN [ServiceTask](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/service-task/) you need to specify the fully-qualified Java class name in the ServiceTask inside the BPMN model. To be executable the Java class needs to extend the `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module and the class needs to be defined as as Spring Bean. +The business process engine used by the DSF BPE server is based on the OpenSource Camunda Process Engine 7. In order to specify what Java code should be executed for a BPMN [ServiceTask](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/) you need to specify the fully-qualified Java class name in the ServiceTask inside the BPMN model. To be executable the Java class needs to extend the `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module and the class needs to be defined as as Spring Bean. #### Process Execution and FHIR Task Resources diff --git a/docs/src/oldstable/tutorial/exercise3-messageEvents.md b/docs/src/oldstable/tutorial/exercise3-messageEvents.md index af6314b0f..09b5bbb1b 100644 --- a/docs/src/oldstable/tutorial/exercise3-messageEvents.md +++ b/docs/src/oldstable/tutorial/exercise3-messageEvents.md @@ -19,7 +19,7 @@ In order to exchange information between different processes, for example at two ![Message Flow](/photos/guideline/tutorial/ex3.png) -Every time message flow is used in a BPMN process for the DSF, a corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) profile needs to be specified for every interaction. This profile specifies which process should be started or continued and what the message name is when correlating the appropriate [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event) or [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event). A *Business Key* and a *Correlation Key* are specified if different process instances need to be linked to a single execution, for example to be able to send a message back. +Every time message flow is used in a BPMN process for the DSF, a corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) profile needs to be specified for every interaction. This profile specifies which process should be started or continued and what the message name is when correlating the appropriate [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) or [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event). A *Business Key* and a *Correlation Key* are specified if different process instances need to be linked to a single execution, for example to be able to send a message back. #### BPMN Process Definition Key vs. FHIR Task.instantiatesUri and ActivityDefinition.url / version @@ -48,7 +48,7 @@ The authorization extension needs to be configured at least once and has four su ##### message-name [1..1] -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. +String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. ##### task-profile [1..1] @@ -122,9 +122,9 @@ The following example specifies that process execution can only be requested by ### Exercise Tasks --- -1. Modify the ``highmedorg_helloDic`` process in the ``hello-dic.bpmn`` file and replace the [End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/none-events/#none-end-event) with a [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event). Configure input parameters ``instantiatesUri``, ``profile`` and ``messageName`` in the BPMN model for the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event). Set the message name of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) and configure it to be executed using the HelloCosMessage class. +1. Modify the ``highmedorg_helloDic`` process in the ``hello-dic.bpmn`` file and replace the [End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/none-events/#none-end-event) with a [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event). Configure input parameters ``instantiatesUri``, ``profile`` and ``messageName`` in the BPMN model for the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event). Set the message name of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) and configure it to be executed using the HelloCosMessage class. Use http://highmed.org/fhir/StructureDefinition/task-hello-cos|#{version} as the profile and ``helloCos`` as the message name. Figure out what the appropriate ``instantiatesUri`` value is, based on the name (process definition key) of the process to be triggered. -2. Modify the ``highmedorg_helloCos`` process in the ``hello-cos.bpmn`` file and configure the message name of the [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event) with the same value as the message name of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) in the ``highmedorg_helloDic`` process. +2. Modify the ``highmedorg_helloCos`` process in the ``hello-cos.bpmn`` file and configure the message name of the [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) with the same value as the message name of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) in the ``highmedorg_helloDic`` process. 3. Create a new [StructureDefinition](http://hl7.org/fhir/R4/structuredefinition.html) with a [Task](http://hl7.org/fhir/R4/task.html) profile for the ``helloCos`` message. 4. Create a new [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource for the ``highmedorg_helloCos`` process and configure the authorization extension to allow the ``Test_DIC`` organization as the requester and the ``Test_COS`` organization as the recipient. 5. Add the ``highmedorg_helloCos`` process and its resources to the ``TutorialProcessPluginDefinition`` class. diff --git a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md b/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md index e11e63562..ed344a25c 100644 --- a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md +++ b/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md @@ -11,11 +11,11 @@ Different execution paths in a process based on the state of process variables c --- #### Exclusive Gateways -Different sequence flows during the execution of a process instance can be modeled using BPMN [Exclusive Gateways](https://docs.camunda.org/manual/7.4/reference/bpmn20/gateways/exclusive-gateway/). For each outgoing sequence flow of the gateway, a BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) can be added to the process model, deciding whether a sequence flow should be followed. Thereby, all condition decisions must be in an XOR relationship to each other. +Different sequence flows during the execution of a process instance can be modeled using BPMN [Exclusive Gateways](https://docs.camunda.org/manual/7.4/reference/bpmn20/gateways/exclusive-gateway/). For each outgoing sequence flow of the gateway, a BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) can be added to the process model, deciding whether a sequence flow should be followed. Thereby, all condition decisions must be in an XOR relationship to each other. #### Condition Expressions -A BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) uses the ``${..}`` notation. Within the curly braces all execution variables of a process instance can be accessed, e.g. the ones that were stored in a previous Java implementation of a BPMN [ServiceTask](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/service-task/). For example, the BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) ``${cohortSize > 100}`` checks whether the value in the execution variable *cohortSize* is greater than 100. +A BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) uses the ``${..}`` notation. Within the curly braces all execution variables of a process instance can be accessed, e.g. the ones that were stored in a previous Java implementation of a BPMN [ServiceTask](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/). For example, the BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) ``${cohortSize > 100}`` checks whether the value in the execution variable *cohortSize* is greater than 100. #### Storing / Modifying Process Variables @@ -26,7 +26,7 @@ Via the ``DelegateExecution execution`` parameter of the ``doExecute`` method of boolean variable = (boolean) execution.getVariable("variable-name"); } ``` -For more details on process variables see the [Camunda documentation](https://docs.camunda.org/manual/7.17/user-guide/process-engine/variables/). +For more details on process variables see the [Camunda documentation](https://docs.camunda.org/manual/7.21/user-guide/process-engine/variables/). ### Exercise Tasks --- diff --git a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md b/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md index d6afe6d87..8370f1881 100644 --- a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md +++ b/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md @@ -14,13 +14,13 @@ In the final exercise we will look at message flow between three organizations a If an existing and started process instance is waiting for a message from another organization, the corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) may never arrive. Either because the other organization decides to never send the "message" or because some technical problem prohibits the [Task](http://hl7.org/fhir/R4/task.html) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. -In order to solve this problem we can add an [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/) to the process waiting for a response and then either handle a [Task](http://hl7.org/fhir/R4/task.html) resource with the response and finish the process in a success state or fire of an [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if two different message or no message could be received: +In order to solve this problem we can add an [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) to the process waiting for a response and then either handle a [Task](http://hl7.org/fhir/R4/task.html) resource with the response and finish the process in a success state or fire of an [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if two different message or no message could be received: ![](/photos/guideline/tutorial/ex5.png) ##### Timer Events -For [Timer Events](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/) the duration until the timer fires is specified using the [ISO 8601 Durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found in the [Camunda 7 documentation](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). +For [Timer Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/) the duration until the timer fires is specified using the [ISO 8601 Durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found in the [Camunda 7 documentation](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). #### Matching Process Instances With Business Keys @@ -36,7 +36,7 @@ The authorization extension needs to be configured at least once and has four su ##### message-name [1..1] -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. +String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. ##### task-profile [1..1] @@ -126,13 +126,13 @@ The following example specifies that process execution can only be requested by ### Exercise Tasks --- 1. Modify the ``HelloCosMessage`` and use the value from the [Task.input](http://hl7.org/fhir/R4/task.html) parameter of the ``helloDic`` [Task](http://hl7.org/fhir/R4/task.html) to send it to the ``highmedorg_helloCos`` process via a [Task.input](http://hl7.org/fhir/R4/task.html) parameter in the ``helloCos`` Task. Override the ``getAdditionalInputParameters`` to configure a [Task.input](http://hl7.org/fhir/R4/task.html) parameter to be send. -2. Modify the ``highmedorg_helloCos`` process to use a [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) to trigger the process in file ``hello-hrp.bpmn``. Figure out the values for the ``instantiatesUri``, ``profile`` and ``messageName`` input parameters of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. +2. Modify the ``highmedorg_helloCos`` process to use a [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) to trigger the process in file ``hello-hrp.bpmn``. Figure out the values for the ``instantiatesUri``, ``profile`` and ``messageName`` input parameters of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. 3. Modify the ``highmedorg_helloDic`` process: - - Change the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) to an [Intermediate Message Throw Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) - - Add an [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/) after the throw event - - Configure two cases for the [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/): - 1. An [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) to catch the ``goodbyDic`` message from the ``highmedorg_helloHrp`` process. - 2. An [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) to end the process if no message is sent by the ``highmedorg_helloHrp`` process after two minutes. Make sure both cases finish with a process [End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/none-events/). + - Change the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) to an [Intermediate Message Throw Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) + - Add an [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) after the throw event + - Configure two cases for the [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/): + 1. An [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) to catch the ``goodbyDic`` message from the ``highmedorg_helloHrp`` process. + 2. An [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) to end the process if no message is sent by the ``highmedorg_helloHrp`` process after two minutes. Make sure both cases finish with a process [End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/none-events/). 4. Modify the process in file ``hello-hrp.bpmn`` and set the process definition key and version. Figure out the appropriate values based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. 5. Add the process in file ``hello-hrp.bpmn`` to the ``TutorialProcessPluginDefinition`` and configure the FHIR resources needed for the three processes. 6. Add the ``HelloCos``, ``HelloHrpMessage`` , ``HelloHrp`` and ``GoodbyeDicMessage`` classes as spring beans. From a66ade29473dd7d343ccb3979a4a1ff1114a4928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Tue, 14 May 2024 09:31:27 +0200 Subject: [PATCH 07/42] Renamed outgoing gateway flows --- .../event_based_gateway.svg | 1215 ++++++++++++++++- .../event_based_gateway_inverted.svg | 129 +- 2 files changed, 1297 insertions(+), 47 deletions(-) diff --git a/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg index e4c6a2552..bf792cb6e 100644 --- a/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg +++ b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway.svg @@ -1,4 +1,1213 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- created with bpmn-js / http://bpmn.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" width="1073" height="372" viewBox="123 94 1073 372" version="1.1"><defs><marker id="sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="11" refY="10" markerWidth="10" markerHeight="10" orient="auto"><path d="M 1 5 L 11 10 L 1 15 Z" style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="8.5" refY="5" markerWidth="20" markerHeight="20" orient="auto"><path d="m 1 5 l 0 -3 l 7 3 l -7 3 z" style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;"/></marker><marker id="messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8" viewBox="0 0 20 20" refX="6" refY="6" markerWidth="20" markerHeight="20" orient="auto"><circle cx="6" cy="6" r="3.5" style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;"/></marker></defs><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_1u3es88" style="display: block;" transform="matrix(1 0 0 1 129 100)"><g class="djs-visual"><rect x="0" y="0" width="660" height="360" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,360 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)"><tspan x="140.9765625" y="18.6">Organization 1</tspan></text></g><rect x="-6" y="-6" width="672" height="372" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="660" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1vux1af" style="display: block;"><g class="djs-visual"><path d="m 215,177L270,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="215,177 270,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="209" y="171" width="67" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1i7hh0u" style="display: block;"><g class="djs-visual"><path d="m 370,177L422,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="370,177 422,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="364" y="171" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_19hvbdm" style="display: block;"><g class="djs-visual"><path d="m 575,177L632,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="575,177 632,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="569" y="171" width="69" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1pre2mk" style="display: block;"><g class="djs-visual"><path d="m 550,202L550,290 L632,290 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="550,202 550,290 632,290 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="544" y="196" width="94" height="100" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0fn66bz" style="display: block;"><g class="djs-visual"><path d="m 668,177L732,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,177 732,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="171" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1qeyly0" style="display: block;"><g class="djs-visual"><path d="m 668,290L732,290 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,290 732,290 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="284" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1cwt97i" style="display: block;"><g class="djs-visual"><path d="m 458,177L525,177 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="458,177 525,177 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="452" y="171" width="79" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1bf7gvl" style="display: block;"><g class="djs-visual"><path d="m 550,202L550,400 L632,400 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="550,202 550,400 632,400 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="544" y="196" width="94" height="210" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0u7wl2h" style="display: block;"><g class="djs-visual"><path d="m 668,400L732,400 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');"/></g><polyline points="668,400 732,400 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="662" y="394" width="76" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Activity_1qh9sf8" style="display: block;" transform="matrix(1 0 0 1 270 137)"><g class="djs-visual"><rect x="0" y="0" width="100" height="80" rx="10" ry="10" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;"><tspan x="32.65625" y="43.599999999999994">Task 1</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="100" height="80" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="112" height="92" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Gateway_0bsqjma" style="display: block;" transform="matrix(1 0 0 1 525 152)"><g class="djs-visual"><polygon points="25,0 50,25 25,50 0,25" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><circle cx="25" cy="25" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><circle cx="25" cy="25" r="12" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 18,22 7.363636363636364,-4.909090909090909 7.363636363636364,4.909090909090909 -2.4545454545454546,9.818181818181818 -9.818181818181818,0 z" style="fill: none; stroke-width: 2px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="50" height="50" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="62" height="62" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0qbztd3" style="display: block;" transform="matrix(1 0 0 1 632 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1pwd0kq" style="display: block;" transform="matrix(1 0 0 1 732 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1voo3le" style="display: block;" transform="matrix(1 0 0 1 732 272)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1ndrm5j" style="display: block;" transform="matrix(1 0 0 1 422 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: black; stroke-width: 1px; stroke: white;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_0pq5qbd" style="display: block;" transform="matrix(1 0 0 1 632 272)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_18u9tw6" style="display: block;" transform="matrix(1 0 0 1 632 382)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;"/><circle cx="18" cy="18" r="15" style="stroke: black; stroke-width: 1px; fill: none;"/><circle cx="18" cy="18" r="11" style="stroke: black; stroke-width: 2px; fill: white;"/><path d="M 18,18 l 2.25,-7.5 m -2.25,7.5 l 5.25,1.5 " style="fill: none; stroke-width: 2px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(0,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(30,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(60,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(90,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(120,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(150,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(180,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(210,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(240,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(270,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(300,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/><path d="M 18,18 m 0,7.5 l -0,2.25 " transform="rotate(330,18,18)" style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1uh09e9" style="display: block;" transform="matrix(1 0 0 1 732 382)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1uh09e9_label" style="display: block;" transform="matrix(1 0 0 1 733 425)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Failure</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="34" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="46" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="StartEvent_1" style="display: block;" transform="matrix(1 0 0 1 179 159)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><path d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" style="fill: white; stroke-width: 1px; stroke: black;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1pwd0kq_label" style="display: block;" transform="matrix(1 0 0 1 729 202)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Option A</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="44" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="56" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Event_1voo3le_label" style="display: block;" transform="matrix(1 0 0 1 729 315)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;"><tspan x="0" y="9.899999999999999">Option B</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="43" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" width="55" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Participant_0h427kw" style="display: block;" transform="matrix(1 0 0 1 890 100)"><g class="djs-visual"><rect x="0" y="0" width="300" height="360" rx="0" ry="0" style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><polyline points="30,0 30,360 " style="fill: none; stroke: black; stroke-width: 2px;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)"><tspan x="140.9765625" y="18.6">Organization 2</tspan></text></g><rect x="-6" y="-6" width="312" height="372" class="djs-outline" style="fill: none;"/><rect class="djs-hit djs-hit-click-stroke" x="0" y="0" width="300" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect class="djs-hit djs-hit-all" x="0" y="0" width="30" height="360" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/></g><g class="djs-children"/></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0sswg90" style="display: block;"><g class="djs-visual"><path d="m 440,159L440,130 L890,130 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="440,159 440,130 890,130 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="434" y="124" width="462" height="41" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_1wjv8rh" style="display: block;"><g class="djs-visual"><path d="m 890,230L650,230 L650,195 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="890,230 650,230 650,195 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="644" y="189" width="252" height="47" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="Flow_0j7hwxl" style="display: block;"><g class="djs-visual"><path d="m 890,340L650,340 L650,308 " style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;"/></g><polyline points="890,340 650,340 650,308 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="644" y="302" width="252" height="44" class="djs-outline" style="fill: none;"/></g></g></svg> \ No newline at end of file + +<svg + width="1073" + height="372" + viewBox="123 94 1073 372" + version="1.1" + id="svg100" + sodipodi:docname="event_based_gateway.svg" + inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview100" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="2.8495151" + inkscape:cx="570.44793" + inkscape:cy="262.32533" + inkscape:window-width="1920" + inkscape:window-height="1121" + inkscape:window-x="-7" + inkscape:window-y="1613" + inkscape:window-maximized="1" + inkscape:current-layer="g79" /> + <defs + id="defs2"> + <marker + id="sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="11" + refY="10" + markerWidth="10" + markerHeight="10" + orient="auto"> + <path + d="M 1 5 L 11 10 L 1 15 Z" + style="fill: black; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="path1" /> + </marker> + <marker + id="messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="8.5" + refY="5" + markerWidth="20" + markerHeight="20" + orient="auto"> + <path + d="m 1 5 l 0 -3 l 7 3 l -7 3 z" + style="fill: white; stroke-width: 1px; stroke-linecap: butt; stroke-dasharray: 10000, 1; stroke: black;" + id="path2" /> + </marker> + <marker + id="messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8" + viewBox="0 0 20 20" + refX="6" + refY="6" + markerWidth="20" + markerHeight="20" + orient="auto"> + <circle + cx="6" + cy="6" + r="3.5" + style="fill: white; stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: black;" + id="circle2" /> + </marker> + </defs> + <g + class="djs-group" + id="g80"> + <g + class="djs-element djs-shape" + data-element-id="Participant_1u3es88" + style="display: block;" + transform="matrix(1 0 0 1 129 100)" + id="g5"> + <g + class="djs-visual" + id="g2"> + <rect + x="0" + y="0" + width="660" + height="360" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect2" /> + <polyline + points="30,0 30,360 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline2" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)" + id="text2"><tspan + x="140.9765625" + y="18.6" + id="tspan2">Organization 1</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="672" + height="372" + class="djs-outline" + style="fill: none;" + id="rect3" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="660" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect4" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect5" /> + </g> + <g + class="djs-children" + id="g79"> + <g + class="djs-group" + id="g8"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1vux1af" + style="display: block;" + id="g7"> + <g + class="djs-visual" + id="g6"> + <path + d="m 215,177L270,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path5" /> + </g> + <polyline + points="215,177 270,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline6" /> + <rect + x="209" + y="171" + width="67" + height="12" + class="djs-outline" + style="fill: none;" + id="rect6" /> + </g> + </g> + <g + class="djs-group" + id="g11"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1i7hh0u" + style="display: block;" + id="g10"> + <g + class="djs-visual" + id="g9"> + <path + d="m 370,177L422,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path8" /> + </g> + <polyline + points="370,177 422,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline9" /> + <rect + x="364" + y="171" + width="64" + height="12" + class="djs-outline" + style="fill: none;" + id="rect9" /> + </g> + </g> + <g + class="djs-group" + id="g14"> + <g + class="djs-element djs-connection" + data-element-id="Flow_19hvbdm" + style="display: block;" + id="g13"> + <g + class="djs-visual" + id="g12"> + <path + d="m 575,177L632,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path11" /> + </g> + <polyline + points="575,177 632,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline12" /> + <rect + x="569" + y="171" + width="69" + height="12" + class="djs-outline" + style="fill: none;" + id="rect12" /> + </g> + </g> + <g + class="djs-group" + id="g17"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1pre2mk" + style="display: block;" + id="g16"> + <g + class="djs-visual" + id="g15"> + <path + d="m 550,202L550,290 L632,290 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path14" /> + </g> + <polyline + points="550,202 550,290 632,290 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline15" /> + <rect + x="544" + y="196" + width="94" + height="100" + class="djs-outline" + style="fill: none;" + id="rect15" /> + </g> + </g> + <g + class="djs-group" + id="g20"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0fn66bz" + style="display: block;" + id="g19"> + <g + class="djs-visual" + id="g18"> + <path + d="m 668,177L732,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path17" /> + </g> + <polyline + points="668,177 732,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline18" /> + <rect + x="662" + y="171" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect18" /> + </g> + </g> + <g + class="djs-group" + id="g23"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1qeyly0" + style="display: block;" + id="g22"> + <g + class="djs-visual" + id="g21"> + <path + d="m 668,290L732,290 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path20" /> + </g> + <polyline + points="668,290 732,290 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline21" /> + <rect + x="662" + y="284" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect21" /> + </g> + </g> + <g + class="djs-group" + id="g26"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1cwt97i" + style="display: block;" + id="g25"> + <g + class="djs-visual" + id="g24"> + <path + d="m 458,177L525,177 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path23" /> + </g> + <polyline + points="458,177 525,177 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline24" /> + <rect + x="452" + y="171" + width="79" + height="12" + class="djs-outline" + style="fill: none;" + id="rect24" /> + </g> + </g> + <g + class="djs-group" + id="g29"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1bf7gvl" + style="display: block;" + id="g28"> + <g + class="djs-visual" + id="g27"> + <path + d="m 550,202L550,400 L632,400 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path26" /> + </g> + <polyline + points="550,202 550,400 632,400 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline27" /> + <rect + x="544" + y="196" + width="94" + height="210" + class="djs-outline" + style="fill: none;" + id="rect27" /> + </g> + </g> + <g + class="djs-group" + id="g32"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0u7wl2h" + style="display: block;" + id="g31"> + <g + class="djs-visual" + id="g30"> + <path + d="m 668,400L732,400 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8');" + id="path29" /> + </g> + <polyline + points="668,400 732,400 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline30" /> + <rect + x="662" + y="394" + width="76" + height="12" + class="djs-outline" + style="fill: none;" + id="rect30" /> + </g> + </g> + <g + class="djs-group" + id="g35"> + <g + class="djs-element djs-shape" + data-element-id="Activity_1qh9sf8" + style="display: block;" + transform="matrix(1 0 0 1 270 137)" + id="g34"> + <g + class="djs-visual" + id="g33"> + <rect + x="0" + y="0" + width="100" + height="80" + rx="10" + ry="10" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect32" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + id="text32"><tspan + x="32.65625" + y="43.599999999999994" + id="tspan32">Task 1</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="100" + height="80" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect33" /> + <rect + x="-6" + y="-6" + width="112" + height="92" + class="djs-outline" + style="fill: none;" + id="rect34" /> + </g> + </g> + <g + class="djs-group" + id="g38"> + <g + class="djs-element djs-shape" + data-element-id="Gateway_0bsqjma" + style="display: block;" + transform="matrix(1 0 0 1 525 152)" + id="g37"> + <g + class="djs-visual" + id="g36"> + <polygon + points="25,0 50,25 25,50 0,25" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="polygon35" /> + <circle + cx="25" + cy="25" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle35" /> + <circle + cx="25" + cy="25" + r="12" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle36" /> + <path + d="m 18,22 7.363636363636364,-4.909090909090909 7.363636363636364,4.909090909090909 -2.4545454545454546,9.818181818181818 -9.818181818181818,0 z" + style="fill: none; stroke-width: 2px; stroke: black;" + id="path36" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="50" + height="50" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect36" /> + <rect + x="-6" + y="-6" + width="62" + height="62" + class="djs-outline" + style="fill: none;" + id="rect37" /> + </g> + </g> + <g + class="djs-group" + id="g41"> + <g + class="djs-element djs-shape" + data-element-id="Event_0qbztd3" + style="display: block;" + transform="matrix(1 0 0 1 632 159)" + id="g40"> + <g + class="djs-visual" + id="g39"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle38" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle39" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path39" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect39" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect40" /> + </g> + </g> + <g + class="djs-group" + id="g44"> + <g + class="djs-element djs-shape" + data-element-id="Event_1pwd0kq" + style="display: block;" + transform="matrix(1 0 0 1 732 159)" + id="g43"> + <g + class="djs-visual" + id="g42"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle41" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect42" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect43" /> + </g> + </g> + <g + class="djs-group" + id="g47"> + <g + class="djs-element djs-shape" + data-element-id="Event_1voo3le" + style="display: block;" + transform="matrix(1 0 0 1 732 272)" + id="g46"> + <g + class="djs-visual" + id="g45"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle44" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect45" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect46" /> + </g> + </g> + <g + class="djs-group" + id="g50"> + <g + class="djs-element djs-shape" + data-element-id="Event_1ndrm5j" + style="display: block;" + transform="matrix(1 0 0 1 422 159)" + id="g49"> + <g + class="djs-visual" + id="g48"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle47" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle48" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: black; stroke-width: 1px; stroke: white;" + id="path48" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect48" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect49" /> + </g> + </g> + <g + class="djs-group" + id="g53"> + <g + class="djs-element djs-shape" + data-element-id="Event_0pq5qbd" + style="display: block;" + transform="matrix(1 0 0 1 632 272)" + id="g52"> + <g + class="djs-visual" + id="g51"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle50" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle51" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path51" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect51" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect52" /> + </g> + </g> + <g + class="djs-group" + id="g69"> + <g + class="djs-element djs-shape" + data-element-id="Event_18u9tw6" + style="display: block;" + transform="matrix(1 0 0 1 632 382)" + id="g68"> + <g + class="djs-visual" + id="g67"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 1px; fill: white; fill-opacity: 0.95;" + id="circle53" /> + <circle + cx="18" + cy="18" + r="15" + style="stroke: black; stroke-width: 1px; fill: none;" + id="circle54" /> + <circle + cx="18" + cy="18" + r="11" + style="stroke: black; stroke-width: 2px; fill: white;" + id="circle55" /> + <path + d="M 18,18 l 2.25,-7.5 m -2.25,7.5 l 5.25,1.5 " + style="fill: none; stroke-width: 2px; stroke: black; stroke-linecap: square;" + id="path55" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(0,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path56" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(30,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path57" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(60,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path58" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(90,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path59" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(120,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path60" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(150,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path61" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(180,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path62" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(210,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path63" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(240,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path64" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(270,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path65" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(300,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path66" /> + <path + d="M 18,18 m 0,7.5 l -0,2.25 " + transform="rotate(330,18,18)" + style="fill: none; stroke-width: 1px; stroke: black; stroke-linecap: square;" + id="path67" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect67" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect68" /> + </g> + </g> + <g + class="djs-group" + id="g72"> + <g + class="djs-element djs-shape" + data-element-id="Event_1uh09e9" + style="display: block;" + transform="matrix(1 0 0 1 732 382)" + id="g71"> + <g + class="djs-visual" + id="g70"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 4px; fill: white; fill-opacity: 0.95;" + id="circle69" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect70" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect71" /> + </g> + </g> + <g + class="djs-group" + id="g75"> + <g + class="djs-element djs-shape" + data-element-id="Event_1uh09e9_label" + style="display: block;" + transform="matrix(1 0 0 1 733 425)" + id="g74"> + <g + class="djs-visual" + id="g73"> + <text + lineHeight="1.2" + class="djs-label" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text72" + x="-3.5093689" + y="8.4224854"><tspan + sodipodi:role="line" + id="tspan102" + x="-3.5093689" + y="8.4224854">Timeout</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="34" + height="14" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect73" /> + <rect + x="-6" + y="-6" + width="46" + height="26" + class="djs-outline" + style="fill: none;" + id="rect74" /> + </g> + </g> + <g + class="djs-group" + id="g78"> + <g + class="djs-element djs-shape" + data-element-id="StartEvent_1" + style="display: block;" + transform="matrix(1 0 0 1 179 159)" + id="g77"> + <g + class="djs-visual" + id="g76"> + <circle + cx="18" + cy="18" + r="18" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="circle75" /> + <path + d="m 8.459999999999999,11.34 l 0,12.6 l 18.900000000000002,0 l 0,-12.6 z l 9.450000000000001,5.4 l 9.450000000000001,-5.4" + style="fill: white; stroke-width: 1px; stroke: black;" + id="path75" /> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="36" + height="36" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect76" /> + <rect + x="-6" + y="-6" + width="48" + height="48" + class="djs-outline" + style="fill: none;" + id="rect77" /> + </g> + </g> + </g> + </g> + <g + class="djs-group" + id="g83" + transform="translate(-2.1056214,-0.3509369)"> + <g + class="djs-element djs-shape" + data-element-id="Event_1pwd0kq_label" + style="display:block" + transform="translate(729,202)" + id="g82"> + <g + class="djs-visual" + id="g81"> + <text + lineHeight="1.2" + class="djs-label" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text80" + inkscape:label="text80" + x="1.4037476" + y="9.8262329"><tspan + sodipodi:role="line" + id="tspan100" + x="1.4037476" + y="9.8262329">Success</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="44" + height="14" + style="fill:none;stroke:#ffffff;stroke-width:15px;stroke-opacity:0" + id="rect81" /> + <rect + x="-6" + y="-6" + width="56" + height="26" + class="djs-outline" + style="fill:none" + id="rect82" /> + </g> + </g> + <g + class="djs-group" + id="g86" + transform="translate(-0.7018738,-1.0528107)"> + <g + class="djs-element djs-shape" + data-element-id="Event_1voo3le_label" + style="display:block" + transform="translate(729,315)" + id="g85"> + <g + class="djs-visual" + id="g84"> + <text + lineHeight="1.2" + class="djs-label" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text83" + x="4.5621796" + y="12.282791"><tspan + sodipodi:role="line" + id="tspan101" + x="4.5621796" + y="12.282791">Failure</tspan></text> + </g> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="43" + height="14" + style="fill:none;stroke:#ffffff;stroke-width:15px;stroke-opacity:0" + id="rect84" /> + <rect + x="-6" + y="-6" + width="55" + height="26" + class="djs-outline" + style="fill:none" + id="rect85" /> + </g> + </g> + <g + class="djs-group" + id="g91"> + <g + class="djs-element djs-shape" + data-element-id="Participant_0h427kw" + style="display: block;" + transform="matrix(1 0 0 1 890 100)" + id="g89"> + <g + class="djs-visual" + id="g87"> + <rect + x="0" + y="0" + width="300" + height="360" + rx="0" + ry="0" + style="stroke: black; stroke-width: 2px; fill: white; fill-opacity: 0.95;" + id="rect86" /> + <polyline + points="30,0 30,360 " + style="fill: none; stroke: black; stroke-width: 2px;" + id="polyline86" /> + <text + lineHeight="1.2" + class="djs-label" + style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: black;" + transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 0 360)" + id="text86"><tspan + x="140.9765625" + y="18.6" + id="tspan86">Organization 2</tspan></text> + </g> + <rect + x="-6" + y="-6" + width="312" + height="372" + class="djs-outline" + style="fill: none;" + id="rect87" /> + <rect + class="djs-hit djs-hit-click-stroke" + x="0" + y="0" + width="300" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect88" /> + <rect + class="djs-hit djs-hit-all" + x="0" + y="0" + width="30" + height="360" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="rect89" /> + </g> + <g + class="djs-children" + id="g90" /> + </g> + <g + class="djs-group" + id="g94"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0sswg90" + style="display: block;" + id="g93"> + <g + class="djs-visual" + id="g92"> + <path + d="m 440,159L440,130 L890,130 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path91" /> + </g> + <polyline + points="440,159 440,130 890,130 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline92" /> + <rect + x="434" + y="124" + width="462" + height="41" + class="djs-outline" + style="fill: none;" + id="rect92" /> + </g> + </g> + <g + class="djs-group" + id="g97"> + <g + class="djs-element djs-connection" + data-element-id="Flow_1wjv8rh" + style="display: block;" + id="g96"> + <g + class="djs-visual" + id="g95"> + <path + d="m 890,230L650,230 L650,195 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path94" /> + </g> + <polyline + points="890,230 650,230 650,195 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline95" /> + <rect + x="644" + y="189" + width="252" + height="47" + class="djs-outline" + style="fill: none;" + id="rect95" /> + </g> + </g> + <g + class="djs-group" + id="g100"> + <g + class="djs-element djs-connection" + data-element-id="Flow_0j7hwxl" + style="display: block;" + id="g99"> + <g + class="djs-visual" + id="g98"> + <path + d="m 890,340L650,340 L650,308 " + style="fill: none; stroke-width: 1.5px; stroke: black; marker-end: url('#messageflow-end-white-black-att51rfxz5xb2bplwaj1r4xi8'); marker-start: url('#messageflow-start-white-black-att51rfxz5xb2bplwaj1r4xi8'); stroke-dasharray: 10, 12; stroke-linecap: round; stroke-linejoin: round;" + id="path97" /> + </g> + <polyline + points="890,340 650,340 650,308 " + class="djs-hit djs-hit-stroke" + style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;" + id="polyline98" /> + <rect + x="644" + y="302" + width="252" + height="44" + class="djs-outline" + style="fill: none;" + id="rect98" /> + </g> + </g> +</svg> diff --git a/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg index d278f7db6..75e269ffe 100644 --- a/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg +++ b/docs/src/.vuepress/public/photos/developer-documentation/event_based_gateway_inverted.svg @@ -1,18 +1,19 @@ <?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="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="1073" - height="372" - viewBox="123 94 1073 372" - version="1.1" - id="svg417" - sodipodi:docname="event_based_gateway_inverted.svg" - inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + width="1073" + height="372" + viewBox="123 94 1073 372" + version="1.1" + id="svg417" + sodipodi:docname="event_based_gateway_inverted.svg" + inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> <metadata id="metadata421"> <rdf:RDF> @@ -21,7 +22,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -34,17 +35,20 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="3840" - inkscape:window-height="2081" + inkscape:window-width="1920" + inkscape:window-height="1121" id="namedview419" showgrid="false" - inkscape:zoom="1.1239515" - inkscape:cx="536.5" - inkscape:cy="186" - inkscape:window-x="-9" - inkscape:window-y="-9" + inkscape:zoom="2.247903" + inkscape:cx="595.44384" + inkscape:cy="249.78836" + inkscape:window-x="-7" + inkscape:window-y="1613" inkscape:window-maximized="1" - inkscape:current-layer="svg417" /> + inkscape:current-layer="g327" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> <defs id="defs11"> <marker @@ -91,7 +95,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1604"> + id="filter1604" + x="-0.005952381" + y="0" + width="1.0059533" + height="1.0340909"> <feColorMatrix type="hueRotate" values="180" @@ -105,7 +113,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1610"> + id="filter1610" + x="-0.005952381" + y="0" + width="1.0059533" + height="1.0319149"> <feColorMatrix type="hueRotate" values="180" @@ -119,7 +131,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1616"> + id="filter1616" + x="-0.0032467532" + y="-0.036585366" + width="1.0032468" + height="1.0365912"> <feColorMatrix type="hueRotate" values="180" @@ -133,7 +149,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1622"> + id="filter1622" + x="-0.0048076923" + y="-0.0040322581" + width="1.0096154" + height="1.0080645"> <feColorMatrix type="hueRotate" values="180" @@ -147,7 +167,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1628"> + id="filter1628" + x="-0.027272727" + y="-0.057692308" + width="1.0545455" + height="1.1153846"> <feColorMatrix type="hueRotate" values="180" @@ -161,7 +185,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1634"> + id="filter1634" + x="-0.026785714" + y="-0.057692308" + width="1.0535714" + height="1.1153846"> <feColorMatrix type="hueRotate" values="180" @@ -175,7 +203,11 @@ <filter style="color-interpolation-filters:sRGB;" inkscape:label="Invert" - id="filter1640"> + id="filter1640" + x="-0.0022321429" + y="-0.0040322581" + width="1.0044643" + height="1.0080645"> <feColorMatrix type="hueRotate" values="180" @@ -1009,11 +1041,14 @@ <text lineHeight="1.2" class="djs-label" - style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" - id="text301"><tspan - x="0" - y="9.899999999999999" - id="tspan299">Failure</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text301" + x="-3.1140134" + y="8.0074625"><tspan + sodipodi:role="line" + id="tspan3" + x="-3.1140134" + y="8.0074625">Timeout</tspan></text> </g> <rect class="djs-hit djs-hit-all" @@ -1092,11 +1127,14 @@ <text lineHeight="1.2" class="djs-label" - style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" - id="text333"><tspan - x="0" - y="9.899999999999999" - id="tspan331">Option A</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text333" + x="0.44485906" + y="9.3420401"><tspan + sodipodi:role="line" + id="tspan1" + x="0.44485906" + y="9.3420401">Success</tspan></text> </g> <rect class="djs-hit djs-hit-all" @@ -1132,11 +1170,14 @@ <text lineHeight="1.2" class="djs-label" - style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: black;" - id="text347"><tspan - x="0" - y="9.899999999999999" - id="tspan345">Option B</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Arial, sans-serif;-inkscape-font-specification:'Arial, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000" + id="text347" + x="4.0037313" + y="8.0074625"><tspan + sodipodi:role="line" + id="tspan2" + x="4.0037313" + y="8.0074625">Failure</tspan></text> </g> <rect class="djs-hit djs-hit-all" From 9f503060792d8e735ad3a785f862bb581611b0e1 Mon Sep 17 00:00:00 2001 From: Hauke Hund <hauke.hund@hs-heilbronn.de> Date: Mon, 27 May 2024 10:46:59 +0200 Subject: [PATCH 08/42] all camunda links to 7.18 for HiGHmed DSF tutorial --- .../tutorial/exercise1-simpleProcess.md | 2 +- .../tutorial/exercise3-messageEvents.md | 8 ++++---- .../tutorial/exercise4-exclusiveGateways.md | 6 +++--- .../tutorial/exercise5-eventBasedGateways.md | 18 +++++++++--------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md b/docs/src/oldstable/tutorial/exercise1-simpleProcess.md index 79b0ff39e..7e2cb54a0 100644 --- a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md +++ b/docs/src/oldstable/tutorial/exercise1-simpleProcess.md @@ -22,7 +22,7 @@ Java code for the `tutorial-process` project is located at `src/main/java`, FHIR The most imported Java class used to specify the process plugin for the DSF BPE server is a class that implements the `org.highmed.dsf.bpe.ProcessPluginDefinition` interface from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module. The DSF BPE server searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. For this tutorial the `TutorialProcessPluginDefinition` class implements this interface. It is appropriately specified in the `src/main/resources/META-INF/services/org.highmed.dsf.bpe`.ProcessPluginDefinition file. The `TutorialProcessPluginDefinition` class is used to specify name and version of the process plugin, what BPMN processes are to be deployed and what FHIR resources and required by the BPMN processes. For the implementation of service task and message events of the processes a special Spring context is used for every process plugin. The `TutorialProcessPluginDefinition` class specifies what via [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) with Spring Beans are used for the process plugin specific Spring Context. For this plugin the `TutorialConfig` cass is used to define Spring Beans. -The business process engine used by the DSF BPE server is based on the OpenSource Camunda Process Engine 7. In order to specify what Java code should be executed for a BPMN [ServiceTask](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/) you need to specify the fully-qualified Java class name in the ServiceTask inside the BPMN model. To be executable the Java class needs to extend the `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module and the class needs to be defined as as Spring Bean. +The business process engine used by the DSF BPE server is based on the OpenSource Camunda Process Engine 7. In order to specify what Java code should be executed for a BPMN [ServiceTask](https://docs.camunda.org/manual/7.18/reference/bpmn20/tasks/service-task/) you need to specify the fully-qualified Java class name in the ServiceTask inside the BPMN model. To be executable the Java class needs to extend the `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module and the class needs to be defined as as Spring Bean. #### Process Execution and FHIR Task Resources diff --git a/docs/src/oldstable/tutorial/exercise3-messageEvents.md b/docs/src/oldstable/tutorial/exercise3-messageEvents.md index 09b5bbb1b..192792ecf 100644 --- a/docs/src/oldstable/tutorial/exercise3-messageEvents.md +++ b/docs/src/oldstable/tutorial/exercise3-messageEvents.md @@ -19,7 +19,7 @@ In order to exchange information between different processes, for example at two ![Message Flow](/photos/guideline/tutorial/ex3.png) -Every time message flow is used in a BPMN process for the DSF, a corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) profile needs to be specified for every interaction. This profile specifies which process should be started or continued and what the message name is when correlating the appropriate [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) or [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event). A *Business Key* and a *Correlation Key* are specified if different process instances need to be linked to a single execution, for example to be able to send a message back. +Every time message flow is used in a BPMN process for the DSF, a corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) profile needs to be specified for every interaction. This profile specifies which process should be started or continued and what the message name is when correlating the appropriate [Message Start Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-start-event) or [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-intermediate-catching-event). A *Business Key* and a *Correlation Key* are specified if different process instances need to be linked to a single execution, for example to be able to send a message back. #### BPMN Process Definition Key vs. FHIR Task.instantiatesUri and ActivityDefinition.url / version @@ -48,7 +48,7 @@ The authorization extension needs to be configured at least once and has four su ##### message-name [1..1] -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. +String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.18/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. ##### task-profile [1..1] @@ -122,9 +122,9 @@ The following example specifies that process execution can only be requested by ### Exercise Tasks --- -1. Modify the ``highmedorg_helloDic`` process in the ``hello-dic.bpmn`` file and replace the [End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/none-events/#none-end-event) with a [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event). Configure input parameters ``instantiatesUri``, ``profile`` and ``messageName`` in the BPMN model for the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event). Set the message name of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) and configure it to be executed using the HelloCosMessage class. +1. Modify the ``highmedorg_helloDic`` process in the ``hello-dic.bpmn`` file and replace the [End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/none-events/#none-end-event) with a [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event). Configure input parameters ``instantiatesUri``, ``profile`` and ``messageName`` in the BPMN model for the [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event). Set the message name of the [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event) and configure it to be executed using the HelloCosMessage class. Use http://highmed.org/fhir/StructureDefinition/task-hello-cos|#{version} as the profile and ``helloCos`` as the message name. Figure out what the appropriate ``instantiatesUri`` value is, based on the name (process definition key) of the process to be triggered. -2. Modify the ``highmedorg_helloCos`` process in the ``hello-cos.bpmn`` file and configure the message name of the [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) with the same value as the message name of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) in the ``highmedorg_helloDic`` process. +2. Modify the ``highmedorg_helloCos`` process in the ``hello-cos.bpmn`` file and configure the message name of the [Message Start Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-start-event) with the same value as the message name of the [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event) in the ``highmedorg_helloDic`` process. 3. Create a new [StructureDefinition](http://hl7.org/fhir/R4/structuredefinition.html) with a [Task](http://hl7.org/fhir/R4/task.html) profile for the ``helloCos`` message. 4. Create a new [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource for the ``highmedorg_helloCos`` process and configure the authorization extension to allow the ``Test_DIC`` organization as the requester and the ``Test_COS`` organization as the recipient. 5. Add the ``highmedorg_helloCos`` process and its resources to the ``TutorialProcessPluginDefinition`` class. diff --git a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md b/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md index ed344a25c..2be5fd382 100644 --- a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md +++ b/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md @@ -11,11 +11,11 @@ Different execution paths in a process based on the state of process variables c --- #### Exclusive Gateways -Different sequence flows during the execution of a process instance can be modeled using BPMN [Exclusive Gateways](https://docs.camunda.org/manual/7.4/reference/bpmn20/gateways/exclusive-gateway/). For each outgoing sequence flow of the gateway, a BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) can be added to the process model, deciding whether a sequence flow should be followed. Thereby, all condition decisions must be in an XOR relationship to each other. +Different sequence flows during the execution of a process instance can be modeled using BPMN [Exclusive Gateways](https://docs.camunda.org/manual/7.18/reference/bpmn20/gateways/exclusive-gateway/). For each outgoing sequence flow of the gateway, a BPMN [Condition Expression](https://docs.camunda.org/manual/7.18/user-guide/process-engine/expression-language/#conditions) can be added to the process model, deciding whether a sequence flow should be followed. Thereby, all condition decisions must be in an XOR relationship to each other. #### Condition Expressions -A BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) uses the ``${..}`` notation. Within the curly braces all execution variables of a process instance can be accessed, e.g. the ones that were stored in a previous Java implementation of a BPMN [ServiceTask](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/). For example, the BPMN [Condition Expression](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) ``${cohortSize > 100}`` checks whether the value in the execution variable *cohortSize* is greater than 100. +A BPMN [Condition Expression](https://docs.camunda.org/manual/7.18/user-guide/process-engine/expression-language/#conditions) uses the ``${..}`` notation. Within the curly braces all execution variables of a process instance can be accessed, e.g. the ones that were stored in a previous Java implementation of a BPMN [ServiceTask](https://docs.camunda.org/manual/7.18/reference/bpmn20/tasks/service-task/). For example, the BPMN [Condition Expression](https://docs.camunda.org/manual/7.18/user-guide/process-engine/expression-language/#conditions) ``${cohortSize > 100}`` checks whether the value in the execution variable *cohortSize* is greater than 100. #### Storing / Modifying Process Variables @@ -26,7 +26,7 @@ Via the ``DelegateExecution execution`` parameter of the ``doExecute`` method of boolean variable = (boolean) execution.getVariable("variable-name"); } ``` -For more details on process variables see the [Camunda documentation](https://docs.camunda.org/manual/7.21/user-guide/process-engine/variables/). +For more details on process variables see the [Camunda documentation](https://docs.camunda.org/manual/7.18/user-guide/process-engine/variables/). ### Exercise Tasks --- diff --git a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md b/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md index 8370f1881..572b6f343 100644 --- a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md +++ b/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md @@ -14,13 +14,13 @@ In the final exercise we will look at message flow between three organizations a If an existing and started process instance is waiting for a message from another organization, the corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) may never arrive. Either because the other organization decides to never send the "message" or because some technical problem prohibits the [Task](http://hl7.org/fhir/R4/task.html) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. -In order to solve this problem we can add an [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) to the process waiting for a response and then either handle a [Task](http://hl7.org/fhir/R4/task.html) resource with the response and finish the process in a success state or fire of an [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if two different message or no message could be received: +In order to solve this problem we can add an [Event Based Gateway](https://docs.camunda.org/manual/7.18/reference/bpmn20/gateways/event-based-gateway/) to the process waiting for a response and then either handle a [Task](http://hl7.org/fhir/R4/task.html) resource with the response and finish the process in a success state or fire of an [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if two different message or no message could be received: ![](/photos/guideline/tutorial/ex5.png) ##### Timer Events -For [Timer Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/) the duration until the timer fires is specified using the [ISO 8601 Durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found in the [Camunda 7 documentation](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). +For [Timer Events](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/timer-events/) the duration until the timer fires is specified using the [ISO 8601 Durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found in the [Camunda 7 documentation](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/timer-events/#time-duration). #### Matching Process Instances With Business Keys @@ -36,7 +36,7 @@ The authorization extension needs to be configured at least once and has four su ##### message-name [1..1] -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. +String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.18/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. ##### task-profile [1..1] @@ -126,13 +126,13 @@ The following example specifies that process execution can only be requested by ### Exercise Tasks --- 1. Modify the ``HelloCosMessage`` and use the value from the [Task.input](http://hl7.org/fhir/R4/task.html) parameter of the ``helloDic`` [Task](http://hl7.org/fhir/R4/task.html) to send it to the ``highmedorg_helloCos`` process via a [Task.input](http://hl7.org/fhir/R4/task.html) parameter in the ``helloCos`` Task. Override the ``getAdditionalInputParameters`` to configure a [Task.input](http://hl7.org/fhir/R4/task.html) parameter to be send. -2. Modify the ``highmedorg_helloCos`` process to use a [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) to trigger the process in file ``hello-hrp.bpmn``. Figure out the values for the ``instantiatesUri``, ``profile`` and ``messageName`` input parameters of the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. +2. Modify the ``highmedorg_helloCos`` process to use a [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event) to trigger the process in file ``hello-hrp.bpmn``. Figure out the values for the ``instantiatesUri``, ``profile`` and ``messageName`` input parameters of the [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event) based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. 3. Modify the ``highmedorg_helloDic`` process: - - Change the [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) to an [Intermediate Message Throw Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) - - Add an [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) after the throw event - - Configure two cases for the [Event Based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/): - 1. An [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) to catch the ``goodbyDic`` message from the ``highmedorg_helloHrp`` process. - 2. An [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) to end the process if no message is sent by the ``highmedorg_helloHrp`` process after two minutes. Make sure both cases finish with a process [End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/none-events/). + - Change the [Message End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-end-event) to an [Intermediate Message Throw Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) + - Add an [Event Based Gateway](https://docs.camunda.org/manual/7.18/reference/bpmn20/gateways/event-based-gateway/) after the throw event + - Configure two cases for the [Event Based Gateway](https://docs.camunda.org/manual/7.18/reference/bpmn20/gateways/event-based-gateway/): + 1. An [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/message-events/#message-intermediate-catching-event) to catch the ``goodbyDic`` message from the ``highmedorg_helloHrp`` process. + 2. An [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) to end the process if no message is sent by the ``highmedorg_helloHrp`` process after two minutes. Make sure both cases finish with a process [End Event](https://docs.camunda.org/manual/7.18/reference/bpmn20/events/none-events/). 4. Modify the process in file ``hello-hrp.bpmn`` and set the process definition key and version. Figure out the appropriate values based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. 5. Add the process in file ``hello-hrp.bpmn`` to the ``TutorialProcessPluginDefinition`` and configure the FHIR resources needed for the three processes. 6. Add the ``HelloCos``, ``HelloHrpMessage`` , ``HelloHrp`` and ``GoodbyeDicMessage`` classes as spring beans. From 82183cf9766eac90200f1b555efaf2edf47b43c6 Mon Sep 17 00:00:00 2001 From: Hauke Hund <hauke.hund@hs-heilbronn.de> Date: Mon, 27 May 2024 10:49:46 +0200 Subject: [PATCH 09/42] fixed link --- .../guides/accessing-task-resources-during-execution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md index 808b0fa4f..98f3fa352 100644 --- a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md +++ b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md @@ -6,7 +6,7 @@ icon: creative ### Accessing Task Resources During Execution If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../concepts/fhir/task.md) resources. The most commonly used ones are the start [Task](../concepts/fhir/task.md), referring to the [Task](../concepts/fhir/task.md) / [Message Start Event](../concepts/bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../concepts/fhir/task.md), referring to most recently received [Task](../concepts/fhir/task.md) / Message. -In principle, this is sufficient to access all information in a [Task](basic-concepts-and-guides.md#task) resource, since you have the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. +In principle, this is sufficient to access all information in a [Task](../concepts/fhir/task.md) resource, since you have the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. Instead of navigating the [Task](../concepts/fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../concepts/dsf/process-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../concepts/fhir/task.md) resources. The most common use case for this is retrieving data from a [Task's](../concepts/fhir/task.md) [Input Parameter](../concepts/fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) for a [Message Delegate's](../concepts/dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../concepts/fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../concepts/fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../concepts/fhir/codesystem.md) and Code to any [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of the provided [Task](../concepts/fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. To create new [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to attach to a [Task](../concepts/fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../concepts/dsf/message-delegates.md). \ No newline at end of file From 9dad86377f670f854c5e9d341a1264499294c208 Mon Sep 17 00:00:00 2001 From: Hauke Hund <hauke.hund@hs-heilbronn.de> Date: Mon, 27 May 2024 15:06:48 +0200 Subject: [PATCH 10/42] restructured developer documentation --- docs/src/.vuepress/theme.ts | 30 ++++++------- .../concepts => develop}/bpmn/conditions.md | 2 +- docs/src/develop/bpmn/gateways.md | 16 +++++++ docs/src/develop/bpmn/index.md | 17 ++++++++ .../concepts => develop}/bpmn/messaging.md | 0 .../bpmn/sequence-flow.md | 0 .../bpmn/service-tasks.md | 0 .../timer-intermediate-catching-events.md | 2 +- .../dsf/bpmn-process-execution.md | 3 +- .../src/develop/dsf/bpmn-process-variables.md | 10 +++++ docs/src/develop/dsf/draft-task-resources.md | 21 +++++++++ .../dsf/environment-variables.md | 2 +- .../dsf/message-correlation.md | 2 +- docs/src/develop/dsf/message-delegates.md | 15 +++++++ .../dsf/organization-identifiers.md | 2 +- docs/src/develop/dsf/process-plugin-api.md | 32 ++++++++++++++ .../dsf/process-plugin-definition.md} | 10 ++--- docs/src/develop/dsf/read-access-tag.md | 22 ++++++++++ .../dsf/requester-and-recipient.md} | 6 +-- docs/src/develop/dsf/service-delegates.md | 12 ++++++ .../dsf/spring-framework-integration.md} | 4 +- .../develop/dsf/versions-placeholders-urls.md | 38 ++++++++++++++++ docs/src/develop/fhir/activitydefinition.md | 23 ++++++++++ .../concepts => develop}/fhir/codesystem.md | 4 +- docs/src/develop/fhir/index.md | 15 +++++++ .../concepts => develop}/fhir/task.md | 6 +-- docs/src/develop/fhir/valueset.md | 10 +++++ .../accessing-bpmn-process-variables.md | 10 +++++ ...cessing-task-resources-during-execution.md | 12 ++++++ ...-task-input-parameters-to-task-profiles.md | 12 +++--- .../guides/configuring-the-read-access-tag.md | 8 ++-- .../guides/creating-an-activity-definition.md | 30 ++++++------- .../creating-codesystems-for-dsf-processes.md | 4 +- ...ng-task-resources-based-on-a-definition.md | 20 ++++----- .../creating-valuesets-for-dsf-processes.md | 10 ++--- ...-incoming-messages-and-missing-messages.md | 18 ++++++++ .../setting-targets-for-message-events.md | 2 +- .../starting-a-process-via-task-resources.md | 43 +++++++++++++++++++ docs/src/develop/index.md | 4 ++ .../concepts/bpmn/gateways.md | 16 ------- .../concepts/bpmn/intro.md | 6 --- .../about-version-placeholders-and-urls.md | 38 ---------------- .../concepts/dsf/bpmn-process-variables.md | 10 ----- .../concepts/dsf/draft-task-resources.md | 21 --------- .../concepts/dsf/message-delegates.md | 15 ------- .../concepts/dsf/process-api.md | 19 -------- .../concepts/dsf/read-access-tag.md | 22 ---------- .../concepts/dsf/service-delegates.md | 12 ------ .../concepts/fhir/activitydefinition.md | 23 ---------- .../concepts/fhir/introduction.md | 8 ---- .../concepts/fhir/valueset.md | 10 ----- .../accessing-bpmn-process-variables.md | 10 ----- ...cessing-task-resources-during-execution.md | 12 ------ ...-incoming-messages-and-missing-messages.md | 18 -------- .../starting-a-process-via-task-resources.md | 43 ------------------- 55 files changed, 394 insertions(+), 366 deletions(-) rename docs/src/{developer-documentation/concepts => develop}/bpmn/conditions.md (75%) create mode 100644 docs/src/develop/bpmn/gateways.md create mode 100644 docs/src/develop/bpmn/index.md rename docs/src/{developer-documentation/concepts => develop}/bpmn/messaging.md (100%) rename docs/src/{developer-documentation/concepts => develop}/bpmn/sequence-flow.md (100%) rename docs/src/{developer-documentation/concepts => develop}/bpmn/service-tasks.md (100%) rename docs/src/{developer-documentation/concepts => develop}/bpmn/timer-intermediate-catching-events.md (77%) rename docs/src/{developer-documentation/concepts => develop}/dsf/bpmn-process-execution.md (62%) create mode 100644 docs/src/develop/dsf/bpmn-process-variables.md create mode 100644 docs/src/develop/dsf/draft-task-resources.md rename docs/src/{developer-documentation/concepts => develop}/dsf/environment-variables.md (53%) rename docs/src/{developer-documentation/concepts => develop}/dsf/message-correlation.md (67%) create mode 100644 docs/src/develop/dsf/message-delegates.md rename docs/src/{developer-documentation/concepts => develop}/dsf/organization-identifiers.md (53%) create mode 100644 docs/src/develop/dsf/process-plugin-api.md rename docs/src/{developer-documentation/concepts/dsf/the-process-plugin-definition.md => develop/dsf/process-plugin-definition.md} (75%) create mode 100644 docs/src/develop/dsf/read-access-tag.md rename docs/src/{developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md => develop/dsf/requester-and-recipient.md} (98%) create mode 100644 docs/src/develop/dsf/service-delegates.md rename docs/src/{developer-documentation/concepts/dsf/spring-integration.md => develop/dsf/spring-framework-integration.md} (95%) create mode 100644 docs/src/develop/dsf/versions-placeholders-urls.md create mode 100644 docs/src/develop/fhir/activitydefinition.md rename docs/src/{developer-documentation/concepts => develop}/fhir/codesystem.md (82%) create mode 100644 docs/src/develop/fhir/index.md rename docs/src/{developer-documentation/concepts => develop}/fhir/task.md (81%) create mode 100644 docs/src/develop/fhir/valueset.md create mode 100644 docs/src/develop/guides/accessing-bpmn-process-variables.md create mode 100644 docs/src/develop/guides/accessing-task-resources-during-execution.md rename docs/src/{developer-documentation => develop}/guides/adding-task-input-parameters-to-task-profiles.md (81%) rename docs/src/{developer-documentation => develop}/guides/configuring-the-read-access-tag.md (94%) rename docs/src/{developer-documentation => develop}/guides/creating-an-activity-definition.md (89%) rename docs/src/{developer-documentation => develop}/guides/creating-codesystems-for-dsf-processes.md (74%) rename docs/src/{developer-documentation => develop}/guides/creating-task-resources-based-on-a-definition.md (68%) rename docs/src/{developer-documentation => develop}/guides/creating-valuesets-for-dsf-processes.md (62%) create mode 100644 docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md rename docs/src/{developer-documentation => develop}/guides/setting-targets-for-message-events.md (94%) create mode 100644 docs/src/develop/guides/starting-a-process-via-task-resources.md create mode 100644 docs/src/develop/index.md delete mode 100644 docs/src/developer-documentation/concepts/bpmn/gateways.md delete mode 100644 docs/src/developer-documentation/concepts/bpmn/intro.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/draft-task-resources.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/message-delegates.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/process-api.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/read-access-tag.md delete mode 100644 docs/src/developer-documentation/concepts/dsf/service-delegates.md delete mode 100644 docs/src/developer-documentation/concepts/fhir/activitydefinition.md delete mode 100644 docs/src/developer-documentation/concepts/fhir/introduction.md delete mode 100644 docs/src/developer-documentation/concepts/fhir/valueset.md delete mode 100644 docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md delete mode 100644 docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md delete mode 100644 docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md delete mode 100644 docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 100519616..294952f58 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -37,8 +37,8 @@ export default hopeTheme({ }, { text: "Developer Documentation", - icon: "info", - link: "/developer-documentation/" + icon: "creative", + link: "/develop/" } ] }, @@ -855,41 +855,35 @@ export default hopeTheme({ children: ["introduction", "generalinformation/", "code/", "build/", "releases/", "tutorial/"], }, ], - "/developer-documentation/": [ + "/develop/": [ { text: "Developer Documentation", - icon: "info", - link: "/developer-documentation/", + icon: "creative", + link: "/develop/", children: [{ - text: "Concepts", - icon: "info", - prefix: "concepts/", - link: "concepts/", - children: [{ text: "BPMN", - icon: "info", + icon: "creative", prefix: "bpmn/", link: "bpmn/", - children: ["intro.md", "sequence-flow.md", "service-tasks.md", "gateways.md", "conditions.md", "messaging.md", "timer-intermediate-catching-events.md"], + children: ["conditions.md", "gateways.md", "messaging.md", "sequence-flow.md", "service-tasks.md", "timer-intermediate-catching-events.md"], }, { text: "FHIR", - icon: "info", + icon: "creative", prefix: "fhir/", link: "fhir/", - children: ["introduction.md", "task.md", "activitydefinition.md", "codesystem.md", "valueset.md"], + children: ["activitydefinition.md", "codesystem.md", "task.md", "valueset.md"], }, { text: "DSF", - icon: "info", + icon: "creative", prefix: "dsf/", link: "dsf/", - children: ["about-version-placeholders-and-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "draft-task-resources.md", "environment-variables.md", "examples-for-requester-and-recipient-elements.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-api.md", "read-access-tag.md", "service-delegates.md", "spring-integration.md", "the-process-plugin-definition.md"], - }] + children: ["versions-placeholders-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "draft-task-resources.md", "environment-variables.md", "requester-and-recipient.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-plugin-api.md", "read-access-tag.md", "service-delegates.md", "spring-framework-integration.md", "process-plugin-definition.md"], }, { text: "Guides", - icon: "info", + icon: "creative", prefix: "guides/", link: "guides/", children: ["accessing-bpmn-process-variables.md", "accessing-task-resources-during-execution.md", "adding-task-input-parameters-to-task-profiles.md", "configuring-the-read-access-tag.md", "creating-an-activity-definition.md", "creating-codesystems-for-dsf-processes.md", "creating-task-resources-based-on-a-definition.md", "creating-valuesets-for-dsf-processes.md", "managing-mutiple-incoming-messages-and-missing-messages.md", "setting-targets-for-message-events.md", "starting-a-process-via-task-resources.md"] diff --git a/docs/src/developer-documentation/concepts/bpmn/conditions.md b/docs/src/develop/bpmn/conditions.md similarity index 75% rename from docs/src/developer-documentation/concepts/bpmn/conditions.md rename to docs/src/develop/bpmn/conditions.md index 4ac23388d..41447df07 100644 --- a/docs/src/developer-documentation/concepts/bpmn/conditions.md +++ b/docs/src/develop/bpmn/conditions.md @@ -5,4 +5,4 @@ icon: creative ### Conditions -[Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](../../concepts/bpmn/sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/). \ No newline at end of file +[Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/). \ No newline at end of file diff --git a/docs/src/develop/bpmn/gateways.md b/docs/src/develop/bpmn/gateways.md new file mode 100644 index 000000000..630b26ae0 --- /dev/null +++ b/docs/src/develop/bpmn/gateways.md @@ -0,0 +1,16 @@ +--- +title: Gateways +icon: creative +--- + +### Gateways + +[Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](sequence-flow.md). Different types of gateways are useful for different scenarios. + +#### Exclusive Gateways + +[Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence flow exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](sequence-flow.md) by selecting a [Sequence Flow](sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](conditions.md). + +#### Event-based Gateway + +The [Event-based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/develop/bpmn/index.md b/docs/src/develop/bpmn/index.md new file mode 100644 index 000000000..0a79690de --- /dev/null +++ b/docs/src/develop/bpmn/index.md @@ -0,0 +1,17 @@ +--- +title: BPMN +icon: creative +--- + +## Introduction + +The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. + +## Details + +- [Conditions](conditions.md) +- [Gateways](gateways.md) +- [Messaging](messaging.md) +- [Sequence Flow](sequence-flow.md) +- [Service Tasks](service-tasks.md) +- [Timer Intermediate Catching Events](timer-intermediate-catching-events.md) \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/messaging.md b/docs/src/develop/bpmn/messaging.md similarity index 100% rename from docs/src/developer-documentation/concepts/bpmn/messaging.md rename to docs/src/develop/bpmn/messaging.md diff --git a/docs/src/developer-documentation/concepts/bpmn/sequence-flow.md b/docs/src/develop/bpmn/sequence-flow.md similarity index 100% rename from docs/src/developer-documentation/concepts/bpmn/sequence-flow.md rename to docs/src/develop/bpmn/sequence-flow.md diff --git a/docs/src/developer-documentation/concepts/bpmn/service-tasks.md b/docs/src/develop/bpmn/service-tasks.md similarity index 100% rename from docs/src/developer-documentation/concepts/bpmn/service-tasks.md rename to docs/src/develop/bpmn/service-tasks.md diff --git a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md b/docs/src/develop/bpmn/timer-intermediate-catching-events.md similarity index 77% rename from docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md rename to docs/src/develop/bpmn/timer-intermediate-catching-events.md index bb4a0eb80..49ab4a8fc 100644 --- a/docs/src/developer-documentation/concepts/bpmn/timer-intermediate-catching-events.md +++ b/docs/src/develop/bpmn/timer-intermediate-catching-events.md @@ -5,4 +5,4 @@ icon: creative ### Timer Intermediate Catching Events -A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](../../concepts/bpmn/sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file +A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md b/docs/src/develop/dsf/bpmn-process-execution.md similarity index 62% rename from docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md rename to docs/src/develop/dsf/bpmn-process-execution.md index 643f371fc..8884106e0 100644 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-execution.md +++ b/docs/src/develop/dsf/bpmn-process-execution.md @@ -3,7 +3,6 @@ title: BPMN Process Execution icon: creative --- - ### BPMN Process Execution -The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.21/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file +The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.21/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](service-delegates.md) / [Message](message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file diff --git a/docs/src/develop/dsf/bpmn-process-variables.md b/docs/src/develop/dsf/bpmn-process-variables.md new file mode 100644 index 000000000..6170e1b1e --- /dev/null +++ b/docs/src/develop/dsf/bpmn-process-variables.md @@ -0,0 +1,10 @@ +--- +title: BPMN Process Variables +icon: creative +--- + +### BPMN Process Variables + +BPMN process variables hold additional information which has to be available during BPMN process execution. Variables can be directly related to BPMN elements like the boolean value for [Conditions](../bpmn/conditions.md), but do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. They are accessible during the entirety of the execution to all [Service](service-delegates.md) / [Message](message-delegates.md) Delegates. + +You can learn how to access to the BPMN process variables [here](../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/develop/dsf/draft-task-resources.md b/docs/src/develop/dsf/draft-task-resources.md new file mode 100644 index 000000000..c1bcaa28c --- /dev/null +++ b/docs/src/develop/dsf/draft-task-resources.md @@ -0,0 +1,21 @@ +--- +title: Draft Task Resources +icon: creative +--- + +### Draft Task Resources + +[Task](../fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. Compared to regular [Task](../fhir/task.md) resources used to start BPMN processes, this type of [Task](../fhir/task.md) resource requires the status `draft` instead the usual `requested`. It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. Additionally, it requires setting the `Task.identifier` element. It should look something like this: + +```xml +<identifier> + <system value="http://dsf.dev/sid/task-identifier" /> + <value value="http://dsf.dev/bpe/Process/processKey/#{version}/task-name" /> +</identifier> +``` +`processKey` should be the same one used in [URLs](versions-placeholders-urls.md#urls). +`task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. + +For a complete example you can take a look at the Draft Task Resource in one of the solution branches and compare it to the one needed for cURL. The [Task](../fhir/task.md) resource created for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. + +You might also want to check out [this guide](../guides/creating-task-resources-based-on-a-definition.md) if you do not know how to create [Task](../fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/environment-variables.md b/docs/src/develop/dsf/environment-variables.md similarity index 53% rename from docs/src/developer-documentation/concepts/dsf/environment-variables.md rename to docs/src/develop/dsf/environment-variables.md index 2ce877cc5..fcea6697c 100644 --- a/docs/src/developer-documentation/concepts/dsf/environment-variables.md +++ b/docs/src/develop/dsf/environment-variables.md @@ -5,6 +5,6 @@ icon: creative ### Environment Variables -Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md). They are the same for all running process instances. They can be defined by adding a member variable with the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds to an underscore in the equivalent environment variable. Environment variables are always written upper-case. The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. +Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](bpmn-process-execution.md). They are the same for all running process instances. They can be defined by adding a member variable with the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds to an underscore in the equivalent environment variable. Environment variables are always written upper-case. The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. You can take a look at the `pom.xml` for the `tutorial-process` submodule [here](https://github.com/datasharingframework/dsf-process-tutorial/blob/main/tutorial-process/pom.xml) to see how you can add it to your own project. Keep in mind to point the `<workingPackage>` field to the package you want documentation for. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/message-correlation.md b/docs/src/develop/dsf/message-correlation.md similarity index 67% rename from docs/src/developer-documentation/concepts/dsf/message-correlation.md rename to docs/src/develop/dsf/message-correlation.md index 4e91e1515..23b18e3e3 100644 --- a/docs/src/developer-documentation/concepts/dsf/message-correlation.md +++ b/docs/src/develop/dsf/message-correlation.md @@ -7,4 +7,4 @@ icon: creative In order for messages to be able to be sent back and forth between organizations with potentially multiple of the same process plugin instances running at the same time and still arriving at the correct process instance, we need some mechanism to map messages to their rightful process instance. This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. -It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. To solve this issue, [Task](../../concepts/fhir/task.md) resources also come with an [Input Parameter](../../concepts/fhir/task.md#task-input-parameters) called `correlation-key`. This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file +It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. To solve this issue, [Task](../fhir/task.md) resources also come with an [Input Parameter](../fhir/task.md#task-input-parameters) called `correlation-key`. This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file diff --git a/docs/src/develop/dsf/message-delegates.md b/docs/src/develop/dsf/message-delegates.md new file mode 100644 index 000000000..61a1a06f1 --- /dev/null +++ b/docs/src/develop/dsf/message-delegates.md @@ -0,0 +1,15 @@ +--- +title: Message Delegates +icon: creative +--- + +### Message Delegates + +Message Delegates are the Java representation of the [Message Events](../bpmn/messaging.md) in your BPMN model. You link a Message Delegate to a certain [Message Event](../bpmn/messaging.md) by selecting the Message Event in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` + +You will only need Message Delegates for [Message Send Events](../bpmn/messaging.md). Incoming messages will be resolved to the correct [BPMN process execution](bpmn-process-execution.md) automatically using [Message Correlation](message-correlation.md) and the message inputs will be added to that execution's [process variables](bpmn-process-variables.md). + +To make a Message Delegate for [Message Send Events](../bpmn/messaging.md), your Java class needs to extend `AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting the `doExecute` method like with [Service Delegates](service-delegates.md). Instead, you most likely want to aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the `getAdditionalInputParamters` method. The DSF translates BPMN messages into FHIR [Task](../fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../fhir/task.md#task-input-parameters), hence the name of the method. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). diff --git a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md b/docs/src/develop/dsf/organization-identifiers.md similarity index 53% rename from docs/src/developer-documentation/concepts/dsf/organization-identifiers.md rename to docs/src/develop/dsf/organization-identifiers.md index 265f75958..70d143150 100644 --- a/docs/src/developer-documentation/concepts/dsf/organization-identifiers.md +++ b/docs/src/develop/dsf/organization-identifiers.md @@ -7,4 +7,4 @@ icon: creative DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server instance running under `domain`. The results will also include the `organization identifier` of each organization. #### Organization Identifiers in Task Resources -[Task](../../concepts/fhir/task.md) resources require you to reference an organization via its identifier as the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements depend on the [ActivityDefinition](../../concepts/fhir/activitydefinition.md) the [Task](../../concepts/fhir/task.md) resource should conform to. As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements for [Task](../../concepts/fhir/task.md) resources which initially start processes. All other cases depend on the context of the message being sent during process execution. \ No newline at end of file +[Task](../fhir/task.md) resources require you to reference an organization via its identifier as the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements depend on the [ActivityDefinition](../fhir/activitydefinition.md) the [Task](../fhir/task.md) resource should conform to. As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements for [Task](../fhir/task.md) resources which initially start processes. All other cases depend on the context of the message being sent during process execution. \ No newline at end of file diff --git a/docs/src/develop/dsf/process-plugin-api.md b/docs/src/develop/dsf/process-plugin-api.md new file mode 100644 index 000000000..5d1381a5a --- /dev/null +++ b/docs/src/develop/dsf/process-plugin-api.md @@ -0,0 +1,32 @@ +--- +title: Process Plugin API +icon: creative +--- + +### Process Plugin API v1 Maven Module + +The [DSF Process Plugin API module](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. This includes for example the `Variables` class, which provides access to the [BPMN process variables](bpmn-process-variables.md). + +Maven Dependency: + +```xml +<dependencies> + <dependency> + <groupId>dev.dsf</groupId> + <artifactId>dsf-bpe-process-api-v1</artifactId> + <version>${dsf.version}</version> + <scope>provided</scope> + </dependency> +</dependencies> +``` + +#### Process Plugin Api +When creating [Service Delegates](service-delegates.md) or [Message Delegates](message-delegates.md) you wil notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. +This API instance provides a variety of utility classes: +- `ProxyConfig`**:** forward proxy configuration +- `EndpointProvider`**:** access to Endpoint resources +- `FhirContext`**:** HAPI FHIR Context for parsing/serializing +- `FhirWebserviceClientProvider`**:** Webservice client to access DSF FHIR server +- `MailService`**:** for sending automatic E-Mails (if configured) +- `OrganizationProvider`**:** access to Organization resources +- `Variables`**:** access to BPMN execution variables \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md b/docs/src/develop/dsf/process-plugin-definition.md similarity index 75% rename from docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md rename to docs/src/develop/dsf/process-plugin-definition.md index 06297175a..a13bdbe26 100644 --- a/docs/src/developer-documentation/concepts/dsf/the-process-plugin-definition.md +++ b/docs/src/develop/dsf/process-plugin-definition.md @@ -1,16 +1,16 @@ --- -title: The Process Plugin Definition +title: Process Plugin Definition icon: creative --- -### The Process Plugin Definition +### Process Plugin Definition In order for the DSF BPE server to load your plugin you need to provide it with the following information: -* A plugin [version](../../concepts/dsf/about-version-placeholders-and-urls.md#version-pattern) +* A plugin [version](versions-placeholders-urls.md#version-pattern) * A release date * A plugin name * The BPMN model files -* The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../../concepts/fhir/task.md) resources needed for messages specific to that BPMN model) -* The Class holding your [Spring Configuration](../../concepts/dsf/spring-integration.md) +* The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../fhir/task.md) resources needed for messages specific to that BPMN model) +* The Class holding your [Spring Framework Configuration](spring-framework-integration.md) You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. The DSF BPE server then searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file diff --git a/docs/src/develop/dsf/read-access-tag.md b/docs/src/develop/dsf/read-access-tag.md new file mode 100644 index 000000000..4a69b6dc5 --- /dev/null +++ b/docs/src/develop/dsf/read-access-tag.md @@ -0,0 +1,22 @@ +--- +title: Read Access Tag +icon: creative +--- + +### Read Access Tag + +Axiomatically, nobody is allowed to write FHIR resources (except [Task](../fhir/task.md)) to the DSF FHIR server unless it is your own organization. By default, the same applies to reading FHIR resources (again except [Task](../fhir/task.md)). But since the DSF is often used to offer medical data in form of FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the exception of [Task](../fhir/task.md) resources. We will explain the reason for this exception shortly. For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: + +```xml +<meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> +</meta> +``` +You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). + +The read access rules for [Task](../fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. + +It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../guides/configuring-the-read-access-tag.md). diff --git a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md b/docs/src/develop/dsf/requester-and-recipient.md similarity index 98% rename from docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md rename to docs/src/develop/dsf/requester-and-recipient.md index 64d0164f8..fbbd79c3b 100644 --- a/docs/src/developer-documentation/concepts/dsf/examples-for-requester-and-recipient-elements.md +++ b/docs/src/develop/dsf/requester-and-recipient.md @@ -1,11 +1,11 @@ --- -title: Examples for Requester and Recipient Elements +title: Requester and Recipient Elements icon: creative --- -### Examples for Requester and Recipient Elements +### Requester and Recipient Elements -Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). Use this collection as a reference point when creating your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). +Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). Use this collection as a reference point when creating your own [ActivityDefinitions](../fhir/activitydefinition.md). #### Requester The `requester` element uses one of the following Codings: diff --git a/docs/src/develop/dsf/service-delegates.md b/docs/src/develop/dsf/service-delegates.md new file mode 100644 index 000000000..278b51e34 --- /dev/null +++ b/docs/src/develop/dsf/service-delegates.md @@ -0,0 +1,12 @@ +--- +title: Service Delegates +icon: creative +--- + +### Service Delegates + +Service Delegates are the Java representation of the [Service Tasks](../bpmn/service-tasks.md) in your BPMN model. You link a Service Delegate to a certain [Service Task](../bpmn/service-tasks.md) by selecting the [Service Task](../bpmn/service-tasks.md) in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` +All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](bpmn-process-execution.md) arrives at the [Service Task](../bpmn/service-tasks.md) your Service Delegate is linked to. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/spring-integration.md b/docs/src/develop/dsf/spring-framework-integration.md similarity index 95% rename from docs/src/developer-documentation/concepts/dsf/spring-integration.md rename to docs/src/develop/dsf/spring-framework-integration.md index 74fe000f0..55f96f342 100644 --- a/docs/src/developer-documentation/concepts/dsf/spring-integration.md +++ b/docs/src/develop/dsf/spring-framework-integration.md @@ -1,9 +1,9 @@ --- -title: Spring Integration +title: Spring Framework Integration icon: creative --- -### Spring Integration +### Spring Framework Integration Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also have to provide some Spring functionality. When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): - `AbstractTaskMessageSend` diff --git a/docs/src/develop/dsf/versions-placeholders-urls.md b/docs/src/develop/dsf/versions-placeholders-urls.md new file mode 100644 index 000000000..0381ec629 --- /dev/null +++ b/docs/src/develop/dsf/versions-placeholders-urls.md @@ -0,0 +1,38 @@ +--- +title: Versions, Placeholders and URLs +icon: creative +--- + +### Versions, Placeholders and URLs + +#### Version Pattern + +Process plugin versions have to obey the pattern: +``` +\d+\.\d+\.\d+\.\d+ Example: 1.2.3.4 +``` + +The first two numbers (`1.2`) are used in FHIR resources and signal changes which break compatibility with previous process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`3.4`) signal changes which do not break compatibility with previous process versions. Specifically, the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. + +#### Placeholders + +To avoid specifying the version and release date in multiple files, the placeholders `#{version}` and `#{date}` can be used within FHIR resources and BPMN models. They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. There is also a placeholder for the organization the DSF instance is running in: `#{organization}`, typically use in [Draft Task Resources](draft-task-resources.md). + +#### URLs + +BPMN models have an ID call process definition key. The BPMN process definition key needs to be specified following the pattern: +``` +^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey +``` +In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](#placeholders) for this as well. The DSF will also reference this process in URL form in FHIR resources: +``` +http://domain.org/bpe/Process/processKey|1.2 +``` + +As you can see, the version in the URL ``|1.2`` only uses the resource version and omits the code base version. As mentioned in [Version Pattern](#version-pattern), this means that only changes to the first two version numbers are significant to signal compatibility when communicating with other process plugin instances. The process definition key and URL are also related to each other. The DSF will try to match BPMN models to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey the pattern above. + +You will use the above URL as your instantiatesCanonical value for [Task](../fhir/task.md) profile definitions as well as references to [Task](../fhir/task.md) profiles in other resources. You will also use it as the URL value for your [ActivityDefinitions](../fhir/activitydefinition.md). In this case though, you have to split up the URL into two parts. You will separate the version (``|1.2``) from the URL and use it as a value for the `ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` [placeholder](#placeholders) here instead. Going by the example from above, you will be left with a URL that looks like this: +``` +http://domain.org/bpe/Process/processKey +``` +This will be the value for your `ActivityDefinition.url` element with `#{version}` as the value for your `ActivityDefinition.version` element. \ No newline at end of file diff --git a/docs/src/develop/fhir/activitydefinition.md b/docs/src/develop/fhir/activitydefinition.md new file mode 100644 index 000000000..97e0956a3 --- /dev/null +++ b/docs/src/develop/fhir/activitydefinition.md @@ -0,0 +1,23 @@ +--- +title: ActivityDefinition +icon: creative +--- + +### ActivityDefinition + +[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. + + +The most important elements in ActivityDefinitions are: +- `message-name` +- `task-profile` +- `requester` +- `recipient` + +The `message-name` element contains the name of the [BPMN message start event](../bpmn/messaging.md#message-start-event) or [BPMN message intermediate catching event](../bpmn/messaging.md#message-intermediate-catching-event) which expects a [Task](task.md) resource complying to the profile defined by `task-profile`. + +The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. + +You will have to create your own [ActivityDefinitions](activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../guides/creating-an-activity-definition.md). + +You can also find examples for all possible `requester` and `recipient` elements [here](../dsf/requester-and-recipient.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/codesystem.md b/docs/src/develop/fhir/codesystem.md similarity index 82% rename from docs/src/developer-documentation/concepts/fhir/codesystem.md rename to docs/src/develop/fhir/codesystem.md index 6787445c9..e40a365f2 100644 --- a/docs/src/developer-documentation/concepts/fhir/codesystem.md +++ b/docs/src/develop/fhir/codesystem.md @@ -5,8 +5,8 @@ icon: creative ### CodeSystem -[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a [ValueSet](../../concepts/fhir/valueset.md). +[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a [ValueSet](valueset.md). Plugin development for the DSF requires the use of [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) in two major ways: 1. Using existing [DSF CodeSystems](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem) in other FHIR resources like the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). -2. Creating your own CodeSystem to add additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters) to your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file +2. Creating your own CodeSystem to add additional [Input Parameters](task.md#task-input-parameters) to your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/develop/fhir/index.md b/docs/src/develop/fhir/index.md new file mode 100644 index 000000000..719581424 --- /dev/null +++ b/docs/src/develop/fhir/index.md @@ -0,0 +1,15 @@ +--- +title: FHIR +icon: creative +--- + +## Introduction + +The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](activitydefinition.md), [CodeSystems](codesystem.md), [Tasks](task.md) and [ValueSets](valueset.md). There is also a catalog of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). + +## Details + +- [ActivityDefinition](activitydefinition.md) +- [CodeSystem](codesystem.md) +- [Task](task.md) +- [ValueSet](valueset.md) \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/task.md b/docs/src/develop/fhir/task.md similarity index 81% rename from docs/src/developer-documentation/concepts/fhir/task.md rename to docs/src/develop/fhir/task.md index 85e6dab5e..a647fc46c 100644 --- a/docs/src/developer-documentation/concepts/fhir/task.md +++ b/docs/src/develop/fhir/task.md @@ -5,7 +5,7 @@ icon: creative ### Task -The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource based on parameters you set in the BPMN model and during execution. It will then automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). This profile includes a splicing for `Task.input` with three additional [Input Parameters](../../concepts/fhir/task.md#task-input-parameters): +The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource based on parameters you set in the BPMN model and during execution. It will then automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). This profile includes a splicing for `Task.input` with three additional [Input Parameters](task.md#task-input-parameters): - `message-name` - `business-key` - `correlation-key` @@ -14,6 +14,6 @@ When creating your own plugin, you will want to create your own profiles based o #### Task Input Parameters -Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](../../concepts/fhir/codesystem.md) and including it in a [ValueSet](../../concepts/fhir/valueset.md) to be able to use it in the Task resource. +Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](codesystem.md) and including it in a [ValueSet](valueset.md) to be able to use it in the Task resource. -If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file +If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file diff --git a/docs/src/develop/fhir/valueset.md b/docs/src/develop/fhir/valueset.md new file mode 100644 index 000000000..6be03a3fb --- /dev/null +++ b/docs/src/develop/fhir/valueset.md @@ -0,0 +1,10 @@ +--- +title: ValueSet +icon: creative +--- + +### ValueSet + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](codesystem.md) to coded elements like `code`, `Coding` or `CodeableConcept`. + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](codesystem.md) in your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/develop/guides/accessing-bpmn-process-variables.md b/docs/src/develop/guides/accessing-bpmn-process-variables.md new file mode 100644 index 000000000..f03bee5d0 --- /dev/null +++ b/docs/src/develop/guides/accessing-bpmn-process-variables.md @@ -0,0 +1,10 @@ +--- +title: Accessing BPMN Process Variables +icon: creative +--- + +### Accessing BPMN Process Variables + +After creating a [Service Delegate](../dsf/service-delegates.md) or [Message Delegate](../dsf/message-delegates.md), you might want to retrieve data from or store data in the [BPMN process variables](../dsf/bpmn-process-variables.md). You can achieve this either through the [BPMN process execution](../dsf/bpmn-process-execution.md) or via the `Variables` class. *It is very much recommended to use the latter method*. + +The `Variables` class provides lots of utility methods to read or write certain types of [BPMN process variables](../dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../dsf/bpmn-process-execution.md) to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/develop/guides/accessing-task-resources-during-execution.md b/docs/src/develop/guides/accessing-task-resources-during-execution.md new file mode 100644 index 000000000..196e16381 --- /dev/null +++ b/docs/src/develop/guides/accessing-task-resources-during-execution.md @@ -0,0 +1,12 @@ +--- +title: Accessing Task Resources During Execution +icon: creative +--- + +### Accessing Task Resources During Execution + +If you want access to the [Task](../fhir/task.md) resources in your [Service](../dsf/service-delegates.md) / [Message](../dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../fhir/task.md) resources. The most commonly used ones are the start [Task](../fhir/task.md), referring to the [Task](../fhir/task.md) / [Message Start Event](../bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../fhir/task.md), referring to most recently received [Task](../fhir/task.md) / Message. +In principle, this is sufficient to access all information in a [Task](../fhir/task.md) resource, since you have the [Task](../fhir/task.md) resource's Java object, but very cumbersome. +Instead of navigating the [Task](../fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../dsf/process-plugin-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../fhir/task.md) resources. +The most common use case for this is retrieving data from a [Task's](../fhir/task.md) [Input Parameter](../fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../fhir/task.md#task-input-parameters) for a [Message Delegate's](../dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../fhir/codesystem.md) and Code to any [Input Parameter](../fhir/task.md#task-input-parameters) of the provided [Task](../fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. +To create new [Input Parameters](../fhir/task.md#task-input-parameters) to attach to a [Task](../fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md similarity index 81% rename from docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md rename to docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md index 3fded3631..7a625d5f4 100644 --- a/docs/src/developer-documentation/guides/adding-task-input-parameters-to-task-profiles.md +++ b/docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md @@ -5,9 +5,9 @@ icon: creative ### Adding Task Input Parameters to Task Profiles -When adding a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) to a [Task](../concepts/fhir/task.md) profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists like `Task.input` e.g. by only allowing the elements to be of certain types. +When adding a new [Input Parameter](../fhir/task.md#task-input-parameters) to a [Task](../fhir/task.md) profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists like `Task.input` e.g. by only allowing the elements to be of certain types. For example, you might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). -This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource context. Our goal will be to add a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. +This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource context. Our goal will be to add a new [Input Parameter](../fhir/task.md#task-input-parameters) of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). The slicing for `Task.input` is defined in this part of the `baseDefinition`: @@ -54,7 +54,7 @@ Let us revisit `task-start-dic-process.xml` and start adding a slice called `exa We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). -Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` is a `CodeableConcept` which uses codings from a [ValueSet](../concepts/fhir/valueset.md), the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: +Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` is a `CodeableConcept` which uses codings from a [ValueSet](../fhir/valueset.md), the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: ```xml <StructureDefinition xmlns="http://hl7.org/fhir"> ... @@ -76,7 +76,7 @@ Next up, we need to define the binding for `Task.input:example-input.type`. Beca </differential> </StructureDefinition> ``` -As you can see, we referenced a [ValueSet](../concepts/fhir/valueset.md) in this binding. When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../concepts/fhir/valueset.md) resource or create a new one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). +As you can see, we referenced a [ValueSet](../fhir/valueset.md) in this binding. When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../fhir/valueset.md) resource or create a new one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires `Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: ```xml @@ -144,7 +144,7 @@ In the beginning we mentioned how `Task.input.type.coding.system` and `Task.inpu ``` *Notice that we also made the two elements mandatory because they are required by the discriminator.* -For the `type.coding.system` element we referenced a [CodeSystem](../concepts/fhir/codesystem.md). The `type.coding.code` element uses a code from this [CodeSystem](../concepts/fhir/codesystem.md) called `example-input`. This is the mechanism by which you actually "name" your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). The `type.coding.code` value will identify your [Input Parameter](../concepts/fhir/task.md#task-input-parameters) when you use it in an actual [Task](../concepts/fhir/task.md#task-input-parameters) resource. Here is how this would look like: +For the `type.coding.system` element we referenced a [CodeSystem](../fhir/codesystem.md). The `type.coding.code` element uses a code from this [CodeSystem](../fhir/codesystem.md) called `example-input`. This is the mechanism by which you actually "name" your [Input Parameter](../fhir/task.md#task-input-parameters). The `type.coding.code` value will identify your [Input Parameter](../fhir/task.md#task-input-parameters) when you use it in an actual [Task](../fhir/task.md#task-input-parameters) resource. Here is how this would look like: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -161,7 +161,7 @@ For the `type.coding.system` element we referenced a [CodeSystem](../concepts/fh </Task> ``` -When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../concepts/fhir/codesystem.md) resource or create a new one to reference. A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). +When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../fhir/codesystem.md) resource or create a new one to reference. A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). `Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: diff --git a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md b/docs/src/develop/guides/configuring-the-read-access-tag.md similarity index 94% rename from docs/src/developer-documentation/guides/configuring-the-read-access-tag.md rename to docs/src/develop/guides/configuring-the-read-access-tag.md index 983d7cdba..28a0bdf35 100644 --- a/docs/src/developer-documentation/guides/configuring-the-read-access-tag.md +++ b/docs/src/develop/guides/configuring-the-read-access-tag.md @@ -5,7 +5,7 @@ icon: creative ### Configuring the Read Access Tag -To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../concepts/dsf/read-access-tag.md) and choose one of the codes from it: +To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../dsf/read-access-tag.md) and choose one of the codes from it: ```xml <CodeSystem xmlns="http://hl7.org/fhir"> ... @@ -34,7 +34,7 @@ To start off, you want to take a look at the [CodeSystem](https://github.com/dat </CodeSystem> ``` -The codes `LOCAL` and `ALL` are trivial. Their [Read Access Tag](../concepts/dsf/read-access-tag.md) would look like this: +The codes `LOCAL` and `ALL` are trivial. Their [Read Access Tag](../dsf/read-access-tag.md) would look like this: ```xml <meta> <tag> @@ -134,7 +134,7 @@ The most important part of it is the `differential` statement. It uses [element </StructureDefinition> ``` -All extensions for the [Read Access Tag](../concepts/dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through the extension's `context` element: +All extensions for the [Read Access Tag](../dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through the extension's `context` element: ```xml <context> <type value="element" /> @@ -344,7 +344,7 @@ Instead of `Identifier`, the `value[x]` element is now defined as a `Coding` typ </meta> ``` -A `Coding` has to belong to some [CodeSystem](../concepts/fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. For demonstration purposes, we will be using the `DIC` role: +A `Coding` has to belong to some [CodeSystem](../fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. For demonstration purposes, we will be using the `DIC` role: ```xml <meta> <tag> diff --git a/docs/src/developer-documentation/guides/creating-an-activity-definition.md b/docs/src/develop/guides/creating-an-activity-definition.md similarity index 89% rename from docs/src/developer-documentation/guides/creating-an-activity-definition.md rename to docs/src/develop/guides/creating-an-activity-definition.md index f83c866bf..5e485da52 100644 --- a/docs/src/developer-documentation/guides/creating-an-activity-definition.md +++ b/docs/src/develop/guides/creating-an-activity-definition.md @@ -17,14 +17,14 @@ It is divided into steps for each of the main components of ActivityDefinitions: *We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* #### 1. Read Access Tag -Let us start out with an empty [ActivityDefinition](../concepts/fhir/activitydefinition.md): +Let us start out with an empty [ActivityDefinition](../fhir/activitydefinition.md): ```xml <ActivityDefinition xmlns="http://hl7.org/fhir"> </ActivityDefinition> ``` -The first element in DSF FHIR resources is always the [Read Access Tag](../concepts/dsf/read-access-tag.md). It describes who is allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the [Read Access Tag](../concepts/dsf/read-access-tag.md) in [this guide](../concepts/dsf/read-access-tag.md). In this case, we will allow read access to everyone: +The first element in DSF FHIR resources is always the [Read Access Tag](../dsf/read-access-tag.md). It describes who is allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the [Read Access Tag](../dsf/read-access-tag.md) in [this guide](../dsf/read-access-tag.md). In this case, we will allow read access to everyone: ```xml <ActivityDefinition xmlns="http://hl7.org/fhir"> @@ -38,7 +38,7 @@ The first element in DSF FHIR resources is always the [Read Access Tag](../conce ``` #### 2. Extension: Process Authorization -This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../concepts/fhir/task.md) resources) for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../concepts/fhir/activitydefinition.md) for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. This includes the message starting your BPMN process initially. You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the value for the URL from the `Extension.url` element: +This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../fhir/task.md) resources) for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../fhir/activitydefinition.md) for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. This includes the message starting your BPMN process initially. You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the value for the URL from the `Extension.url` element: ```xml <ActivityDefinition xmlns="http://hl7.org/fhir"> ... @@ -104,14 +104,14 @@ After these initial element definitions come the elements relevant for your proc </StructureDefinition> ``` -This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../concepts/fhir/activitydefinition.md). The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. This results in the following extension element we will add to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../fhir/activitydefinition.md). The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. This results in the following extension element we will add to our [ActivityDefinition](../fhir/activitydefinition.md): ```xml <extension url="message-name"> <valueString value="myMessage"/> </extension> ``` -For your use case, you have to replace `myMessage` with the name of the [BPMN message event](../concepts/bpmn/messaging.md) that is expecting this message. +For your use case, you have to replace `myMessage` with the name of the [BPMN message event](../bpmn/messaging.md) that is expecting this message. <details> <summary>This is how your ActivityDefinition should look like so far</summary> @@ -161,7 +161,7 @@ The next slice is called `task-profile`: </StructureDefinition> ``` -This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. Canonical values referring to [Task](../concepts/fhir/task.md) profiles in ActivityDefinitions have to conform to the rules outlined by the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls). From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md): +This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. Canonical values referring to [Task](../fhir/task.md) profiles in ActivityDefinitions have to conform to the rules outlined by the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls). From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../fhir/activitydefinition.md): ```xml <extension url="task-profile"> <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> @@ -230,7 +230,7 @@ The next slice is `requester`: </differential> </StructureDefinition> ``` -Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../concepts/fhir/valueset.md). This is the responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. +Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../fhir/valueset.md). This is the responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. Here is what they mean: - `local-all`: All local requests will be allowed. Local requests are identified by matching the requester's certificate to a thumbprint which was internally marked by the DSF FHIR server as belonging to a local organization. - `local-organization`: All local requests made from an organization with a specific `organization-identifier` will be allowed. @@ -240,9 +240,9 @@ Here is what they mean: can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml). This allows for more granularity when defining authorization rules within an organization and can be integrated into local user management via [OpenID Connect](https://dsf.dev/stable/maintain/fhir/access-control.html). -As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. You can also find examples of all Codings from above [here](../concepts/dsf/examples-for-requester-and-recipient-elements.md). +As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. You can also find examples of all Codings from above [here](../dsf/requester-and-recipient.md). -It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../concepts/fhir/activitydefinition.md). Let us start out by adding a `requester` element like we did for previous elements: +It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../fhir/activitydefinition.md). Let us start out by adding a `requester` element like we did for previous elements: ```xml <extension url="requester"> @@ -368,7 +368,7 @@ It defines an extension called `organization-practitioner` which is identified t </differential> ``` -This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element definitions from the Coding resource and adding everything to our [ActivityDefinition](../concepts/fhir/activitydefinition.md). +This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element definitions from the Coding resource and adding everything to our [ActivityDefinition](../fhir/activitydefinition.md). We will start with the `Extension.url` element, since the `Extension` element is the parent element for all slices on the `Extension.extension` elements: ```xml @@ -453,7 +453,7 @@ Now might be a good time to look at the [differential](#coding-differential) fro </valueCoding> </extension> ``` -Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../concepts/fhir/activitydefinition.md) under the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). +Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../fhir/activitydefinition.md) under the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). <details> <summary>This is how your ActivityDefinition should look like so far</summary> @@ -593,11 +593,11 @@ The last element defined in the [process authorization extension](https://github #### 3. BPE Managed Elements -Some elements of [ActivityDefinitions](../concepts/fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values at appropriate times. +Some elements of [ActivityDefinitions](../fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values at appropriate times. The following elements are managed by the DSF BPE: -- `ActivityDefinition.version` should use the [placeholder](../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) `#{version}` -- `ActivityDefinition.date` is not required, but should you decide to include it, use the [placeholder](../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) `#{date}` +- `ActivityDefinition.version` should use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{version}` +- `ActivityDefinition.date` is not required, but should you decide to include it, use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{date}` - `ActivityDefinition.status` must have a value of `unknown` <details> @@ -663,7 +663,7 @@ The following elements are managed by the DSF BPE: #### 4. Regular Elements -The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. Check out the documentation on [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` must have the value `Task`. +The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. Check out the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` must have the value `Task`. All other elements can technically be omitted. Still, we recommend you include the following elements: - `AcitivityDefinition.name` - `AcitivityDefinition.title` diff --git a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md b/docs/src/develop/guides/creating-codesystems-for-dsf-processes.md similarity index 74% rename from docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md rename to docs/src/develop/guides/creating-codesystems-for-dsf-processes.md index d939acc41..5ab6d87f1 100644 --- a/docs/src/developer-documentation/guides/creating-codesystems-for-dsf-processes.md +++ b/docs/src/develop/guides/creating-codesystems-for-dsf-processes.md @@ -5,7 +5,7 @@ icon: creative ### Creating CodeSystems for DSF Processes -You might find yourself in a situation where you need to create a [CodeSystem](../concepts/fhir/codesystem.md). For example, when defining the type of an [Input Parameter](../concepts/fhir/task.md#task-input-parameters). [CodeSystems](../concepts/fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../concepts/fhir/codesystem.md) in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: +You might find yourself in a situation where you need to create a [CodeSystem](../fhir/codesystem.md). For example, when defining the type of an [Input Parameter](../fhir/task.md#task-input-parameters). [CodeSystems](../fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../fhir/codesystem.md) in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: ```xml <CodeSystem xmlns="http://hl7.org/fhir"> <meta> @@ -39,4 +39,4 @@ You might find yourself in a situation where you need to create a [CodeSystem](. ``` Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. You can add as many codes as you like by defining more `concept` elements. -The DSF BPE server will read your [CodeSystem](../concepts/fhir/codesystem.md) from `tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file +The DSF BPE server will read your [CodeSystem](../fhir/codesystem.md) from `tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md b/docs/src/develop/guides/creating-task-resources-based-on-a-definition.md similarity index 68% rename from docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md rename to docs/src/develop/guides/creating-task-resources-based-on-a-definition.md index 220b519dd..6306ab128 100644 --- a/docs/src/developer-documentation/guides/creating-task-resources-based-on-a-definition.md +++ b/docs/src/develop/guides/creating-task-resources-based-on-a-definition.md @@ -5,18 +5,18 @@ icon: creative ### Creating Task Resources Based on a Definition -This short guide should help you understand how you can create [Task](../concepts/fhir/task.md) resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). As an example, we will create a [Task](../concepts/fhir/task.md) resource from the `task-start-dic-process.xml` profile. +This short guide should help you understand how you can create [Task](../fhir/task.md) resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). As an example, we will create a [Task](../fhir/task.md) resource from the `task-start-dic-process.xml` profile. #### 1st Step: Removing Placeholders `task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, you can either remove or comment these elements, so Forge does not try to perform type checking on them, which would result in an error and Forge not loading the file. #### 2nd Step: Differential Chain -If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our case, we will want to aggregate the changes made to the base resource (in this case [Task](../concepts/fhir/task.md)) by all profiles to make it more readable. To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: +If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our case, we will want to aggregate the changes made to the base resource (in this case [Task](../fhir/task.md)) by all profiles to make it more readable. To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: ![Forge overview](/photos/developer-documentation/forge_overview.png) #### 3rd Step: Building the Task Resource -We will now go through each element one by one and include it into our [Task](../concepts/fhir/task.md) resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case if we want a [Task](../concepts/fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). But, placeholders should be used in [Draft Task Resources](../concepts/dsf/draft-task-resources.md) instead of actual values wherever possible, since those are read by the DSF BPE server. This guide will create a [Task](../concepts/fhir/task.md) resource without placeholders. We will start out with the base element for all [Task](../concepts/fhir/task.md) resources: +We will now go through each element one by one and include it into our [Task](../fhir/task.md) resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case if we want a [Task](../fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). But, placeholders should be used in [Draft Task Resources](../dsf/draft-task-resources.md) instead of actual values wherever possible, since those are read by the DSF BPE server. This guide will create a [Task](../fhir/task.md) resource without placeholders. We will start out with the base element for all [Task](../fhir/task.md) resources: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -32,7 +32,7 @@ Before we start adding any elements listed in Forge's element tree, we have to i </Task> ``` -The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we will create an XML element with the same name and the value according to [URLs](../concepts/dsf/about-version-placeholders-and-urls.md#urls): +The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we will create an XML element with the same name and the value according to [URLs](../dsf/versions-placeholders-urls.md#urls): ```xml <Task xmlns="http://hl7.org/fhir"> <meta> @@ -43,7 +43,7 @@ The first element which can be found in the element tree is the `instantiatesCan ``` We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct data type (e.g. proper coding value for elements with `coding` type). -By now your [Task](../concepts/fhir/task.md) resources should look something like this: +By now your [Task](../fhir/task.md) resources should look something like this: <details> <summary>Suggested solution</summary> @@ -97,7 +97,7 @@ Then, we will add primitive elements to `requester` like we did before for `Task ``` *Important to note here that the value for the `status` will always be `requested` for Tasks being posted using cURL and the `type` element for `requester` and `recipient` will always have the value `Organization` in the DSF context.* -Next, we will add the `identifier` element and its primitive sub-elements just like we started out doing it for the `requester` element. The `identifier.value` in this case will be `dic.dsf.test`. To understand why, take a look at the topic on [organization identifiers](../concepts/dsf/organization-identifiers.md): +Next, we will add the `identifier` element and its primitive sub-elements just like we started out doing it for the `requester` element. The `identifier.value` in this case will be `dic.dsf.test`. To understand why, take a look at the topic on [organization identifiers](../dsf/organization-identifiers.md): ```xml <Task xmlns="http://hl7.org/fhir"> <meta> @@ -118,7 +118,7 @@ Next, we will add the `identifier` element and its primitive sub-elements just l ``` *Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including the actual value for `Fixed value`.* -You should now be able to fill out all elements in your [Task](../concepts/fhir/task.md) resource until you reach the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../concepts/fhir/task.md) resource should look something like this: +You should now be able to fill out all elements in your [Task](../fhir/task.md) resource until you reach the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../fhir/task.md) resource should look something like this: <details> <summary>Suggested solution</summary> @@ -156,7 +156,7 @@ You should now be able to fill out all elements in your [Task](../concepts/fhir/ ![Forge slice message name](/photos/developer-documentation/forge_slice_message_name.png) -If we were to continue including slices to the [Task](../concepts/fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: +If we were to continue including slices to the [Task](../fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -169,7 +169,7 @@ If we were to continue including slices to the [Task](../concepts/fhir/task.md) </Task> ``` -This approach however, would not work. FHIR processors do not use the name of the slice to map entries in your [Task](../concepts/fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Discriminators define the elements a processor needs to distinguish slices by. You can see how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: +This approach however, would not work. FHIR processors do not use the name of the slice to map entries in your [Task](../fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Discriminators define the elements a processor needs to distinguish slices by. You can see how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: ```xml <Task xmlns="http://hl7.org/fhir"> @@ -186,7 +186,7 @@ This approach however, would not work. FHIR processors do not use the name of th </Task> ``` -Now you should be able to add all remaining mandatory elements to your [Task](../concepts/fhir/task.md) resource on your own. In the end, it should look something like this: +Now you should be able to add all remaining mandatory elements to your [Task](../fhir/task.md) resource on your own. In the end, it should look something like this: <details> <summary>Suggested solution</summary> diff --git a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md b/docs/src/develop/guides/creating-valuesets-for-dsf-processes.md similarity index 62% rename from docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md rename to docs/src/develop/guides/creating-valuesets-for-dsf-processes.md index 3e9398d41..f273196ec 100644 --- a/docs/src/developer-documentation/guides/creating-valuesets-for-dsf-processes.md +++ b/docs/src/develop/guides/creating-valuesets-for-dsf-processes.md @@ -5,8 +5,8 @@ icon: creative ### Creating ValueSets for DSF Processes -You might find yourself in the situation where you need to create a [ValueSet](../concepts/fhir/valueset.md). For example, when adding [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to DSF [Task](../concepts/fhir/task.md) resources, you will also have to reference a [ValueSet](../concepts/fhir/valueset.md) resource in your binding for `Task.input.type` to be able to set the type of your [Input Parameter](../concepts/fhir/task.md#task-input-parameters). [ValueSets](../concepts/fhir/valueset.md) for the DSF differ from regular [ValueSets](../concepts/fhir/valueset.md) in that some element's values are managed by the DSF BPE server. You can use the following template for your -[ValueSet](../concepts/fhir/valueset.md): +You might find yourself in the situation where you need to create a [ValueSet](../fhir/valueset.md). For example, when adding [Input Parameters](../fhir/task.md#task-input-parameters) to DSF [Task](../fhir/task.md) resources, you will also have to reference a [ValueSet](../fhir/valueset.md) resource in your binding for `Task.input.type` to be able to set the type of your [Input Parameter](../fhir/task.md#task-input-parameters). [ValueSets](../fhir/valueset.md) for the DSF differ from regular [ValueSets](../fhir/valueset.md) in that some element's values are managed by the DSF BPE server. You can use the following template for your +[ValueSet](../fhir/valueset.md): ```xml <ValueSet xmlns="http://hl7.org/fhir"> <meta> @@ -36,7 +36,7 @@ You might find yourself in the situation where you need to create a [ValueSet](. </compose> </ValueSet> ``` -Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. The `compose` element defines the codes included in this [ValueSet](../concepts/fhir/valueset.md). It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../concepts/fhir/codesystem.md) and contains a list of `concept` elements which in turn contain the actual `code` element. Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. The `compose` element defines the codes included in this [ValueSet](../fhir/valueset.md). It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../fhir/codesystem.md) and contains a list of `concept` elements which in turn contain the actual `code` element. Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: ```xml <ValueSet xmlns="http://hl7.org/fhir"> ... @@ -58,6 +58,6 @@ Replace dummy values with appropriate values of your own. Do not change elements </compose> </ValueSet> ``` -The DSF BPE server will read your [ValueSet](../concepts/fhir/valueset.md) from `tutorial-process/src/main/resources/fhir/ValueSet`. +The DSF BPE server will read your [ValueSet](../fhir/valueset.md) from `tutorial-process/src/main/resources/fhir/ValueSet`. -You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) on how to create [CodeSystems](../concepts/fhir/codesystem.md). \ No newline at end of file +You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) on how to create [CodeSystems](../fhir/codesystem.md). \ No newline at end of file diff --git a/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md new file mode 100644 index 000000000..a0c8f6120 --- /dev/null +++ b/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -0,0 +1,18 @@ +--- +title: Managing Multiple Incoming Messages and Missing Messages +icon: creative +--- + +### Managing Multiple Incoming Messages and Missing Messages + +If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../fhir/task.md) may never arrive. Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../fhir/task.md) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. + +At the same time, you might also expect to receive one out of a number of different message types at once. + +In order to solve both problems we can add an [Event Based Gateway](../bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: + +<picture> + <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/event_based_gateway_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/event_based_gateway.svg"> + <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/event_based_gateway.svg"> +</picture> diff --git a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md b/docs/src/develop/guides/setting-targets-for-message-events.md similarity index 94% rename from docs/src/developer-documentation/guides/setting-targets-for-message-events.md rename to docs/src/develop/guides/setting-targets-for-message-events.md index d3d3961ee..68db0b1e0 100644 --- a/docs/src/developer-documentation/guides/setting-targets-for-message-events.md +++ b/docs/src/develop/guides/setting-targets-for-message-events.md @@ -9,6 +9,6 @@ Setting a target for a message event requires a `Target` object. To create one, #### 1. Adding the target in the message event implementation In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, add your targets and then call the super-method. #### 2. Adding the target in a service task right before the message event -This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../concepts/bpmn/service-tasks.md). +This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../bpmn/service-tasks.md). In both cases you can access methods to create and set `targets` through the `Variables` instance. diff --git a/docs/src/develop/guides/starting-a-process-via-task-resources.md b/docs/src/develop/guides/starting-a-process-via-task-resources.md new file mode 100644 index 000000000..baa36a7bb --- /dev/null +++ b/docs/src/develop/guides/starting-a-process-via-task-resources.md @@ -0,0 +1,43 @@ +--- +title: Starting a Process via Task Resources +icon: creative +--- + +### Starting a Process via Task Resources + +To start a BPMN process, you need to create new a [Task](../fhir/task.md) resource in the DSF FHIR server by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) +a resource for the first time. Also, remember that the [Task](../fhir/task.md) resource you are sending needs to comply to the [Task](../fhir/task.md) profile of the process you want to start and the [ActivityDefinition's](../fhir/activitydefinition.md) authorization rules. +There are two major ways of making this HTTP request: +1. Using cURL +2. Using the DSF FHIR server's web interface + +#### Using cURL +In order to use cURL, you will have to create an appropriate [Task](../fhir/task.md) resource to post to the DSF FHIR server. There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), or you can check the solution branches for this file if you need ideas on how to fill it out properly. + +Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the instance you want to address. + +##### Linux: +```shell +curl https://<instance-host-name>/fhir/Task \ +--cacert <path/to/ca-certificate-file.pem> \ +--cert <path/to/client-certificate-file.pem>:password \ +--key <path/to/client-private-key-file.pem> \ +-H "Content-Type: application/fhir+xml" \ +-H "Accept: application/fhir+xml" \ +-d @<path/to/example-task.xml> +``` +##### Windows CMD: +```shell +curl https://<instance-host-name>/fhir/Task ^ +--cacert <path/to/ca-certificate-file.pem> ^ +--cert <path/to/client-certificate-file.pem>:password ^ +--key <path/to/client-private-key-file.pem> ^ +-H "Content-Type: application/fhir+xml" ^ +-H "Accept: application/fhir+xml" ^ +-d @<path/to/example-task.xml> +``` +*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* + +#### Using the DSF FHIR Server's Web Interface + +When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../dsf/draft-task-resources.md). These [Task](../fhir/task.md) resources act like a template you can use to instantiate [Task](../fhir/task.md) resources which start BPMN processes. Instead of querying the DSF FHIR server manually, you can use a predefined bookmark to navigate to the query URL. You can find a list of Bookmarks in the top right corner of the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under the `Task` section, and you will be taken to the list of all [Draft Task Resources](../dsf/draft-task-resources.md). Once there, you can select the one which starts your BPMN process. It will take you to a detailed view of the resource where you will also have the chance to fill any [Task Input Parameters](../fhir/task.md#task-input-parameters) you might need to specify. If everything is filled out correctly, you may start your process by clicking `Start Process`. Keep in mind that, for [Draft Task Resources](../dsf/draft-task-resources.md) to be available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. Take a look at [the Process Plugin Definition](../dsf/process-plugin-definition.md) if you need a reminder. \ No newline at end of file diff --git a/docs/src/develop/index.md b/docs/src/develop/index.md new file mode 100644 index 000000000..2f367396e --- /dev/null +++ b/docs/src/develop/index.md @@ -0,0 +1,4 @@ +--- +title: Developer Documentation +icon: creative +--- \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/gateways.md b/docs/src/developer-documentation/concepts/bpmn/gateways.md deleted file mode 100644 index 5b17a4205..000000000 --- a/docs/src/developer-documentation/concepts/bpmn/gateways.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Gateways -icon: creative ---- - -### Gateways - -[Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](../../concepts/bpmn/sequence-flow.md). Different types of gateways will be useful for different scenarios. - -#### Exclusive Gateways - -[Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](../../concepts/bpmn/sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence Flow Exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](../../concepts/bpmn/sequence-flow.md) by selecting a [Sequence Flow](../../concepts/bpmn/sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](../../concepts/bpmn/conditions.md). - -#### Event-based Gateway - -The [Event-based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/bpmn/intro.md b/docs/src/developer-documentation/concepts/bpmn/intro.md deleted file mode 100644 index aa901e9da..000000000 --- a/docs/src/developer-documentation/concepts/bpmn/intro.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Introduction -icon: creative ---- - -The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md b/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md deleted file mode 100644 index 8ca7c542d..000000000 --- a/docs/src/developer-documentation/concepts/dsf/about-version-placeholders-and-urls.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: About Versions, Placeholders und URLs -icon: creative ---- - -### About Versions, Placeholders and URLs - -#### Version Pattern - -Process plugin versions have to obey the pattern: -``` -\d+\.\d+\.\d+\.\d+ Example: 1.0.1.2 -``` - -The first two numbers (`1.0`) are used in FHIR resources and signal changes which break compatibility with previous process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`1.2`) signal changes which do not break compatibility with previous process versions. Specifically, the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. - -#### Placeholders - -To avoid the need to specify the version and release date, the placeholders `#{version}` and `#{date}` can be used when creating FHIR resources or even in BPMN models. They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. There is also a placeholder for the organization the DSF instance is running in: `#{organization}`. You would typically use this placeholder in [Draft Task Resources](draft-task-resources.md) but like the other placeholders, it can be used anywhere as long as the file gets loaded by the [BPE](https://dsf.dev/intro/info/architecture.html#business-process-engine-bpe). - -#### URLs - -BPMN models have an ID we call process definition key. The BPMN process definition key needs to be specified following the pattern: -``` -^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey -``` -In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](../../concepts/dsf/about-version-placeholders-and-urls.md#placeholders) for this as well. The DSF will also reference this process in URL form in FHIR resources: -``` -http://domain.org/bpe/Process/processKey|1.0 -``` - -As you can see, the version in the URL ``|1.0`` only uses the resource version and omits the code base version. As mentioned in [Version Pattern](about-version-placeholders-and-urls.md#version-pattern), this means that only changes to the first two version numbers are significant to signal compatibility when communicating with other process plugin instances. The process definition key and URL are also related to each other. The DSF will try to match BPMN models to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey the pattern above. - -You will use the above URL as your instantiatesCanonical value for [Task](../../concepts/fhir/task.md) profile definitions as well as references to [Task](../../concepts/fhir/task.md) profiles in other resources. You will also use it as the URL value for your [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). In this case though, you have to split up the URL into two parts. You will separate the version (``|1.0``) from the URL and use it as a value for the `ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` [placeholder](about-version-placeholders-and-urls.md#placeholders) here instead. Going by the example from above, you will be left with a URL that looks like this: -``` -http://domain.org/bpe/Process/processKey -``` -This will be the value for your `ActivityDefinition.url` element with `#{version}` as the value for your `ActivityDefinition.version` element. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md b/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md deleted file mode 100644 index ce456d542..000000000 --- a/docs/src/developer-documentation/concepts/dsf/bpmn-process-variables.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: BPMN Process Variables -icon: creative ---- - -### BPMN Process Variables - -BPMN process variables hold additional information which has to be available during BPMN process execution. Variables can be directly related to BPMN elements like the boolean value for [Conditions](../../concepts/bpmn/conditions.md), but do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. They are accessible during the entirety of the execution to all [Service](../../concepts/dsf/service-delegates.md) / [Message](../../concepts/dsf/message-delegates.md) Delegates. - -You can learn how to access to the BPMN process variables [here](../../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md b/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md deleted file mode 100644 index 4f0444422..000000000 --- a/docs/src/developer-documentation/concepts/dsf/draft-task-resources.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Draft Task Resources -icon: creative ---- - -### Draft Task Resources - -[Task](../../concepts/fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. Compared to regular [Task](../../concepts/fhir/task.md) resources used to start BPMN processes, this type of [Task](../../concepts/fhir/task.md) resource requires the status `draft` instead the usual `requested`. It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. Additionally, it requires setting the `Task.identifier` element. It should look something like this: - -```xml -<identifier> - <system value="http://dsf.dev/sid/task-identifier" /> - <value value="http://dsf.dev/bpe/Process/processKey/#{version}/task-name" /> -</identifier> -``` -`processKey` should be the same one used in [URLs](../../concepts/dsf/about-version-placeholders-and-urls.md#urls). -`task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. - -For a complete example you can take a look at the Draft Task Resource in one of the solution branches and compare it to the one needed for cURL. The [Task](../../concepts/fhir/task.md) resource created for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. - -You might also want to check out [this guide](../../guides/creating-task-resources-based-on-a-definition.md) if you do not know how to create [Task](../../concepts/fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/message-delegates.md b/docs/src/developer-documentation/concepts/dsf/message-delegates.md deleted file mode 100644 index a5aada5d0..000000000 --- a/docs/src/developer-documentation/concepts/dsf/message-delegates.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Message Delegates -icon: creative ---- - -### Message Delegates - -Message Delegates are the Java representation of the [Message Events](../../concepts/bpmn/messaging.md) in your BPMN model. You link a Message Delegate to a certain [Message Event](../../concepts/bpmn/messaging.md) by selecting the Message Event in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: -``` -org.package.myClass -``` - -You will only need Message Delegates for [Message Send Events](../../concepts/bpmn/messaging.md). Incoming messages will be resolved to the correct [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) automatically using [Message Correlation](../../concepts/dsf/message-correlation.md) and the message inputs will be added to that execution's [process variables](../../concepts/dsf/bpmn-process-variables.md). - -To make a Message Delegate for [Message Send Events](../../concepts/bpmn/messaging.md), your Java class needs to extend `AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting the `doExecute` method like with [Service Delegates](../../concepts/dsf/service-delegates.md). Instead, you most likely want to aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the `getAdditionalInputParamters` method. The DSF translates BPMN messages into FHIR [Task](../../concepts/fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../../concepts/fhir/task.md#task-input-parameters), hence the name of the method. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). diff --git a/docs/src/developer-documentation/concepts/dsf/process-api.md b/docs/src/developer-documentation/concepts/dsf/process-api.md deleted file mode 100644 index 24774372e..000000000 --- a/docs/src/developer-documentation/concepts/dsf/process-api.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: DSF Process API Package -icon: creative ---- - -### DSF Process API Package - -The [DSF Process API package](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. This includes for example the `Variables` class, which provides access to the [BPMN process variables](../../concepts/dsf/bpmn-process-variables.md). - -#### Process Plugin Api -When creating [Service Delegates](../../concepts/dsf/service-delegates.md) or [Message Delegates](../../concepts/dsf/message-delegates.md) you wil notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. -This API instance provides a variety of utility classes: -- `ProxyConfig`**:** forward proxy configuration -- `EndpointProvider`**:** access to Endpoint resources -- `FhirContext`**:** HAPI FHIR Context for parsing/serializing -- `FhirWebserviceClientProvider`**:** Webservice client to access DSF FHIR server -- `MailService`**:** for sending automatic E-Mails (if configured) -- `OrganizationProvider`**:** access to Organization resources -- `Variables`**:** access to BPMN execution variables \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md b/docs/src/developer-documentation/concepts/dsf/read-access-tag.md deleted file mode 100644 index 98c947241..000000000 --- a/docs/src/developer-documentation/concepts/dsf/read-access-tag.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Read Access Tag -icon: creative ---- - -### Read Access Tag - -Axiomatically, nobody is allowed to write FHIR resources (except [Task](../../concepts/fhir/task.md)) to the DSF FHIR server unless it is your own organization. By default, the same applies to reading FHIR resources (again except [Task](../../concepts/fhir/task.md)). But since the DSF is often used to offer medical data in form of FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the exception of [Task](../../concepts/fhir/task.md) resources. We will explain the reason for this exception shortly. For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: - -```xml -<meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> -</meta> -``` -You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). - -The read access rules for [Task](../../concepts/fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../../concepts/fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. - -It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../../guides/configuring-the-read-access-tag.md). diff --git a/docs/src/developer-documentation/concepts/dsf/service-delegates.md b/docs/src/developer-documentation/concepts/dsf/service-delegates.md deleted file mode 100644 index e39c4bd69..000000000 --- a/docs/src/developer-documentation/concepts/dsf/service-delegates.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Service Delegates -icon: creative ---- - -### Service Delegates - -Service Delegates are the Java representation of the [Service Tasks](../../concepts/bpmn/service-tasks.md) in your BPMN model. You link a Service Delegate to a certain [Service Task](../../concepts/bpmn/service-tasks.md) by selecting the [Service Task](../../concepts/bpmn/service-tasks.md) in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: -``` -org.package.myClass -``` -All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](../../concepts/dsf/bpmn-process-execution.md) arrives at the [Service Task](../../concepts/bpmn/service-tasks.md) your Service Delegate is linked to. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](../../concepts/dsf/process-api.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md b/docs/src/developer-documentation/concepts/fhir/activitydefinition.md deleted file mode 100644 index 4a5bf5e1b..000000000 --- a/docs/src/developer-documentation/concepts/fhir/activitydefinition.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: ActivityDefinition -icon: creative ---- - -### ActivityDefinition - -[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. - - -The most important elements in ActivityDefinitions are: -- `message-name` -- `task-profile` -- `requester` -- `recipient` - -The `message-name` element contains the name of the [BPMN message start event](../../concepts/bpmn/messaging.md#message-start-event) or [BPMN message intermediate catching event](../../concepts/bpmn/messaging.md#message-intermediate-catching-event) which expects a [Task](../../concepts/fhir/task.md) resource complying to the profile defined by `task-profile`. - -The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. - -You will have to create your own [ActivityDefinitions](../../concepts/fhir/activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../../guides/creating-an-activity-definition.md). - -You can also find examples for all possible `requester` and `recipient` elements [here](../../concepts/dsf/examples-for-requester-and-recipient-elements.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/concepts/fhir/introduction.md b/docs/src/developer-documentation/concepts/fhir/introduction.md deleted file mode 100644 index 19d3e9b23..000000000 --- a/docs/src/developer-documentation/concepts/fhir/introduction.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Introduction -icon: creative ---- - -## FHIR Introduction - -The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](../../concepts/fhir/activitydefinition.md), [Tasks](../../concepts/fhir/task.md), [CodeSystems](../../concepts/fhir/codesystem.md) and [ValueSets](../../concepts/fhir/valueset.md). There is also a catalogue of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). diff --git a/docs/src/developer-documentation/concepts/fhir/valueset.md b/docs/src/developer-documentation/concepts/fhir/valueset.md deleted file mode 100644 index 918ec2ffe..000000000 --- a/docs/src/developer-documentation/concepts/fhir/valueset.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: ValueSet -icon: creative ---- - -### ValueSet - -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](../../concepts/fhir/codesystem.md) to coded elements like `code`, `Coding` or `CodeableConcept`. - -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](../../concepts/fhir/codesystem.md) in your [Task](../../concepts/fhir/task.md) profiles. \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md b/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md deleted file mode 100644 index 97e355c9f..000000000 --- a/docs/src/developer-documentation/guides/accessing-bpmn-process-variables.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Accessing BPMN Process Variables -icon: creative ---- - -### Accessing BPMN Process Variables - -After creating a [Service Delegate](../concepts/dsf/service-delegates.md) or [Message Delegate](../concepts/dsf/message-delegates.md), you might want to retrieve data from or store data in the [BPMN process variables](../concepts/dsf/bpmn-process-variables.md).You can achieve this either through the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) or via the `Variables` class. -*It is very much recommended you use the latter method*. -The `Variables` class provides lots of utility methods to read or write certain types of [BPMN process variables](../concepts/dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../concepts/dsf/bpmn-process-execution.md) to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md b/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md deleted file mode 100644 index 98f3fa352..000000000 --- a/docs/src/developer-documentation/guides/accessing-task-resources-during-execution.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Accessing Task Resources During Execution -icon: creative ---- - -### Accessing Task Resources During Execution - -If you want access to the [Task](../concepts/fhir/task.md) resources in your [Service](../concepts/dsf/service-delegates.md) / [Message](../concepts/dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../concepts/fhir/task.md) resources. The most commonly used ones are the start [Task](../concepts/fhir/task.md), referring to the [Task](../concepts/fhir/task.md) / [Message Start Event](../concepts/bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../concepts/fhir/task.md), referring to most recently received [Task](../concepts/fhir/task.md) / Message. -In principle, this is sufficient to access all information in a [Task](../concepts/fhir/task.md) resource, since you have the [Task](../concepts/fhir/task.md) resource's Java object, but very cumbersome. -Instead of navigating the [Task](../concepts/fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../concepts/dsf/process-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../concepts/fhir/task.md) resources. -The most common use case for this is retrieving data from a [Task's](../concepts/fhir/task.md) [Input Parameter](../concepts/fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../concepts/fhir/task.md#task-input-parameters) for a [Message Delegate's](../concepts/dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../concepts/fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../concepts/fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../concepts/fhir/codesystem.md) and Code to any [Input Parameter](../concepts/fhir/task.md#task-input-parameters) of the provided [Task](../concepts/fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. -To create new [Input Parameters](../concepts/fhir/task.md#task-input-parameters) to attach to a [Task](../concepts/fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../concepts/dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md deleted file mode 100644 index 5cf1241df..000000000 --- a/docs/src/developer-documentation/guides/managing-mutiple-incoming-messages-and-missing-messages.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Managing Multiple Incoming Messages and Missing Messages -icon: creative ---- - -### Managing Multiple Incoming Messages and Missing Messages - -If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../concepts/fhir/task.md) may never arrive. Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../concepts/fhir/task.md) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. - -At the same time, you might also expect to receive one out of a number of different message types at once. - -In order to solve both problems we can add an [Event Based Gateway](../concepts/bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../concepts/fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../concepts/bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: - -<picture> - <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/event_based_gateway_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/event_based_gateway.svg"> - <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/event_based_gateway.svg"> -</picture> diff --git a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md b/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md deleted file mode 100644 index c16336561..000000000 --- a/docs/src/developer-documentation/guides/starting-a-process-via-task-resources.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Starting a Process via Task Resources -icon: creative ---- - -### Starting a Process via Task Resources - -To start a BPMN process, you need to create new a [Task](../concepts/fhir/task.md) resource in the DSF FHIR server by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) -a resource for the first time. Also, remember that the [Task](../concepts/fhir/task.md) resource you are sending needs to comply to the [Task](../concepts/fhir/task.md) profile of the process you want to start and the [ActivityDefinition's](../concepts/fhir/activitydefinition.md) authorization rules. -There are two major ways of making this HTTP request: -1. Using cURL -2. Using the DSF FHIR server's web interface - -#### Using cURL -In order to use cURL, you will have to create an appropriate [Task](../concepts/fhir/task.md) resource to post to the DSF FHIR server. There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), or you can check the solution branches for this file if you need ideas on how to fill it out properly. - -Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the instance you want to address. - -##### Linux: -```shell -curl https://<instance-host-name>/fhir/Task \ ---cacert <path/to/ca-certificate-file.pem> \ ---cert <path/to/client-certificate-file.pem>:password \ ---key <path/to/client-private-key-file.pem> \ --H "Content-Type: application/fhir+xml" \ --H "Accept: application/fhir+xml" \ --d @<path/to/example-task.xml> -``` -##### Windows CMD: -```shell -curl https://<instance-host-name>/fhir/Task ^ ---cacert <path/to/ca-certificate-file.pem> ^ ---cert <path/to/client-certificate-file.pem>:password ^ ---key <path/to/client-private-key-file.pem> ^ --H "Content-Type: application/fhir+xml" ^ --H "Accept: application/fhir+xml" ^ --d @<path/to/example-task.xml> -``` -*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* - -#### Using the DSF FHIR Server's Web Interface - -When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). These [Task](../concepts/fhir/task.md) resources act like a template you can use to instantiate [Task](../concepts/fhir/task.md) resources which start BPMN processes. Instead of querying the DSF FHIR server manually, you can use a predefined bookmark to navigate to the query URL. You can find a list of Bookmarks in the top right corner of the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under the `Task` section, and you will be taken to the list of all [Draft Task Resources](../concepts/dsf/draft-task-resources.md). Once there, you can select the one which starts your BPMN process. It will take you to a detailed view of the resource where you will also have the chance to fill any [Task Input Parameters](../concepts/fhir/task.md#task-input-parameters) you might need to specify. If everything is filled out correctly, you may start your process by clicking `Start Process`. Keep in mind that, for [Draft Task Resources](../concepts/dsf/draft-task-resources.md) to be available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. Take a look at [the Process Plugin Definition](../concepts/dsf/the-process-plugin-definition.md) if you need a reminder. \ No newline at end of file From 817a7abb7fe43ce0e54fa83eefcc6feb955cb913 Mon Sep 17 00:00:00 2001 From: Hauke Hund <hauke.hund@hs-heilbronn.de> Date: Mon, 27 May 2024 16:29:07 +0200 Subject: [PATCH 11/42] added index.md files, renamed some files --- docs/src/.vuepress/theme.ts | 4 +- docs/src/develop/bpmn/index.md | 2 - docs/src/develop/dsf/index.md | 20 +++++++++ docs/src/develop/dsf/read-access-tag.md | 2 +- .../develop/dsf/requester-and-recipient.md | 2 +- docs/src/develop/fhir/activitydefinition.md | 2 +- docs/src/develop/fhir/index.md | 2 - ...tag.md => configuring-read-access-tags.md} | 4 +- ...on.md => creating-activity-definitions.md} | 4 +- docs/src/develop/guides/index.md | 17 +++++++ docs/src/develop/index.md | 45 ++++++++++++++++++- 11 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 docs/src/develop/dsf/index.md rename docs/src/develop/guides/{configuring-the-read-access-tag.md => configuring-read-access-tags.md} (99%) rename docs/src/develop/guides/{creating-an-activity-definition.md => creating-activity-definitions.md} (99%) create mode 100644 docs/src/develop/guides/index.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 294952f58..5471478a4 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -879,14 +879,14 @@ export default hopeTheme({ icon: "creative", prefix: "dsf/", link: "dsf/", - children: ["versions-placeholders-urls.md", "bpmn-process-execution.md", "bpmn-process-variables.md", "draft-task-resources.md", "environment-variables.md", "requester-and-recipient.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-plugin-api.md", "read-access-tag.md", "service-delegates.md", "spring-framework-integration.md", "process-plugin-definition.md"], + children: ["bpmn-process-execution.md", "bpmn-process-variables.md", "draft-task-resources.md", "environment-variables.md", "message-correlation.md", "message-delegates.md", "organization-identifiers.md", "process-plugin-api.md", "process-plugin-definition.md", "read-access-tag.md", "requester-and-recipient.md", "service-delegates.md", "spring-framework-integration.md", "versions-placeholders-urls.md"], }, { text: "Guides", icon: "creative", prefix: "guides/", link: "guides/", - children: ["accessing-bpmn-process-variables.md", "accessing-task-resources-during-execution.md", "adding-task-input-parameters-to-task-profiles.md", "configuring-the-read-access-tag.md", "creating-an-activity-definition.md", "creating-codesystems-for-dsf-processes.md", "creating-task-resources-based-on-a-definition.md", "creating-valuesets-for-dsf-processes.md", "managing-mutiple-incoming-messages-and-missing-messages.md", "setting-targets-for-message-events.md", "starting-a-process-via-task-resources.md"] + children: ["accessing-bpmn-process-variables.md", "accessing-task-resources-during-execution.md", "adding-task-input-parameters-to-task-profiles.md", "configuring-read-access-tags.md", "creating-activity-definitions.md", "creating-codesystems-for-dsf-processes.md", "creating-task-resources-based-on-a-definition.md", "creating-valuesets-for-dsf-processes.md", "managing-mutiple-incoming-messages-and-missing-messages.md", "setting-targets-for-message-events.md", "starting-a-process-via-task-resources.md"] }] } ], diff --git a/docs/src/develop/bpmn/index.md b/docs/src/develop/bpmn/index.md index 0a79690de..d74ae074d 100644 --- a/docs/src/develop/bpmn/index.md +++ b/docs/src/develop/bpmn/index.md @@ -4,11 +4,9 @@ icon: creative --- ## Introduction - The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. ## Details - - [Conditions](conditions.md) - [Gateways](gateways.md) - [Messaging](messaging.md) diff --git a/docs/src/develop/dsf/index.md b/docs/src/develop/dsf/index.md new file mode 100644 index 000000000..f70d7104e --- /dev/null +++ b/docs/src/develop/dsf/index.md @@ -0,0 +1,20 @@ +--- +title: DSF +icon: creative +--- + +## Details +- [BPMN Process Execution](bpmn-process-execution.md) +- [BPMN Process Variables](bpmn-process-variables.md) +- [Draft Task Resources](draft-task-resources.md) +- [Environment Variables](environment-variables.md) +- [Message Correlation](message-correlation.md) +- [Message Delegates](message-delegates.md) +- [Organization Identifiers](organization-identifiers.md) +- [Process Plugin API](process-plugin-api.md) +- [Process Plugin Definition](process-plugin-definition.md) +- [Read Access Tag](read-access-tag.md) +- [Requester and Recipient](requester-and-recipient.md) +- [Service Delegates](service-delegates.md) +- [Spring Framework Integration](spring-framework-integration.md) +- [Versions, Placeholders and URLs](versions-placeholders-urls.md) \ No newline at end of file diff --git a/docs/src/develop/dsf/read-access-tag.md b/docs/src/develop/dsf/read-access-tag.md index 4a69b6dc5..47a02b2c1 100644 --- a/docs/src/develop/dsf/read-access-tag.md +++ b/docs/src/develop/dsf/read-access-tag.md @@ -19,4 +19,4 @@ You can find all codes for the Read Access Tag in its [CodeSystem](https://githu The read access rules for [Task](../fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. -It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../guides/configuring-the-read-access-tag.md). +It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../guides/configuring-read-access-tags.md). diff --git a/docs/src/develop/dsf/requester-and-recipient.md b/docs/src/develop/dsf/requester-and-recipient.md index fbbd79c3b..8407bb318 100644 --- a/docs/src/develop/dsf/requester-and-recipient.md +++ b/docs/src/develop/dsf/requester-and-recipient.md @@ -1,5 +1,5 @@ --- -title: Requester and Recipient Elements +title: Requester and Recipient icon: creative --- diff --git a/docs/src/develop/fhir/activitydefinition.md b/docs/src/develop/fhir/activitydefinition.md index 97e0956a3..5cd27ca91 100644 --- a/docs/src/develop/fhir/activitydefinition.md +++ b/docs/src/develop/fhir/activitydefinition.md @@ -18,6 +18,6 @@ The `message-name` element contains the name of the [BPMN message start event](. The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. -You will have to create your own [ActivityDefinitions](activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../guides/creating-an-activity-definition.md). +You will have to create your own [ActivityDefinitions](activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../guides/creating-activity-definitions.md). You can also find examples for all possible `requester` and `recipient` elements [here](../dsf/requester-and-recipient.md). \ No newline at end of file diff --git a/docs/src/develop/fhir/index.md b/docs/src/develop/fhir/index.md index 719581424..47e4a6cda 100644 --- a/docs/src/develop/fhir/index.md +++ b/docs/src/develop/fhir/index.md @@ -4,11 +4,9 @@ icon: creative --- ## Introduction - The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](activitydefinition.md), [CodeSystems](codesystem.md), [Tasks](task.md) and [ValueSets](valueset.md). There is also a catalog of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). ## Details - - [ActivityDefinition](activitydefinition.md) - [CodeSystem](codesystem.md) - [Task](task.md) diff --git a/docs/src/develop/guides/configuring-the-read-access-tag.md b/docs/src/develop/guides/configuring-read-access-tags.md similarity index 99% rename from docs/src/develop/guides/configuring-the-read-access-tag.md rename to docs/src/develop/guides/configuring-read-access-tags.md index 28a0bdf35..404f2286e 100644 --- a/docs/src/develop/guides/configuring-the-read-access-tag.md +++ b/docs/src/develop/guides/configuring-read-access-tags.md @@ -1,9 +1,9 @@ --- -title: Configuring the Read Access Tag +title: Configuring Read Access Tags icon: creative --- -### Configuring the Read Access Tag +### Configuring Read Access Tags To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../dsf/read-access-tag.md) and choose one of the codes from it: ```xml diff --git a/docs/src/develop/guides/creating-an-activity-definition.md b/docs/src/develop/guides/creating-activity-definitions.md similarity index 99% rename from docs/src/develop/guides/creating-an-activity-definition.md rename to docs/src/develop/guides/creating-activity-definitions.md index 5e485da52..40a7cfb2e 100644 --- a/docs/src/develop/guides/creating-an-activity-definition.md +++ b/docs/src/develop/guides/creating-activity-definitions.md @@ -1,9 +1,9 @@ --- -title: Creating an ActivityDefinition +title: Creating ActivityDefinitions icon: creative --- -### Creating an ActivityDefinition +### Creating ActivityDefinitions This guide will teach you how to create an ActivityDefinition based on the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile for your process plugin. It is divided into steps for each of the main components of ActivityDefinitions: diff --git a/docs/src/develop/guides/index.md b/docs/src/develop/guides/index.md new file mode 100644 index 000000000..2841de106 --- /dev/null +++ b/docs/src/develop/guides/index.md @@ -0,0 +1,17 @@ +--- +title: Guides +icon: creative +--- + +## Details +- [Accessing BPMN Process Variables](accessing-bpmn-process-variables.md) +- [Accessing Task Resources During Execution](accessing-task-resources-during-execution.md) +- [Adding Task Input Parameters to Task Profiles](adding-task-input-parameters-to-task-profiles.md) +- [Configuring Read Access Tags](configuring-read-access-tags.md) +- [Creating ActivityDefinitions](creating-activity-definitions.md) +- [Creating CodeSystems for DSF Processes](creating-codesystems-for-dsf-processes.md) +- [Creating Task Resources Based on a Definition](creating-task-resources-based-on-a-definition.md) +- [Creating ValueSets for DSF Processes](creating-valuesets-for-dsf-processes.md) +- [Managing Multiple Incoming Messages and Missing Messages](managing-mutiple-incoming-messages-and-missing-messages.md) +- [Setting Targets for Message Events](setting-targets-for-message-events.md) +- [Starting a Process via Task Resources](starting-a-process-via-task-resources.md) \ No newline at end of file diff --git a/docs/src/develop/index.md b/docs/src/develop/index.md index 2f367396e..ca799dea6 100644 --- a/docs/src/develop/index.md +++ b/docs/src/develop/index.md @@ -1,4 +1,47 @@ --- title: Developer Documentation icon: creative ---- \ No newline at end of file +--- + +## BPMN +- [Conditions](bpmn/conditions.md) +- [Gateways](bpmn/gateways.md) +- [Messaging](bpmn/messaging.md) +- [Sequence Flow](bpmn/sequence-flow.md) +- [Service Tasks](bpmn/service-tasks.md) +- [Timer Intermediate Catching Events](bpmn/timer-intermediate-catching-events.md) + +## FHIR +- [ActivityDefinition](fhir/activitydefinition.md) +- [Codesystem](fhir/codesystem.md) +- [Task](fhir/task.md) +- [ValueSet](fhir/valueset.md) + +## DSF +- [BPMN Process Execution](dsf/bpmn-process-execution.md) +- [BPMN Process Variables](dsf/bpmn-process-variables.md) +- [Draft Task Resources](dsf/draft-task-resources.md) +- [Environment Variables](dsf/environment-variables.md) +- [Message Correlation](dsf/message-correlation.md) +- [Message Delegates](dsf/message-delegates.md) +- [Organization Identifiers](dsf/organization-identifiers.md) +- [Process Plugin API](dsf/process-plugin-api.md) +- [Process Plugin Definition](dsf/process-plugin-definition.md) +- [Read Access Tag](dsf/read-access-tag.md) +- [Requester and Recipient](dsf/requester-and-recipient.md) +- [Service Delegates](dsf/service-delegates.md) +- [Spring Framework Integration](dsf/spring-framework-integration.md) +- [Versions, Placeholders and URLs](dsf/versions-placeholders-urls.md) + +## Guides +- [Accessing BPMN Process Variables](guides/accessing-bpmn-process-variables.md) +- [Accessing Task Resources During Execution](guides/accessing-task-resources-during-execution.md) +- [Adding Task Input Parameters to Task Profiles](guides/adding-task-input-parameters-to-task-profiles.md) +- [Configuring Read Access Tags](guides/configuring-read-access-tags.md) +- [Creating ActivityDefinitions](guides/creating-activity-definitions.md) +- [Creating CodeSystems for DSF Processes](guides/creating-codesystems-for-dsf-processes.md) +- [Creating Task Resources Based on a Definition](guides/creating-task-resources-based-on-a-definition.md) +- [Creating ValueSets for DSF Processes](guides/creating-valuesets-for-dsf-processes.md) +- [Managing Multiple Incoming Messages and Missing Messages](guides/managing-mutiple-incoming-messages-and-missing-messages.md) +- [Setting Targets for Message Events](guides/setting-targets-for-message-events.md) +- [Starting a Process via Task Resources](guides/starting-a-process-via-task-resources.md) \ No newline at end of file From 3e3a14ce6e389ba93538246c593efb7d9a989669 Mon Sep 17 00:00:00 2001 From: Serap Aydin <saydin3@stud.hs-heilbronn.de> Date: Wed, 21 May 2025 12:26:47 +0200 Subject: [PATCH 12/42] - dsf.dev 2.0 Website restructuring - created new folders - enabled blog-plugin --- docs/package-lock.json | 1 + docs/src/.vuepress/config.ts | 3 +- .../ImplementationGuide/dev.dsf/index.html | 1 + docs/src/.vuepress/theme.ts | 61 +- docs/src/about/README.md | 11 - docs/src/community/README.md | 21 + .../learnmore => community/about}/README.md | 5 +- .../learnmore => community/about}/contact.md | 0 docs/src/community/about/faq.md | 6 + .../learnmore => community/about}/partners.md | 0 docs/src/community/about/projectlist.md | 6 + .../learnmore => community/about}/public.md | 0 .../learnmore => community/about}/team.md | 0 docs/src/community/communications.md | 0 docs/src/community/contribute/README.md | 12 + .../{v1.7.1 => community}/contribute/code.md | 6 +- .../contribute/contribute.md} | 0 .../contribute/documentation.md | 5 +- docs/src/community/dsf-ecosystem.md | 0 .../events}/tutorials/GMDS2022-dev.md | 0 .../events}/tutorials/MIE2023.md | 0 .../events}/tutorials/README.md | 0 .../events}/tutorials/Talks.md | 0 .../index.md => community/speakinghours.md} | 0 docs/src/dsf-development/README.md | 0 docs/src/dsf-development/v2/fhir-ig.md | 0 docs/src/{intro => explore}/README.md | 2 +- .../concepts/allow-list.md} | 0 .../info => explore/concepts}/architecture.md | 0 .../info => explore/concepts}/basics.md | 0 .../info => explore/concepts}/introduction.md | 0 .../concepts/network-setup.md} | 0 .../concepts}/process-plugins.md | 0 .../info => explore/concepts}/security.md | 0 docs/src/explore/publications/README.md | 7 + docs/src/explore/publications/awards.md | 8 + .../publications}/publications.md | 0 .../{intro => explore}/use-cases/README.md | 0 .../use-cases/feasibility.md | 0 .../use-cases/internal-mii-data-sharing.md | 0 docs/src/{intro => explore}/use-cases/num.md | 0 docs/src/network-operations/README.md | 0 docs/src/oldstable/README.md | 13 - docs/src/oldstable/build/README.md | 7 - docs/src/oldstable/build/build.md | 86 - docs/src/oldstable/build/proxyTestTool.md | 13 - .../src/oldstable/build/releaseANewVersion.md | 43 - docs/src/oldstable/code/README.md | 12 - docs/src/oldstable/code/addingANewFhirR.md | 48 - .../src/oldstable/code/addingANewMpiClient.md | 16 - .../oldstable/code/addingANewOpenEhrClient.md | 16 - .../oldstable/code/changingBpmnProcesses.md | 13 - docs/src/oldstable/code/code.md | 22 - docs/src/oldstable/code/eclipseContent.md | 330 - docs/src/oldstable/code/intelliJContent.md | 75 - docs/src/oldstable/code/libraries.md | 4 - .../src/oldstable/code/usingTheGitHubMaven.md | 59 - .../oldstable/generalinformation/README.md | 6 - .../generalinformation/authentication.md | 25 - .../generalinformation/networkSetup.md | 68 - docs/src/oldstable/introduction.md | 8 - docs/src/oldstable/releases/README.md | 14 - docs/src/oldstable/releases/configBpe.md | 482 - docs/src/oldstable/releases/configFhir.md | 194 - .../releases/configFhirReverseProxy.md | 72 - docs/src/oldstable/releases/highmedInstall.md | 259 - .../oldstable/releases/num-codexInstall.md | 246 - docs/src/oldstable/releases/upgradeFrom7.md | 205 - docs/src/oldstable/releases/upgradeFrom8.md | 135 - docs/src/oldstable/releases/upgradeFrom90.md | 104 - docs/src/oldstable/releases/upgradeFrom91.md | 72 - docs/src/oldstable/releases/upgradeFrom92.md | 72 - docs/src/oldstable/tutorial/README.md | 39 - .../tutorial/ex11-docker-composeyml.md | 469 - .../tutorial/exercise1-simpleProcess.md | 89 - .../tutorial/exercise11-processDebugging.md | 47 - .../tutorial/exercise2-inputParameters.md | 109 - .../tutorial/exercise3-messageEvents.md | 185 - .../tutorial/exercise4-exclusiveGateways.md | 82 - .../tutorial/exercise5-eventBasedGateways.md | 204 - docs/src/oldstable/tutorial/prerequisites.md | 89 - docs/src/operations/get-started.md | 1 + .../operations/process-plugin-deployment.md | 0 .../v1}/v1.0.0/develop/README.md | 0 .../v1}/v1.0.0/develop/create.md | 0 .../v1}/v1.0.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.0.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.0.0/index.md | 0 .../v1}/v1.0.0/maintain/README.md | 0 .../v1}/v1.0.0/maintain/allowList-mgm.md | 0 .../v1.0.0/maintain/configuration/README.md | 0 .../v1}/v1.0.0/maintain/configuration/bpe.md | 0 .../v1.0.0/maintain/configuration/common.md | 0 .../v1}/v1.0.0/maintain/configuration/fhir.md | 0 .../maintain/configuration/reverseproxy.md | 0 .../v1}/v1.0.0/maintain/install.md | 0 .../v1}/v1.0.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.0.0/process-plugins-advanced.md | 0 .../v1}/v1.1.0/develop/README.md | 0 .../v1}/v1.1.0/develop/create.md | 0 .../v1}/v1.1.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.1.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.1.0/index.md | 0 .../v1}/v1.1.0/maintain/README.md | 0 .../v1}/v1.1.0/maintain/allowList-mgm.md | 0 .../v1}/v1.1.0/maintain/bpe/README.md | 0 .../v1}/v1.1.0/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.1.0/maintain/fhir/README.md | 0 .../v1.1.0/maintain/fhir/access-control.md | 0 .../v1}/v1.1.0/maintain/fhir/configuration.md | 0 .../v1}/v1.1.0/maintain/fhir/oidc.md | 0 .../v1}/v1.1.0/maintain/install.md | 0 .../v1}/v1.1.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.1.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.1.0/process-plugins-advanced.md | 0 .../v1}/v1.2.0/develop/README.md | 0 .../v1}/v1.2.0/develop/create.md | 0 .../v1}/v1.2.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.2.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.2.0/index.md | 0 .../v1}/v1.2.0/maintain/README.md | 0 .../v1}/v1.2.0/maintain/allowList-mgm.md | 0 .../v1}/v1.2.0/maintain/bpe/README.md | 0 .../v1}/v1.2.0/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.2.0/maintain/fhir/README.md | 0 .../v1.2.0/maintain/fhir/access-control.md | 0 .../v1}/v1.2.0/maintain/fhir/configuration.md | 0 .../v1}/v1.2.0/maintain/fhir/oidc.md | 0 .../v1}/v1.2.0/maintain/install.md | 0 .../v1}/v1.2.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.2.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.2.0/process-plugins-advanced.md | 0 .../v1}/v1.3.0/develop/README.md | 0 .../v1}/v1.3.0/develop/create.md | 0 .../v1}/v1.3.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.3.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.3.0/index.md | 0 .../v1}/v1.3.0/maintain/README.md | 0 .../v1}/v1.3.0/maintain/allowList-mgm.md | 0 .../v1}/v1.3.0/maintain/bpe/README.md | 0 .../v1}/v1.3.0/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.3.0/maintain/fhir/README.md | 0 .../v1.3.0/maintain/fhir/access-control.md | 0 .../v1}/v1.3.0/maintain/fhir/configuration.md | 0 .../v1}/v1.3.0/maintain/fhir/oidc.md | 0 .../v1}/v1.3.0/maintain/install-plugins.md | 0 .../v1}/v1.3.0/maintain/install.md | 0 .../v1}/v1.3.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.3.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.3.0/process-plugins-advanced.md | 0 .../v1}/v1.3.1/develop/README.md | 0 .../v1}/v1.3.1/develop/create.md | 0 .../v1}/v1.3.1/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.3.1/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.3.1/index.md | 0 .../v1}/v1.3.1/maintain/README.md | 0 .../v1}/v1.3.1/maintain/allowList-mgm.md | 0 .../v1}/v1.3.1/maintain/bpe/README.md | 0 .../v1}/v1.3.1/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.3.1/maintain/fhir/README.md | 0 .../v1.3.1/maintain/fhir/access-control.md | 0 .../v1}/v1.3.1/maintain/fhir/configuration.md | 0 .../v1}/v1.3.1/maintain/fhir/oidc.md | 0 .../v1}/v1.3.1/maintain/install-plugins.md | 0 .../v1}/v1.3.1/maintain/install.md | 0 .../v1}/v1.3.1/maintain/upgrade-from-0.md | 0 .../v1}/v1.3.1/maintain/upgrade-from-1.md | 0 .../v1}/v1.3.1/process-plugins-advanced.md | 0 .../v1}/v1.3.2/develop/README.md | 0 .../v1}/v1.3.2/develop/create.md | 0 .../v1}/v1.3.2/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.3.2/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.3.2/index.md | 0 .../v1}/v1.3.2/maintain/README.md | 0 .../v1}/v1.3.2/maintain/allowList-mgm.md | 0 .../v1}/v1.3.2/maintain/bpe/README.md | 0 .../v1}/v1.3.2/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.3.2/maintain/fhir/README.md | 0 .../v1.3.2/maintain/fhir/access-control.md | 0 .../v1}/v1.3.2/maintain/fhir/configuration.md | 0 .../v1}/v1.3.2/maintain/fhir/oidc.md | 0 .../v1}/v1.3.2/maintain/install-plugins.md | 0 .../v1}/v1.3.2/maintain/install.md | 0 .../v1}/v1.3.2/maintain/upgrade-from-0.md | 0 .../v1}/v1.3.2/maintain/upgrade-from-1.md | 0 .../v1}/v1.3.2/process-plugins-advanced.md | 0 .../v1}/v1.4.0/contribute/code.md | 0 .../v1}/v1.4.0/contribute/documentation.md | 0 .../v1/v1.4.0}/contribute/readme.md | 0 .../v1}/v1.4.0/develop/README.md | 0 .../v1}/v1.4.0/develop/create.md | 0 .../v1}/v1.4.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.4.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.4.0/index.md | 0 .../v1}/v1.4.0/maintain/README.md | 0 .../v1}/v1.4.0/maintain/allowList-mgm.md | 0 .../v1}/v1.4.0/maintain/bpe/README.md | 0 .../v1}/v1.4.0/maintain/bpe/configuration.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.4.0/maintain/fhir/README.md | 0 .../v1.4.0/maintain/fhir/access-control.md | 0 .../v1}/v1.4.0/maintain/fhir/configuration.md | 0 .../v1}/v1.4.0/maintain/fhir/oidc.md | 0 .../v1}/v1.4.0/maintain/install-plugins.md | 0 .../v1}/v1.4.0/maintain/install.md | 0 .../v1}/v1.4.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.4.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.4.0/process-plugins-advanced.md | 0 .../v1}/v1.5.0/contribute/code.md | 0 .../v1}/v1.5.0/contribute/documentation.md | 0 .../v1/v1.5.0}/contribute/readme.md | 0 .../v1}/v1.5.0/develop/README.md | 0 .../v1}/v1.5.0/develop/create.md | 0 .../v1}/v1.5.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.5.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.5.0/index.md | 0 .../v1}/v1.5.0/maintain/README.md | 0 .../v1}/v1.5.0/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.5.0/maintain/bpe/README.md | 0 .../v1}/v1.5.0/maintain/bpe/access-control.md | 0 .../v1}/v1.5.0/maintain/bpe/configuration.md | 0 .../v1}/v1.5.0/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.5.0/maintain/fhir/README.md | 0 .../v1.5.0/maintain/fhir/access-control.md | 0 .../v1}/v1.5.0/maintain/fhir/configuration.md | 0 .../v1}/v1.5.0/maintain/fhir/oidc.md | 0 .../v1}/v1.5.0/maintain/install-plugins.md | 0 .../v1}/v1.5.0/maintain/install.md | 0 .../v1}/v1.5.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.5.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.5.0/process-plugins-advanced.md | 0 .../v1}/v1.5.1/contribute/code.md | 0 .../v1}/v1.5.1/contribute/documentation.md | 0 .../v1/v1.5.1}/contribute/readme.md | 0 .../v1}/v1.5.1/develop/README.md | 0 .../v1}/v1.5.1/develop/create.md | 0 .../v1}/v1.5.1/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.5.1/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.5.1/index.md | 0 .../v1}/v1.5.1/maintain/README.md | 0 .../v1}/v1.5.1/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.5.1/maintain/bpe/README.md | 0 .../v1}/v1.5.1/maintain/bpe/access-control.md | 0 .../v1}/v1.5.1/maintain/bpe/configuration.md | 0 .../v1}/v1.5.1/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.5.1/maintain/fhir/README.md | 0 .../v1.5.1/maintain/fhir/access-control.md | 0 .../v1}/v1.5.1/maintain/fhir/configuration.md | 0 .../v1}/v1.5.1/maintain/fhir/oidc.md | 0 .../v1}/v1.5.1/maintain/install-plugins.md | 0 .../v1}/v1.5.1/maintain/install.md | 0 .../v1}/v1.5.1/maintain/upgrade-from-0.md | 0 .../v1}/v1.5.1/maintain/upgrade-from-1.md | 0 .../v1}/v1.5.1/process-plugins-advanced.md | 0 .../v1}/v1.5.2/contribute/code.md | 0 .../v1}/v1.5.2/contribute/documentation.md | 0 .../v1/v1.5.2}/contribute/readme.md | 0 .../v1}/v1.5.2/develop/README.md | 0 .../v1}/v1.5.2/develop/create.md | 0 .../v1}/v1.5.2/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.5.2/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.5.2/index.md | 0 .../v1}/v1.5.2/maintain/README.md | 0 .../v1}/v1.5.2/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.5.2/maintain/bpe/README.md | 0 .../v1}/v1.5.2/maintain/bpe/access-control.md | 0 .../v1}/v1.5.2/maintain/bpe/configuration.md | 0 .../v1}/v1.5.2/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.5.2/maintain/fhir/README.md | 0 .../v1.5.2/maintain/fhir/access-control.md | 0 .../v1}/v1.5.2/maintain/fhir/configuration.md | 0 .../v1}/v1.5.2/maintain/fhir/oidc.md | 0 .../v1}/v1.5.2/maintain/install-plugins.md | 0 .../v1}/v1.5.2/maintain/install.md | 0 .../v1}/v1.5.2/maintain/upgrade-from-0.md | 0 .../v1}/v1.5.2/maintain/upgrade-from-1.md | 0 .../v1}/v1.5.2/process-plugins-advanced.md | 0 .../v1}/v1.6.0/contribute/code.md | 0 .../v1}/v1.6.0/contribute/documentation.md | 0 .../v1/v1.6.0}/contribute/readme.md | 0 .../v1}/v1.6.0/develop/README.md | 0 .../v1}/v1.6.0/develop/create.md | 0 .../v1}/v1.6.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.6.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.6.0/index.md | 0 .../v1}/v1.6.0/maintain/README.md | 0 .../v1}/v1.6.0/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.6.0/maintain/bpe/README.md | 0 .../v1}/v1.6.0/maintain/bpe/access-control.md | 0 .../v1}/v1.6.0/maintain/bpe/configuration.md | 0 .../v1}/v1.6.0/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.6.0/maintain/fhir/README.md | 0 .../v1.6.0/maintain/fhir/access-control.md | 0 .../v1}/v1.6.0/maintain/fhir/configuration.md | 0 .../v1}/v1.6.0/maintain/fhir/oidc.md | 0 .../v1}/v1.6.0/maintain/install-plugins.md | 0 .../v1}/v1.6.0/maintain/install.md | 0 .../v1}/v1.6.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.6.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.6.0/process-plugins-advanced.md | 0 .../v1}/v1.7.0/contribute/code.md | 0 .../v1}/v1.7.0/contribute/documentation.md | 0 .../v1/v1.7.0}/contribute/readme.md | 0 .../v1}/v1.7.0/develop/README.md | 0 .../v1}/v1.7.0/develop/create.md | 0 .../v1}/v1.7.0/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.7.0/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.7.0/index.md | 0 .../v1}/v1.7.0/maintain/README.md | 0 .../v1}/v1.7.0/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.7.0/maintain/bpe/README.md | 0 .../v1}/v1.7.0/maintain/bpe/access-control.md | 0 .../v1}/v1.7.0/maintain/bpe/configuration.md | 0 .../v1}/v1.7.0/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.7.0/maintain/fhir/README.md | 0 .../v1.7.0/maintain/fhir/access-control.md | 0 .../v1}/v1.7.0/maintain/fhir/configuration.md | 0 .../v1}/v1.7.0/maintain/fhir/oidc.md | 0 .../v1}/v1.7.0/maintain/install-plugins.md | 0 .../v1}/v1.7.0/maintain/install.md | 0 .../v1}/v1.7.0/maintain/passwords-secrets.md | 0 .../v1}/v1.7.0/maintain/root-certificates.md | 0 .../v1}/v1.7.0/maintain/upgrade-from-0.md | 0 .../v1}/v1.7.0/maintain/upgrade-from-1.md | 0 .../v1}/v1.7.0/process-plugins-advanced.md | 0 .../v1}/v1.7.1/develop/README.md | 0 .../v1}/v1.7.1/develop/create.md | 0 .../v1}/v1.7.1/develop/upgrade-from-0.md | 0 .../{ => operations/v1}/v1.7.1/dsf-for-dev.md | 0 docs/src/{ => operations/v1}/v1.7.1/index.md | 0 .../v1}/v1.7.1/maintain/README.md | 0 .../v1}/v1.7.1/maintain/allowList-mgm.md | 0 .../maintain/bpe-reverse-proxy/README.md | 0 .../bpe-reverse-proxy/configuration.md | 0 .../v1}/v1.7.1/maintain/bpe/README.md | 0 .../v1}/v1.7.1/maintain/bpe/access-control.md | 0 .../v1}/v1.7.1/maintain/bpe/configuration.md | 0 .../v1}/v1.7.1/maintain/bpe/oidc.md | 0 .../maintain/fhir-reverse-proxy/README.md | 0 .../fhir-reverse-proxy/configuration.md | 0 .../v1}/v1.7.1/maintain/fhir/README.md | 0 .../v1.7.1/maintain/fhir/access-control.md | 0 .../v1}/v1.7.1/maintain/fhir/configuration.md | 0 .../v1}/v1.7.1/maintain/fhir/oidc.md | 0 .../v1}/v1.7.1/maintain/install-plugins.md | 0 .../v1}/v1.7.1/maintain/install.md | 0 .../v1}/v1.7.1/maintain/passwords-secrets.md | 0 .../v1}/v1.7.1/maintain/root-certificates.md | 0 .../v1}/v1.7.1/maintain/upgrade-from-0.md | 0 .../v1}/v1.7.1/maintain/upgrade-from-1.md | 0 .../v1}/v1.7.1/process-plugins-advanced.md | 0 docs/src/operations/v2/get-started.md | 1 + docs/src/posts/2025-05-15-my-first-post.md | 44 + docs/src/posts/2025-05-16-fhir.md | 30 + .../src/process-development/api-v1/concept.md | 10 + .../api-v1/tooling/empty-process-plugin.md | 6 + .../process-development/api-v1/tooling/ide.md | 6 + .../api-v1/tooling/maven.md | 6 + .../api-v1/tooling/pipeline-testing.md | 10 + .../api-v1/tooling/validator.md | 11 + .../process-development/api-v1/tutorials.md | 0 docs/src/process-development/api-v2/README.md | 8 + .../process-development/api-v2/description.md | 11 + .../api-v2/implementation.md | 13 + .../process-development/api-v2/migration.md | 13 + .../api-v2/tooling/empty-process-plugin.md | 6 + .../process-development/api-v2/tooling/ide.md | 6 + .../api-v2/tooling/maven.md | 6 + .../api-v2/tooling/pipeline-testing.md | 10 + .../api-v2/tooling/validator.md | 11 + .../how-to/start-project.md | 12 + .../process-plugin/best-practise.md | 10 + .../process-plugin/create.md | 10 + .../process-plugin/testing.md | 12 + .../publishing/publish-on-dsfhub.md | 8 + .../.cache/deps/@vue_devtools-api.js | 12 + .../.cache/deps/@vue_devtools-api.js.map | 7 + src/.vuepress/.cache/deps/@vuepress_shared.js | 138 + .../.cache/deps/@vuepress_shared.js.map | 7 + src/.vuepress/.cache/deps/@vueuse_core.js | 9189 +++++++++++++ src/.vuepress/.cache/deps/@vueuse_core.js.map | 7 + src/.vuepress/.cache/deps/_metadata.json | 55 + src/.vuepress/.cache/deps/chunk-PAUCAATC.js | 11482 ++++++++++++++++ .../.cache/deps/chunk-PAUCAATC.js.map | 7 + src/.vuepress/.cache/deps/chunk-UKCZNIRO.js | 164 + .../.cache/deps/chunk-UKCZNIRO.js.map | 7 + src/.vuepress/.cache/deps/chunk-V6TY7KAL.js | 8 + .../.cache/deps/chunk-V6TY7KAL.js.map | 7 + src/.vuepress/.cache/deps/package.json | 3 + src/.vuepress/.cache/deps/slimsearch.js | 617 + src/.vuepress/.cache/deps/slimsearch.js.map | 7 + src/.vuepress/.cache/deps/vue-router.js | 2745 ++++ src/.vuepress/.cache/deps/vue-router.js.map | 7 + src/.vuepress/.cache/deps/vue.js | 324 + src/.vuepress/.cache/deps/vue.js.map | 7 + src/.vuepress/.temp/components/config.js | 22 + src/.vuepress/.temp/internal/clientConfigs.js | 27 + src/.vuepress/.temp/internal/routes.js | 274 + src/.vuepress/.temp/internal/siteData.js | 14 + src/.vuepress/.temp/internal/themeData.js | 14 + src/.vuepress/.temp/md-enhance/config.js | 22 + src/.vuepress/.temp/pages/404.html.js | 16 + src/.vuepress/.temp/pages/404.html.vue | 4 + .../.temp/pages/about/contact.html.js | 16 + .../.temp/pages/about/contact.html.vue | 17 + .../.temp/pages/about/funding.html.js | 16 + .../.temp/pages/about/funding.html.vue | 23 + src/.vuepress/.temp/pages/about/index.html.js | 16 + .../.temp/pages/about/index.html.vue | 10 + .../.temp/pages/about/partner.html.js | 16 + .../.temp/pages/about/partner.html.vue | 16 + src/.vuepress/.temp/pages/about/team.html.js | 16 + src/.vuepress/.temp/pages/about/team.html.vue | 18 + .../.temp/pages/community/index.html.js | 16 + .../.temp/pages/community/index.html.vue | 4 + .../.temp/pages/for-you/index.html.js | 16 + .../.temp/pages/for-you/index.html.vue | 35 + .../.temp/pages/for-you/learn.html.js | 16 + .../.temp/pages/for-you/learn.html.vue | 13 + .../.temp/pages/hackathon/index.html.js | 16 + .../.temp/pages/hackathon/index.html.vue | 80 + src/.vuepress/.temp/pages/index.html.js | 16 + src/.vuepress/.temp/pages/index.html.vue | 20 + src/.vuepress/.temp/pages/intro/index.html.js | 16 + .../.temp/pages/intro/index.html.vue | 16 + .../.temp/pages/intro/info/allowList.html.js | 16 + .../.temp/pages/intro/info/allowList.html.vue | 11 + .../pages/intro/info/architecture.html.js | 16 + .../pages/intro/info/architecture.html.vue | 25 + .../.temp/pages/intro/info/basics.html.js | 16 + .../.temp/pages/intro/info/basics.html.vue | 27 + .../.temp/pages/intro/info/index.html.js | 16 + .../.temp/pages/intro/info/index.html.vue | 3 + .../pages/intro/info/introduction.html.js | 16 + .../pages/intro/info/introduction.html.vue | 10 + .../pages/intro/info/networkSetup.html.js | 16 + .../pages/intro/info/networkSetup.html.vue | 64 + .../pages/intro/info/process-plugins.html.js | 16 + .../pages/intro/info/process-plugins.html.vue | 50 + .../.temp/pages/intro/info/security.html.js | 16 + .../.temp/pages/intro/info/security.html.vue | 41 + .../.temp/pages/intro/publications.html.js | 16 + .../.temp/pages/intro/publications.html.vue | 45 + .../intro/tutorials/GMDS2022-dev.html.js | 16 + .../intro/tutorials/GMDS2022-dev.html.vue | 5 + .../pages/intro/tutorials/MIE2023.html.js | 16 + .../pages/intro/tutorials/MIE2023.html.vue | 25 + .../.temp/pages/intro/tutorials/Talks.html.js | 16 + .../pages/intro/tutorials/Talks.html.vue | 5 + .../.temp/pages/intro/tutorials/index.html.js | 16 + .../pages/intro/tutorials/index.html.vue | 7 + .../pages/intro/use-cases/feasibility.html.js | 16 + .../intro/use-cases/feasibility.html.vue | 16 + .../.temp/pages/intro/use-cases/index.html.js | 16 + .../pages/intro/use-cases/index.html.vue | 8 + .../.temp/pages/intro/use-cases/num.html.js | 16 + .../.temp/pages/intro/use-cases/num.html.vue | 12 + .../.temp/pages/introduction/index.html.js | 16 + .../.temp/pages/introduction/index.html.vue | 4 + .../.temp/pages/reference/index.html.js | 16 + .../.temp/pages/reference/index.html.vue | 4 + .../.temp/pages/release/archive/index.html.js | 16 + .../pages/release/archive/index.html.vue | 3 + .../archive/v1.0.0/develop/create.html.js | 16 + .../archive/v1.0.0/develop/create.html.vue | 12 + .../archive/v1.0.0/develop/index.html.js | 16 + .../archive/v1.0.0/develop/index.html.vue | 8 + .../v1.0.0/develop/upgrade-from-0.html.js | 16 + .../v1.0.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.0.0/dsf-for-dev.html.js | 16 + .../archive/v1.0.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.0.0/index.html.js | 16 + .../release/archive/v1.0.0/index.html.vue | 28 + .../v1.0.0/maintain/allowList-mgm.html.js | 16 + .../v1.0.0/maintain/allowList-mgm.html.vue | 30 + .../v1.0.0/maintain/configuration/bpe.html.js | 16 + .../maintain/configuration/bpe.html.vue | 437 + .../maintain/configuration/common.html.js | 16 + .../maintain/configuration/common.html.vue | 176 + .../maintain/configuration/fhir.html.js | 16 + .../maintain/configuration/fhir.html.vue | 215 + .../maintain/configuration/index.html.js | 16 + .../maintain/configuration/index.html.vue | 10 + .../configuration/reverseproxy.html.js | 16 + .../configuration/reverseproxy.html.vue | 75 + .../archive/v1.0.0/maintain/index.html.js | 16 + .../archive/v1.0.0/maintain/index.html.vue | 10 + .../archive/v1.0.0/maintain/install.html.js | 16 + .../archive/v1.0.0/maintain/install.html.vue | 321 + .../v1.0.0/maintain/upgrade-from-0.html.js | 16 + .../v1.0.0/maintain/upgrade-from-0.html.vue | 17 + .../v1.0.0/process-plugins-advanced.html.js | 16 + .../v1.0.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.1.0/develop/create.html.js | 16 + .../archive/v1.1.0/develop/create.html.vue | 12 + .../archive/v1.1.0/develop/index.html.js | 16 + .../archive/v1.1.0/develop/index.html.vue | 8 + .../v1.1.0/develop/upgrade-from-0.html.js | 16 + .../v1.1.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.1.0/dsf-for-dev.html.js | 16 + .../archive/v1.1.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.1.0/index.html.js | 16 + .../release/archive/v1.1.0/index.html.vue | 29 + .../v1.1.0/maintain/allowList-mgm.html.js | 16 + .../v1.1.0/maintain/allowList-mgm.html.vue | 30 + .../v1.1.0/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 607 + .../archive/v1.1.0/maintain/bpe/index.html.js | 16 + .../v1.1.0/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 81 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 393 + .../v1.1.0/maintain/fhir/index.html.js | 16 + .../v1.1.0/maintain/fhir/index.html.vue | 9 + .../archive/v1.1.0/maintain/fhir/oidc.html.js | 16 + .../v1.1.0/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.1.0/maintain/index.html.js | 16 + .../archive/v1.1.0/maintain/index.html.vue | 26 + .../archive/v1.1.0/maintain/install.html.js | 16 + .../archive/v1.1.0/maintain/install.html.vue | 337 + .../v1.1.0/maintain/upgrade-from-0.html.js | 16 + .../v1.1.0/maintain/upgrade-from-0.html.vue | 17 + .../v1.1.0/maintain/upgrade-from-1.html.js | 16 + .../v1.1.0/maintain/upgrade-from-1.html.vue | 78 + .../v1.1.0/process-plugins-advanced.html.js | 16 + .../v1.1.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.2.0/develop/create.html.js | 16 + .../archive/v1.2.0/develop/create.html.vue | 12 + .../archive/v1.2.0/develop/index.html.js | 16 + .../archive/v1.2.0/develop/index.html.vue | 8 + .../v1.2.0/develop/upgrade-from-0.html.js | 16 + .../v1.2.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.2.0/dsf-for-dev.html.js | 16 + .../archive/v1.2.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.2.0/index.html.js | 16 + .../release/archive/v1.2.0/index.html.vue | 29 + .../v1.2.0/maintain/allowList-mgm.html.js | 16 + .../v1.2.0/maintain/allowList-mgm.html.vue | 30 + .../v1.2.0/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 637 + .../archive/v1.2.0/maintain/bpe/index.html.js | 16 + .../v1.2.0/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 392 + .../v1.2.0/maintain/fhir/index.html.js | 16 + .../v1.2.0/maintain/fhir/index.html.vue | 9 + .../archive/v1.2.0/maintain/fhir/oidc.html.js | 16 + .../v1.2.0/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.2.0/maintain/index.html.js | 16 + .../archive/v1.2.0/maintain/index.html.vue | 26 + .../archive/v1.2.0/maintain/install.html.js | 16 + .../archive/v1.2.0/maintain/install.html.vue | 337 + .../v1.2.0/maintain/upgrade-from-0.html.js | 16 + .../v1.2.0/maintain/upgrade-from-0.html.vue | 17 + .../v1.2.0/maintain/upgrade-from-1.html.js | 16 + .../v1.2.0/maintain/upgrade-from-1.html.vue | 103 + .../v1.2.0/process-plugins-advanced.html.js | 16 + .../v1.2.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.3.0/develop/create.html.js | 16 + .../archive/v1.3.0/develop/create.html.vue | 12 + .../archive/v1.3.0/develop/index.html.js | 16 + .../archive/v1.3.0/develop/index.html.vue | 8 + .../v1.3.0/develop/upgrade-from-0.html.js | 16 + .../v1.3.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.3.0/dsf-for-dev.html.js | 16 + .../archive/v1.3.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.3.0/index.html.js | 16 + .../release/archive/v1.3.0/index.html.vue | 29 + .../v1.3.0/maintain/allowList-mgm.html.js | 16 + .../v1.3.0/maintain/allowList-mgm.html.vue | 28 + .../v1.3.0/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 637 + .../archive/v1.3.0/maintain/bpe/index.html.js | 16 + .../v1.3.0/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 392 + .../v1.3.0/maintain/fhir/index.html.js | 16 + .../v1.3.0/maintain/fhir/index.html.vue | 9 + .../archive/v1.3.0/maintain/fhir/oidc.html.js | 16 + .../v1.3.0/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.3.0/maintain/index.html.js | 16 + .../archive/v1.3.0/maintain/index.html.vue | 26 + .../v1.3.0/maintain/install-plugins.html.js | 16 + .../v1.3.0/maintain/install-plugins.html.vue | 20 + .../archive/v1.3.0/maintain/install.html.js | 16 + .../archive/v1.3.0/maintain/install.html.vue | 333 + .../v1.3.0/maintain/upgrade-from-0.html.js | 16 + .../v1.3.0/maintain/upgrade-from-0.html.vue | 27 + .../v1.3.0/maintain/upgrade-from-1.html.js | 16 + .../v1.3.0/maintain/upgrade-from-1.html.vue | 82 + .../v1.3.0/process-plugins-advanced.html.js | 16 + .../v1.3.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.3.1/develop/create.html.js | 16 + .../archive/v1.3.1/develop/create.html.vue | 12 + .../archive/v1.3.1/develop/index.html.js | 16 + .../archive/v1.3.1/develop/index.html.vue | 8 + .../v1.3.1/develop/upgrade-from-0.html.js | 16 + .../v1.3.1/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.3.1/dsf-for-dev.html.js | 16 + .../archive/v1.3.1/dsf-for-dev.html.vue | 3 + .../release/archive/v1.3.1/index.html.js | 16 + .../release/archive/v1.3.1/index.html.vue | 29 + .../v1.3.1/maintain/allowList-mgm.html.js | 16 + .../v1.3.1/maintain/allowList-mgm.html.vue | 29 + .../v1.3.1/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 637 + .../archive/v1.3.1/maintain/bpe/index.html.js | 16 + .../v1.3.1/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 392 + .../v1.3.1/maintain/fhir/index.html.js | 16 + .../v1.3.1/maintain/fhir/index.html.vue | 9 + .../archive/v1.3.1/maintain/fhir/oidc.html.js | 16 + .../v1.3.1/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.3.1/maintain/index.html.js | 16 + .../archive/v1.3.1/maintain/index.html.vue | 26 + .../v1.3.1/maintain/install-plugins.html.js | 16 + .../v1.3.1/maintain/install-plugins.html.vue | 20 + .../archive/v1.3.1/maintain/install.html.js | 16 + .../archive/v1.3.1/maintain/install.html.vue | 329 + .../v1.3.1/maintain/upgrade-from-0.html.js | 16 + .../v1.3.1/maintain/upgrade-from-0.html.vue | 27 + .../v1.3.1/maintain/upgrade-from-1.html.js | 16 + .../v1.3.1/maintain/upgrade-from-1.html.vue | 78 + .../v1.3.1/process-plugins-advanced.html.js | 16 + .../v1.3.1/process-plugins-advanced.html.vue | 3 + .../archive/v1.3.2/develop/create.html.js | 16 + .../archive/v1.3.2/develop/create.html.vue | 12 + .../archive/v1.3.2/develop/index.html.js | 16 + .../archive/v1.3.2/develop/index.html.vue | 8 + .../v1.3.2/develop/upgrade-from-0.html.js | 16 + .../v1.3.2/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.3.2/dsf-for-dev.html.js | 16 + .../archive/v1.3.2/dsf-for-dev.html.vue | 3 + .../release/archive/v1.3.2/index.html.js | 16 + .../release/archive/v1.3.2/index.html.vue | 29 + .../v1.3.2/maintain/allowList-mgm.html.js | 16 + .../v1.3.2/maintain/allowList-mgm.html.vue | 29 + .../v1.3.2/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 637 + .../archive/v1.3.2/maintain/bpe/index.html.js | 16 + .../v1.3.2/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 392 + .../v1.3.2/maintain/fhir/index.html.js | 16 + .../v1.3.2/maintain/fhir/index.html.vue | 9 + .../archive/v1.3.2/maintain/fhir/oidc.html.js | 16 + .../v1.3.2/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.3.2/maintain/index.html.js | 16 + .../archive/v1.3.2/maintain/index.html.vue | 26 + .../v1.3.2/maintain/install-plugins.html.js | 16 + .../v1.3.2/maintain/install-plugins.html.vue | 22 + .../archive/v1.3.2/maintain/install.html.js | 16 + .../archive/v1.3.2/maintain/install.html.vue | 329 + .../v1.3.2/maintain/upgrade-from-0.html.js | 16 + .../v1.3.2/maintain/upgrade-from-0.html.vue | 27 + .../v1.3.2/maintain/upgrade-from-1.html.js | 16 + .../v1.3.2/maintain/upgrade-from-1.html.vue | 78 + .../v1.3.2/process-plugins-advanced.html.js | 16 + .../v1.3.2/process-plugins-advanced.html.vue | 3 + .../archive/v1.4.0/contribute/code.html.js | 16 + .../archive/v1.4.0/contribute/code.html.vue | 76 + .../v1.4.0/contribute/documentation.html.js | 16 + .../v1.4.0/contribute/documentation.html.vue | 11 + .../archive/v1.4.0/contribute/index.html.js | 16 + .../archive/v1.4.0/contribute/index.html.vue | 51 + .../archive/v1.4.0/develop/create.html.js | 16 + .../archive/v1.4.0/develop/create.html.vue | 13 + .../archive/v1.4.0/develop/index.html.js | 16 + .../archive/v1.4.0/develop/index.html.vue | 8 + .../v1.4.0/develop/upgrade-from-0.html.js | 16 + .../v1.4.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.4.0/dsf-for-dev.html.js | 16 + .../archive/v1.4.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.4.0/index.html.js | 16 + .../release/archive/v1.4.0/index.html.vue | 29 + .../v1.4.0/maintain/allowList-mgm.html.js | 16 + .../v1.4.0/maintain/allowList-mgm.html.vue | 29 + .../v1.4.0/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 637 + .../archive/v1.4.0/maintain/bpe/index.html.js | 16 + .../v1.4.0/maintain/bpe/index.html.vue | 7 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 392 + .../v1.4.0/maintain/fhir/index.html.js | 16 + .../v1.4.0/maintain/fhir/index.html.vue | 9 + .../archive/v1.4.0/maintain/fhir/oidc.html.js | 16 + .../v1.4.0/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.4.0/maintain/index.html.js | 16 + .../archive/v1.4.0/maintain/index.html.vue | 26 + .../v1.4.0/maintain/install-plugins.html.js | 16 + .../v1.4.0/maintain/install-plugins.html.vue | 22 + .../archive/v1.4.0/maintain/install.html.js | 16 + .../archive/v1.4.0/maintain/install.html.vue | 329 + .../v1.4.0/maintain/upgrade-from-0.html.js | 16 + .../v1.4.0/maintain/upgrade-from-0.html.vue | 27 + .../v1.4.0/maintain/upgrade-from-1.html.js | 16 + .../v1.4.0/maintain/upgrade-from-1.html.vue | 78 + .../v1.4.0/process-plugins-advanced.html.js | 16 + .../v1.4.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.5.0/contribute/code.html.js | 16 + .../archive/v1.5.0/contribute/code.html.vue | 76 + .../v1.5.0/contribute/documentation.html.js | 16 + .../v1.5.0/contribute/documentation.html.vue | 11 + .../archive/v1.5.0/contribute/index.html.js | 16 + .../archive/v1.5.0/contribute/index.html.vue | 51 + .../archive/v1.5.0/develop/create.html.js | 16 + .../archive/v1.5.0/develop/create.html.vue | 13 + .../archive/v1.5.0/develop/index.html.js | 16 + .../archive/v1.5.0/develop/index.html.vue | 8 + .../v1.5.0/develop/upgrade-from-0.html.js | 16 + .../v1.5.0/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.5.0/dsf-for-dev.html.js | 16 + .../archive/v1.5.0/dsf-for-dev.html.vue | 3 + .../release/archive/v1.5.0/index.html.js | 16 + .../release/archive/v1.5.0/index.html.vue | 29 + .../v1.5.0/maintain/allowList-mgm.html.js | 16 + .../v1.5.0/maintain/allowList-mgm.html.vue | 29 + .../bpe-reverse-proxy/configuration.html.js | 16 + .../bpe-reverse-proxy/configuration.html.vue | 87 + .../maintain/bpe-reverse-proxy/index.html.js | 16 + .../maintain/bpe-reverse-proxy/index.html.vue | 7 + .../maintain/bpe/access-control.html.js | 16 + .../maintain/bpe/access-control.html.vue | 61 + .../v1.5.0/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 689 + .../archive/v1.5.0/maintain/bpe/index.html.js | 16 + .../v1.5.0/maintain/bpe/index.html.vue | 9 + .../archive/v1.5.0/maintain/bpe/oidc.html.js | 16 + .../archive/v1.5.0/maintain/bpe/oidc.html.vue | 42 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 422 + .../v1.5.0/maintain/fhir/index.html.js | 16 + .../v1.5.0/maintain/fhir/index.html.vue | 9 + .../archive/v1.5.0/maintain/fhir/oidc.html.js | 16 + .../v1.5.0/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.5.0/maintain/index.html.js | 16 + .../archive/v1.5.0/maintain/index.html.vue | 33 + .../v1.5.0/maintain/install-plugins.html.js | 16 + .../v1.5.0/maintain/install-plugins.html.vue | 22 + .../archive/v1.5.0/maintain/install.html.js | 16 + .../archive/v1.5.0/maintain/install.html.vue | 329 + .../v1.5.0/maintain/upgrade-from-0.html.js | 16 + .../v1.5.0/maintain/upgrade-from-0.html.vue | 27 + .../v1.5.0/maintain/upgrade-from-1.html.js | 16 + .../v1.5.0/maintain/upgrade-from-1.html.vue | 78 + .../v1.5.0/process-plugins-advanced.html.js | 16 + .../v1.5.0/process-plugins-advanced.html.vue | 3 + .../archive/v1.5.1/contribute/code.html.js | 16 + .../archive/v1.5.1/contribute/code.html.vue | 76 + .../v1.5.1/contribute/documentation.html.js | 16 + .../v1.5.1/contribute/documentation.html.vue | 11 + .../archive/v1.5.1/contribute/index.html.js | 16 + .../archive/v1.5.1/contribute/index.html.vue | 51 + .../archive/v1.5.1/develop/create.html.js | 16 + .../archive/v1.5.1/develop/create.html.vue | 13 + .../archive/v1.5.1/develop/index.html.js | 16 + .../archive/v1.5.1/develop/index.html.vue | 8 + .../v1.5.1/develop/upgrade-from-0.html.js | 16 + .../v1.5.1/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.5.1/dsf-for-dev.html.js | 16 + .../archive/v1.5.1/dsf-for-dev.html.vue | 3 + .../release/archive/v1.5.1/index.html.js | 16 + .../release/archive/v1.5.1/index.html.vue | 29 + .../v1.5.1/maintain/allowList-mgm.html.js | 16 + .../v1.5.1/maintain/allowList-mgm.html.vue | 29 + .../bpe-reverse-proxy/configuration.html.js | 16 + .../bpe-reverse-proxy/configuration.html.vue | 87 + .../maintain/bpe-reverse-proxy/index.html.js | 16 + .../maintain/bpe-reverse-proxy/index.html.vue | 7 + .../maintain/bpe/access-control.html.js | 16 + .../maintain/bpe/access-control.html.vue | 61 + .../v1.5.1/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 689 + .../archive/v1.5.1/maintain/bpe/index.html.js | 16 + .../v1.5.1/maintain/bpe/index.html.vue | 9 + .../archive/v1.5.1/maintain/bpe/oidc.html.js | 16 + .../archive/v1.5.1/maintain/bpe/oidc.html.vue | 42 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 422 + .../v1.5.1/maintain/fhir/index.html.js | 16 + .../v1.5.1/maintain/fhir/index.html.vue | 9 + .../archive/v1.5.1/maintain/fhir/oidc.html.js | 16 + .../v1.5.1/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.5.1/maintain/index.html.js | 16 + .../archive/v1.5.1/maintain/index.html.vue | 33 + .../v1.5.1/maintain/install-plugins.html.js | 16 + .../v1.5.1/maintain/install-plugins.html.vue | 20 + .../archive/v1.5.1/maintain/install.html.js | 16 + .../archive/v1.5.1/maintain/install.html.vue | 329 + .../v1.5.1/maintain/upgrade-from-0.html.js | 16 + .../v1.5.1/maintain/upgrade-from-0.html.vue | 27 + .../v1.5.1/maintain/upgrade-from-1.html.js | 16 + .../v1.5.1/maintain/upgrade-from-1.html.vue | 78 + .../v1.5.1/process-plugins-advanced.html.js | 16 + .../v1.5.1/process-plugins-advanced.html.vue | 3 + .../archive/v1.5.2/contribute/code.html.js | 16 + .../archive/v1.5.2/contribute/code.html.vue | 76 + .../v1.5.2/contribute/documentation.html.js | 16 + .../v1.5.2/contribute/documentation.html.vue | 11 + .../archive/v1.5.2/contribute/index.html.js | 16 + .../archive/v1.5.2/contribute/index.html.vue | 51 + .../archive/v1.5.2/develop/create.html.js | 16 + .../archive/v1.5.2/develop/create.html.vue | 13 + .../archive/v1.5.2/develop/index.html.js | 16 + .../archive/v1.5.2/develop/index.html.vue | 8 + .../v1.5.2/develop/upgrade-from-0.html.js | 16 + .../v1.5.2/develop/upgrade-from-0.html.vue | 12 + .../archive/v1.5.2/dsf-for-dev.html.js | 16 + .../archive/v1.5.2/dsf-for-dev.html.vue | 3 + .../release/archive/v1.5.2/index.html.js | 16 + .../release/archive/v1.5.2/index.html.vue | 29 + .../v1.5.2/maintain/allowList-mgm.html.js | 16 + .../v1.5.2/maintain/allowList-mgm.html.vue | 29 + .../bpe-reverse-proxy/configuration.html.js | 16 + .../bpe-reverse-proxy/configuration.html.vue | 87 + .../maintain/bpe-reverse-proxy/index.html.js | 16 + .../maintain/bpe-reverse-proxy/index.html.vue | 7 + .../maintain/bpe/access-control.html.js | 16 + .../maintain/bpe/access-control.html.vue | 61 + .../v1.5.2/maintain/bpe/configuration.html.js | 16 + .../maintain/bpe/configuration.html.vue | 689 + .../archive/v1.5.2/maintain/bpe/index.html.js | 16 + .../v1.5.2/maintain/bpe/index.html.vue | 9 + .../archive/v1.5.2/maintain/bpe/oidc.html.js | 16 + .../archive/v1.5.2/maintain/bpe/oidc.html.vue | 42 + .../fhir-reverse-proxy/configuration.html.js | 16 + .../fhir-reverse-proxy/configuration.html.vue | 87 + .../maintain/fhir-reverse-proxy/index.html.js | 16 + .../fhir-reverse-proxy/index.html.vue | 7 + .../maintain/fhir/access-control.html.js | 16 + .../maintain/fhir/access-control.html.vue | 82 + .../maintain/fhir/configuration.html.js | 16 + .../maintain/fhir/configuration.html.vue | 422 + .../v1.5.2/maintain/fhir/index.html.js | 16 + .../v1.5.2/maintain/fhir/index.html.vue | 9 + .../archive/v1.5.2/maintain/fhir/oidc.html.js | 16 + .../v1.5.2/maintain/fhir/oidc.html.vue | 47 + .../archive/v1.5.2/maintain/index.html.js | 16 + .../archive/v1.5.2/maintain/index.html.vue | 33 + .../v1.5.2/maintain/install-plugins.html.js | 16 + .../v1.5.2/maintain/install-plugins.html.vue | 84 + .../archive/v1.5.2/maintain/install.html.js | 16 + .../archive/v1.5.2/maintain/install.html.vue | 329 + .../v1.5.2/maintain/upgrade-from-0.html.js | 16 + .../v1.5.2/maintain/upgrade-from-0.html.vue | 27 + .../v1.5.2/maintain/upgrade-from-1.html.js | 16 + .../v1.5.2/maintain/upgrade-from-1.html.vue | 78 + .../v1.5.2/process-plugins-advanced.html.js | 16 + .../v1.5.2/process-plugins-advanced.html.vue | 3 + .../.temp/pages/release/index.html.js | 16 + .../.temp/pages/release/index.html.vue | 3 + .../.temp/pages/research/index.html.js | 16 + .../.temp/pages/research/index.html.vue | 4 + .../.temp/pages/security/index.html.js | 16 + .../.temp/pages/security/index.html.vue | 33 + .../.temp/pages/sprechstunde/index.html.js | 16 + .../.temp/pages/sprechstunde/index.html.vue | 11 + .../.temp/pages/use-cases/index.html.js | 16 + .../.temp/pages/use-cases/index.html.vue | 4 + .../.temp/sass-palette/hope-config.scss | 5 + .../.temp/sass-palette/hope-inject.scss | 13 + .../.temp/sass-palette/hope-palette.scss | 3 + .../.temp/sass-palette/hope-style.scss | 1 + src/.vuepress/.temp/sass-palette/load-hope.js | 1 + src/.vuepress/.temp/search-pro/index.js | 1 + src/.vuepress/.temp/search-pro/root.js | 1 + src/.vuepress/.temp/search-pro/store.js | 1 + src/.vuepress/.temp/shiki/config.js | 2 + src/.vuepress/.temp/theme-hope/config.js | 51 + .../.temp/theme-hope/highlighter.scss | 1 + src/.vuepress/.temp/theme-hope/sidebar.js | 1 + src/.vuepress/.temp/vite-root/index.html | 13 + 951 files changed, 49777 insertions(+), 4060 deletions(-) create mode 100644 docs/src/.vuepress/public/fhir/ImplementationGuide/dev.dsf/index.html delete mode 100644 docs/src/about/README.md create mode 100644 docs/src/community/README.md rename docs/src/{about/learnmore => community/about}/README.md (64%) rename docs/src/{about/learnmore => community/about}/contact.md (100%) create mode 100644 docs/src/community/about/faq.md rename docs/src/{about/learnmore => community/about}/partners.md (100%) create mode 100644 docs/src/community/about/projectlist.md rename docs/src/{about/learnmore => community/about}/public.md (100%) rename docs/src/{about/learnmore => community/about}/team.md (100%) create mode 100644 docs/src/community/communications.md create mode 100644 docs/src/community/contribute/README.md rename docs/src/{v1.7.1 => community}/contribute/code.md (99%) rename docs/src/{v1.4.0/contribute/readme.md => community/contribute/contribute.md} (100%) rename docs/src/{v1.7.1 => community}/contribute/documentation.md (96%) create mode 100644 docs/src/community/dsf-ecosystem.md rename docs/src/{intro => community/events}/tutorials/GMDS2022-dev.md (100%) rename docs/src/{intro => community/events}/tutorials/MIE2023.md (100%) rename docs/src/{intro => community/events}/tutorials/README.md (100%) rename docs/src/{intro => community/events}/tutorials/Talks.md (100%) rename docs/src/{sprechstunde/index.md => community/speakinghours.md} (100%) create mode 100644 docs/src/dsf-development/README.md create mode 100644 docs/src/dsf-development/v2/fhir-ig.md rename docs/src/{intro => explore}/README.md (93%) rename docs/src/{intro/info/allowList.md => explore/concepts/allow-list.md} (100%) rename docs/src/{intro/info => explore/concepts}/architecture.md (100%) rename docs/src/{intro/info => explore/concepts}/basics.md (100%) rename docs/src/{intro/info => explore/concepts}/introduction.md (100%) rename docs/src/{intro/info/networkSetup.md => explore/concepts/network-setup.md} (100%) rename docs/src/{intro/info => explore/concepts}/process-plugins.md (100%) rename docs/src/{intro/info => explore/concepts}/security.md (100%) create mode 100644 docs/src/explore/publications/README.md create mode 100644 docs/src/explore/publications/awards.md rename docs/src/{intro => explore/publications}/publications.md (100%) rename docs/src/{intro => explore}/use-cases/README.md (100%) rename docs/src/{intro => explore}/use-cases/feasibility.md (100%) rename docs/src/{intro => explore}/use-cases/internal-mii-data-sharing.md (100%) rename docs/src/{intro => explore}/use-cases/num.md (100%) create mode 100644 docs/src/network-operations/README.md delete mode 100644 docs/src/oldstable/README.md delete mode 100644 docs/src/oldstable/build/README.md delete mode 100644 docs/src/oldstable/build/build.md delete mode 100644 docs/src/oldstable/build/proxyTestTool.md delete mode 100644 docs/src/oldstable/build/releaseANewVersion.md delete mode 100644 docs/src/oldstable/code/README.md delete mode 100644 docs/src/oldstable/code/addingANewFhirR.md delete mode 100644 docs/src/oldstable/code/addingANewMpiClient.md delete mode 100644 docs/src/oldstable/code/addingANewOpenEhrClient.md delete mode 100644 docs/src/oldstable/code/changingBpmnProcesses.md delete mode 100644 docs/src/oldstable/code/code.md delete mode 100644 docs/src/oldstable/code/eclipseContent.md delete mode 100644 docs/src/oldstable/code/intelliJContent.md delete mode 100644 docs/src/oldstable/code/libraries.md delete mode 100644 docs/src/oldstable/code/usingTheGitHubMaven.md delete mode 100644 docs/src/oldstable/generalinformation/README.md delete mode 100644 docs/src/oldstable/generalinformation/authentication.md delete mode 100644 docs/src/oldstable/generalinformation/networkSetup.md delete mode 100644 docs/src/oldstable/introduction.md delete mode 100644 docs/src/oldstable/releases/README.md delete mode 100644 docs/src/oldstable/releases/configBpe.md delete mode 100644 docs/src/oldstable/releases/configFhir.md delete mode 100644 docs/src/oldstable/releases/configFhirReverseProxy.md delete mode 100644 docs/src/oldstable/releases/highmedInstall.md delete mode 100644 docs/src/oldstable/releases/num-codexInstall.md delete mode 100644 docs/src/oldstable/releases/upgradeFrom7.md delete mode 100644 docs/src/oldstable/releases/upgradeFrom8.md delete mode 100644 docs/src/oldstable/releases/upgradeFrom90.md delete mode 100644 docs/src/oldstable/releases/upgradeFrom91.md delete mode 100644 docs/src/oldstable/releases/upgradeFrom92.md delete mode 100644 docs/src/oldstable/tutorial/README.md delete mode 100644 docs/src/oldstable/tutorial/ex11-docker-composeyml.md delete mode 100644 docs/src/oldstable/tutorial/exercise1-simpleProcess.md delete mode 100644 docs/src/oldstable/tutorial/exercise11-processDebugging.md delete mode 100644 docs/src/oldstable/tutorial/exercise2-inputParameters.md delete mode 100644 docs/src/oldstable/tutorial/exercise3-messageEvents.md delete mode 100644 docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md delete mode 100644 docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md delete mode 100644 docs/src/oldstable/tutorial/prerequisites.md create mode 100644 docs/src/operations/get-started.md create mode 100644 docs/src/operations/process-plugin-deployment.md rename docs/src/{ => operations/v1}/v1.0.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/configuration/README.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/configuration/bpe.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/configuration/common.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/configuration/fhir.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/configuration/reverseproxy.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.0.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.1.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.2.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.3.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/index.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.3.1/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/index.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.3.2/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/contribute/documentation.md (100%) rename docs/src/{v1.5.0 => operations/v1/v1.4.0}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.4.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/contribute/documentation.md (100%) rename docs/src/{v1.5.1 => operations/v1/v1.5.0}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.5.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/contribute/documentation.md (100%) rename docs/src/{v1.5.2 => operations/v1/v1.5.1}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/index.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.5.1/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/contribute/documentation.md (100%) rename docs/src/{v1.6.0 => operations/v1/v1.5.2}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/index.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.5.2/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/contribute/documentation.md (100%) rename docs/src/{v1.7.0 => operations/v1/v1.6.0}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.6.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/contribute/code.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/contribute/documentation.md (100%) rename docs/src/{v1.7.1 => operations/v1/v1.7.0}/contribute/readme.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/index.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/passwords-secrets.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/root-certificates.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.7.0/process-plugins-advanced.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/develop/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/develop/create.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/develop/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/dsf-for-dev.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/index.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/allowList-mgm.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/bpe/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir-reverse-proxy/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir-reverse-proxy/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir/README.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir/access-control.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir/configuration.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/fhir/oidc.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/install-plugins.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/install.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/passwords-secrets.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/root-certificates.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/upgrade-from-0.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/maintain/upgrade-from-1.md (100%) rename docs/src/{ => operations/v1}/v1.7.1/process-plugins-advanced.md (100%) create mode 100644 docs/src/operations/v2/get-started.md create mode 100644 docs/src/posts/2025-05-15-my-first-post.md create mode 100644 docs/src/posts/2025-05-16-fhir.md create mode 100644 docs/src/process-development/api-v1/concept.md create mode 100644 docs/src/process-development/api-v1/tooling/empty-process-plugin.md create mode 100644 docs/src/process-development/api-v1/tooling/ide.md create mode 100644 docs/src/process-development/api-v1/tooling/maven.md create mode 100644 docs/src/process-development/api-v1/tooling/pipeline-testing.md create mode 100644 docs/src/process-development/api-v1/tooling/validator.md create mode 100644 docs/src/process-development/api-v1/tutorials.md create mode 100644 docs/src/process-development/api-v2/README.md create mode 100644 docs/src/process-development/api-v2/description.md create mode 100644 docs/src/process-development/api-v2/implementation.md create mode 100644 docs/src/process-development/api-v2/migration.md create mode 100644 docs/src/process-development/api-v2/tooling/empty-process-plugin.md create mode 100644 docs/src/process-development/api-v2/tooling/ide.md create mode 100644 docs/src/process-development/api-v2/tooling/maven.md create mode 100644 docs/src/process-development/api-v2/tooling/pipeline-testing.md create mode 100644 docs/src/process-development/api-v2/tooling/validator.md create mode 100644 docs/src/process-development/how-to/start-project.md create mode 100644 docs/src/process-development/process-plugin/best-practise.md create mode 100644 docs/src/process-development/process-plugin/create.md create mode 100644 docs/src/process-development/process-plugin/testing.md create mode 100644 docs/src/process-development/publishing/publish-on-dsfhub.md create mode 100644 src/.vuepress/.cache/deps/@vue_devtools-api.js create mode 100644 src/.vuepress/.cache/deps/@vue_devtools-api.js.map create mode 100644 src/.vuepress/.cache/deps/@vuepress_shared.js create mode 100644 src/.vuepress/.cache/deps/@vuepress_shared.js.map create mode 100644 src/.vuepress/.cache/deps/@vueuse_core.js create mode 100644 src/.vuepress/.cache/deps/@vueuse_core.js.map create mode 100644 src/.vuepress/.cache/deps/_metadata.json create mode 100644 src/.vuepress/.cache/deps/chunk-PAUCAATC.js create mode 100644 src/.vuepress/.cache/deps/chunk-PAUCAATC.js.map create mode 100644 src/.vuepress/.cache/deps/chunk-UKCZNIRO.js create mode 100644 src/.vuepress/.cache/deps/chunk-UKCZNIRO.js.map create mode 100644 src/.vuepress/.cache/deps/chunk-V6TY7KAL.js create mode 100644 src/.vuepress/.cache/deps/chunk-V6TY7KAL.js.map create mode 100644 src/.vuepress/.cache/deps/package.json create mode 100644 src/.vuepress/.cache/deps/slimsearch.js create mode 100644 src/.vuepress/.cache/deps/slimsearch.js.map create mode 100644 src/.vuepress/.cache/deps/vue-router.js create mode 100644 src/.vuepress/.cache/deps/vue-router.js.map create mode 100644 src/.vuepress/.cache/deps/vue.js create mode 100644 src/.vuepress/.cache/deps/vue.js.map create mode 100644 src/.vuepress/.temp/components/config.js create mode 100644 src/.vuepress/.temp/internal/clientConfigs.js create mode 100644 src/.vuepress/.temp/internal/routes.js create mode 100644 src/.vuepress/.temp/internal/siteData.js create mode 100644 src/.vuepress/.temp/internal/themeData.js create mode 100644 src/.vuepress/.temp/md-enhance/config.js create mode 100644 src/.vuepress/.temp/pages/404.html.js create mode 100644 src/.vuepress/.temp/pages/404.html.vue create mode 100644 src/.vuepress/.temp/pages/about/contact.html.js create mode 100644 src/.vuepress/.temp/pages/about/contact.html.vue create mode 100644 src/.vuepress/.temp/pages/about/funding.html.js create mode 100644 src/.vuepress/.temp/pages/about/funding.html.vue create mode 100644 src/.vuepress/.temp/pages/about/index.html.js create mode 100644 src/.vuepress/.temp/pages/about/index.html.vue create mode 100644 src/.vuepress/.temp/pages/about/partner.html.js create mode 100644 src/.vuepress/.temp/pages/about/partner.html.vue create mode 100644 src/.vuepress/.temp/pages/about/team.html.js create mode 100644 src/.vuepress/.temp/pages/about/team.html.vue create mode 100644 src/.vuepress/.temp/pages/community/index.html.js create mode 100644 src/.vuepress/.temp/pages/community/index.html.vue create mode 100644 src/.vuepress/.temp/pages/for-you/index.html.js create mode 100644 src/.vuepress/.temp/pages/for-you/index.html.vue create mode 100644 src/.vuepress/.temp/pages/for-you/learn.html.js create mode 100644 src/.vuepress/.temp/pages/for-you/learn.html.vue create mode 100644 src/.vuepress/.temp/pages/hackathon/index.html.js create mode 100644 src/.vuepress/.temp/pages/hackathon/index.html.vue create mode 100644 src/.vuepress/.temp/pages/index.html.js create mode 100644 src/.vuepress/.temp/pages/index.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/index.html.js create mode 100644 src/.vuepress/.temp/pages/intro/index.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/allowList.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/allowList.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/architecture.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/architecture.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/basics.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/basics.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/index.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/index.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/introduction.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/introduction.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/networkSetup.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/networkSetup.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/process-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/process-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/info/security.html.js create mode 100644 src/.vuepress/.temp/pages/intro/info/security.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/publications.html.js create mode 100644 src/.vuepress/.temp/pages/intro/publications.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.js create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.js create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/Talks.html.js create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/Talks.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/index.html.js create mode 100644 src/.vuepress/.temp/pages/intro/tutorials/index.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.js create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/index.html.js create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/index.html.vue create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/num.html.js create mode 100644 src/.vuepress/.temp/pages/intro/use-cases/num.html.vue create mode 100644 src/.vuepress/.temp/pages/introduction/index.html.js create mode 100644 src/.vuepress/.temp/pages/introduction/index.html.vue create mode 100644 src/.vuepress/.temp/pages/reference/index.html.js create mode 100644 src/.vuepress/.temp/pages/reference/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.vue create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.js create mode 100644 src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.vue create mode 100644 src/.vuepress/.temp/pages/release/index.html.js create mode 100644 src/.vuepress/.temp/pages/release/index.html.vue create mode 100644 src/.vuepress/.temp/pages/research/index.html.js create mode 100644 src/.vuepress/.temp/pages/research/index.html.vue create mode 100644 src/.vuepress/.temp/pages/security/index.html.js create mode 100644 src/.vuepress/.temp/pages/security/index.html.vue create mode 100644 src/.vuepress/.temp/pages/sprechstunde/index.html.js create mode 100644 src/.vuepress/.temp/pages/sprechstunde/index.html.vue create mode 100644 src/.vuepress/.temp/pages/use-cases/index.html.js create mode 100644 src/.vuepress/.temp/pages/use-cases/index.html.vue create mode 100644 src/.vuepress/.temp/sass-palette/hope-config.scss create mode 100644 src/.vuepress/.temp/sass-palette/hope-inject.scss create mode 100644 src/.vuepress/.temp/sass-palette/hope-palette.scss create mode 100644 src/.vuepress/.temp/sass-palette/hope-style.scss create mode 100644 src/.vuepress/.temp/sass-palette/load-hope.js create mode 100644 src/.vuepress/.temp/search-pro/index.js create mode 100644 src/.vuepress/.temp/search-pro/root.js create mode 100644 src/.vuepress/.temp/search-pro/store.js create mode 100644 src/.vuepress/.temp/shiki/config.js create mode 100644 src/.vuepress/.temp/theme-hope/config.js create mode 100644 src/.vuepress/.temp/theme-hope/highlighter.scss create mode 100644 src/.vuepress/.temp/theme-hope/sidebar.js create mode 100644 src/.vuepress/.temp/vite-root/index.html diff --git a/docs/package-lock.json b/docs/package-lock.json index 1f02c547d..239d7ea80 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -2070,6 +2070,7 @@ "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.52.tgz", "integrity": "sha512-W9FrpR/ynV1lztdCrtEmnfZizNbnhLdzl/BdLxbDoVrKcjAWktqmfx8VJI+zrWyHmPzwIxrY0FdttQDUXPj+VA==", "dev": true, + "license": "MIT", "dependencies": { "@vuepress/helper": "2.0.0-rc.52", "chokidar": "^3.6.0", diff --git a/docs/src/.vuepress/config.ts b/docs/src/.vuepress/config.ts index d0881880f..79e84ef8b 100644 --- a/docs/src/.vuepress/config.ts +++ b/docs/src/.vuepress/config.ts @@ -2,6 +2,7 @@ import { viteBundler } from '@vuepress/bundler-vite'; import { defineUserConfig } from "vuepress"; import theme from "./theme.js"; + export default defineUserConfig({ host: "127.0.0.1", base: "/", @@ -25,7 +26,7 @@ export default defineUserConfig({ description: "", }, },*/ - plugins: [], + plugins: [ ], // Enable it with pwa shouldPrefetch: false, diff --git a/docs/src/.vuepress/public/fhir/ImplementationGuide/dev.dsf/index.html b/docs/src/.vuepress/public/fhir/ImplementationGuide/dev.dsf/index.html new file mode 100644 index 000000000..e0960afe3 --- /dev/null +++ b/docs/src/.vuepress/public/fhir/ImplementationGuide/dev.dsf/index.html @@ -0,0 +1 @@ +not implemented yet \ No newline at end of file diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 9064ad97b..cc161c46c 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -21,14 +21,14 @@ export default hopeTheme({ link: "/", }, { - text: "Docs", + text: "Explore", icon: "info", prefix: "", children: [ { - text: "Introduction", + text: "Explore", icon: "info", - children: ["/intro/info/introduction", "/intro/use-cases/", "/intro/publications", "/intro/tutorials/"], + children: ["/intro/info/introduction", "/intro/use-cases/", "/intro/research/", "/intro/tutorials/"], }, { text: "Security", @@ -49,6 +49,18 @@ export default hopeTheme({ } ] }, + { + text: "Process Development", + icon: "process", + prefix: "/process-development/", + children: [ + { + text: "Process Developments", + icon: "docs", + children: ["dsf-api-1/description", "dsf-api-2/README.md", "how-to/start-project", "process-plugin", "publishing", "tooling"], + } + ] + }, { text: "About", icon: "creative", @@ -58,7 +70,13 @@ export default hopeTheme({ text: "Learn More", icon: "creative", prefix: "learnmore/", - children: ["contact", "team", "partners", "public"], + children: ["contact", "team", "partners", "public", "faq", "projectlist", "speakinghours"], + }, + { + text: "Community", + icon: "creative", + prefix: "community/", + children: ["community", "contribute"], }, ], }, @@ -84,7 +102,13 @@ export default hopeTheme({ link: "/", }, { - text: "Docs", + text: "News", + icon: "news", + link: "tag/blog/" + }, + + { + text: "Concepts", icon: "info", prefix: "intro/", link: "intro/", @@ -103,9 +127,11 @@ export default hopeTheme({ children: ["feasibility", "num"], }, { - text: "Publications", + text: "Research", icon: "blog", - link: "/intro/publications", + prefix: "intro/research/", + link: "/intro/research/", + children: ["publications", "awards"], }, { text: "Tutorials", @@ -116,6 +142,7 @@ export default hopeTheme({ "/hackathon": [], "/spring-school": [], "/news": [], + "/api-documentation": [], "/stable/": [ { text: "Home", @@ -1179,13 +1206,25 @@ export default hopeTheme({ icon: "home", link: "/", }, + { + text: "News", + icon: "news", + link: "/news/" + }, { text: "About", icon: "creative", prefix: "learnmore/", link: "learnmore/", - children: ["contact", "team", "partners", "public"], + children: ["contact", "team", "partners", "public", "faq", "projectlist", "speakinghours"], }, + { + text: "DSF-Community", + icon: "group", + prefix: "community/", + link: "community/", + children: ["community", "contribute", "code", "documentation"], + }, ], "/oldstable/": [ { @@ -1202,12 +1241,16 @@ export default hopeTheme({ "/intro/use-cases/internal-mii-data-sharing.html": [] }, - footer: "<a href='https://www.hs-heilbronn.de/impressum'>Imprint</a> • <a href='https://www.hs-heilbronn.de/de/datenschutz'>Data Privacy</a>", + footer: "<a href='https://www.hs-heilbronn.de/impressum'>Imprint</a> • <a href='https://www.hs-heilbronn.de/de/datenschutz'>Data Privacy</a> • <a href='/security/'>Security</a>" , copyright: false, displayFooter: true, plugins: { + blog: { + filter: ({ frontmatter }) => frontmatter.type === "news", + }, + markdownImage: { figure: true, lazyload: true, diff --git a/docs/src/about/README.md b/docs/src/about/README.md deleted file mode 100644 index fd00a14da..000000000 --- a/docs/src/about/README.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: About -icon: creative ---- - -## Overview - -- [Contact & Community Guide](learnmore/contact) -- [Contributors](learnmore/team) -- [Partners](learnmore/partners) -- [Public Funding](learnmore/public) diff --git a/docs/src/community/README.md b/docs/src/community/README.md new file mode 100644 index 000000000..970d63b29 --- /dev/null +++ b/docs/src/community/README.md @@ -0,0 +1,21 @@ +--- +title: About +icon: creative +--- + +## Overview + +### About Us +- [Contact & Community Guide](learnmore/contact) +- [Contributors](learnmore/team) +- [Partners](learnmore/partners) +- [Public Funding](learnmore/public) +- [FAQ](/about/learnmore/faq.md) +- [Projectlist](/about/learnmore/projectlist.md) +- [Speakinghours](/about/learnmore/speakinghours.md) + +### DSF Community +- [Community](/about/community/community.md) +- [Contribute](/about/community/contribute/readme.md) +- [Code](/about/community/contribute/code.md) +- [Documentation](/about/community/contribute/documentation.md) diff --git a/docs/src/about/learnmore/README.md b/docs/src/community/about/README.md similarity index 64% rename from docs/src/about/learnmore/README.md rename to docs/src/community/about/README.md index bfe8e6ba0..4b85263ae 100644 --- a/docs/src/about/learnmore/README.md +++ b/docs/src/community/about/README.md @@ -9,5 +9,6 @@ icon: creative - [Contributors](/about/learnmore/team.md) - [Partners](/about/learnmore/partners.md) - [Public Funding](/about/learnmore/public.md) - - +- [FAQ](/about/learnmore/faq.md) +- [Projectlist](/about/learnmore/projectlist.md) +- [Speakinghours](/about/learnmore/speakinghours.md) diff --git a/docs/src/about/learnmore/contact.md b/docs/src/community/about/contact.md similarity index 100% rename from docs/src/about/learnmore/contact.md rename to docs/src/community/about/contact.md diff --git a/docs/src/community/about/faq.md b/docs/src/community/about/faq.md new file mode 100644 index 000000000..9c202db62 --- /dev/null +++ b/docs/src/community/about/faq.md @@ -0,0 +1,6 @@ +--- +title: FAQ +icon: ask +--- + +## FAQ \ No newline at end of file diff --git a/docs/src/about/learnmore/partners.md b/docs/src/community/about/partners.md similarity index 100% rename from docs/src/about/learnmore/partners.md rename to docs/src/community/about/partners.md diff --git a/docs/src/community/about/projectlist.md b/docs/src/community/about/projectlist.md new file mode 100644 index 000000000..f44454bac --- /dev/null +++ b/docs/src/community/about/projectlist.md @@ -0,0 +1,6 @@ +--- +title: Projectlist +icon: list +--- + +## Projectlist \ No newline at end of file diff --git a/docs/src/about/learnmore/public.md b/docs/src/community/about/public.md similarity index 100% rename from docs/src/about/learnmore/public.md rename to docs/src/community/about/public.md diff --git a/docs/src/about/learnmore/team.md b/docs/src/community/about/team.md similarity index 100% rename from docs/src/about/learnmore/team.md rename to docs/src/community/about/team.md diff --git a/docs/src/community/communications.md b/docs/src/community/communications.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/community/contribute/README.md b/docs/src/community/contribute/README.md new file mode 100644 index 000000000..6c64b8682 --- /dev/null +++ b/docs/src/community/contribute/README.md @@ -0,0 +1,12 @@ +--- +title: DSF Community +icon: group +--- + +## Overview + +### DSF Community +- [Community](/about/community/community.md) +- [Contribute](/about/community/contribute/readme.md) +- [Code](/about/community/contribute/code.md) +- [Documentation](/about/community/contribute/documentation.md) diff --git a/docs/src/v1.7.1/contribute/code.md b/docs/src/community/contribute/code.md similarity index 99% rename from docs/src/v1.7.1/contribute/code.md rename to docs/src/community/contribute/code.md index b4f16ba6e..8a750c5ab 100644 --- a/docs/src/v1.7.1/contribute/code.md +++ b/docs/src/community/contribute/code.md @@ -1,8 +1,10 @@ --- -title: Contribute code -icon: info +title: Code +icon: code --- +# Contribute code + Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community. ### Benefits of Contributing: diff --git a/docs/src/v1.4.0/contribute/readme.md b/docs/src/community/contribute/contribute.md similarity index 100% rename from docs/src/v1.4.0/contribute/readme.md rename to docs/src/community/contribute/contribute.md diff --git a/docs/src/v1.7.1/contribute/documentation.md b/docs/src/community/contribute/documentation.md similarity index 96% rename from docs/src/v1.7.1/contribute/documentation.md rename to docs/src/community/contribute/documentation.md index afbaf5511..e14a29c5c 100644 --- a/docs/src/v1.7.1/contribute/documentation.md +++ b/docs/src/community/contribute/documentation.md @@ -1,8 +1,9 @@ --- -title: Contribute documentation -icon: info +title: Documentation +icon: write --- +# Contribute documentation **Join us in enhancing our documentation!** We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input! diff --git a/docs/src/community/dsf-ecosystem.md b/docs/src/community/dsf-ecosystem.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/intro/tutorials/GMDS2022-dev.md b/docs/src/community/events/tutorials/GMDS2022-dev.md similarity index 100% rename from docs/src/intro/tutorials/GMDS2022-dev.md rename to docs/src/community/events/tutorials/GMDS2022-dev.md diff --git a/docs/src/intro/tutorials/MIE2023.md b/docs/src/community/events/tutorials/MIE2023.md similarity index 100% rename from docs/src/intro/tutorials/MIE2023.md rename to docs/src/community/events/tutorials/MIE2023.md diff --git a/docs/src/intro/tutorials/README.md b/docs/src/community/events/tutorials/README.md similarity index 100% rename from docs/src/intro/tutorials/README.md rename to docs/src/community/events/tutorials/README.md diff --git a/docs/src/intro/tutorials/Talks.md b/docs/src/community/events/tutorials/Talks.md similarity index 100% rename from docs/src/intro/tutorials/Talks.md rename to docs/src/community/events/tutorials/Talks.md diff --git a/docs/src/sprechstunde/index.md b/docs/src/community/speakinghours.md similarity index 100% rename from docs/src/sprechstunde/index.md rename to docs/src/community/speakinghours.md diff --git a/docs/src/dsf-development/README.md b/docs/src/dsf-development/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/dsf-development/v2/fhir-ig.md b/docs/src/dsf-development/v2/fhir-ig.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/intro/README.md b/docs/src/explore/README.md similarity index 93% rename from docs/src/intro/README.md rename to docs/src/explore/README.md index 862b1a496..116db69b9 100644 --- a/docs/src/intro/README.md +++ b/docs/src/explore/README.md @@ -1,5 +1,5 @@ --- -title: Documentation +title: Overview icon: info --- ## Overview diff --git a/docs/src/intro/info/allowList.md b/docs/src/explore/concepts/allow-list.md similarity index 100% rename from docs/src/intro/info/allowList.md rename to docs/src/explore/concepts/allow-list.md diff --git a/docs/src/intro/info/architecture.md b/docs/src/explore/concepts/architecture.md similarity index 100% rename from docs/src/intro/info/architecture.md rename to docs/src/explore/concepts/architecture.md diff --git a/docs/src/intro/info/basics.md b/docs/src/explore/concepts/basics.md similarity index 100% rename from docs/src/intro/info/basics.md rename to docs/src/explore/concepts/basics.md diff --git a/docs/src/intro/info/introduction.md b/docs/src/explore/concepts/introduction.md similarity index 100% rename from docs/src/intro/info/introduction.md rename to docs/src/explore/concepts/introduction.md diff --git a/docs/src/intro/info/networkSetup.md b/docs/src/explore/concepts/network-setup.md similarity index 100% rename from docs/src/intro/info/networkSetup.md rename to docs/src/explore/concepts/network-setup.md diff --git a/docs/src/intro/info/process-plugins.md b/docs/src/explore/concepts/process-plugins.md similarity index 100% rename from docs/src/intro/info/process-plugins.md rename to docs/src/explore/concepts/process-plugins.md diff --git a/docs/src/intro/info/security.md b/docs/src/explore/concepts/security.md similarity index 100% rename from docs/src/intro/info/security.md rename to docs/src/explore/concepts/security.md diff --git a/docs/src/explore/publications/README.md b/docs/src/explore/publications/README.md new file mode 100644 index 000000000..9957d8a4a --- /dev/null +++ b/docs/src/explore/publications/README.md @@ -0,0 +1,7 @@ +--- +title: Research +icon: blog +--- +## Overview +- [Publications and Talks](publications) +- [Awards](awards) diff --git a/docs/src/explore/publications/awards.md b/docs/src/explore/publications/awards.md new file mode 100644 index 000000000..b9ee33c43 --- /dev/null +++ b/docs/src/explore/publications/awards.md @@ -0,0 +1,8 @@ +--- +title: Awards +icon: creative +--- +## Awards + +### Rolf Hansen Memorial Award 2023 goes to [Hauke Hund](https://github.com/hhund) +We are very pleased to have won the Rolf Hansen Memorial Award at [EFMI MIE 2023](https://www.mie2023.org/) in Gothenburg. The Rolf Hansen Memorial Award is presented annually by the European Federation for Medical Informatics (EFMI) for an outstanding paper as well as for an excellent presentation. It is named after Rolf Hansen (1931-1993), a well-known Norwegian medical informatician and former president of EFMI. Hauke Hund presented his Paper: *No Transfer Without Validation: A Data Sharing Framework Use Case* in May at the EFMI MIE. [doi:10.3233/SHTI230066 ](https://ebooks.iospress.nl/doi/10.3233/SHTI230066) diff --git a/docs/src/intro/publications.md b/docs/src/explore/publications/publications.md similarity index 100% rename from docs/src/intro/publications.md rename to docs/src/explore/publications/publications.md diff --git a/docs/src/intro/use-cases/README.md b/docs/src/explore/use-cases/README.md similarity index 100% rename from docs/src/intro/use-cases/README.md rename to docs/src/explore/use-cases/README.md diff --git a/docs/src/intro/use-cases/feasibility.md b/docs/src/explore/use-cases/feasibility.md similarity index 100% rename from docs/src/intro/use-cases/feasibility.md rename to docs/src/explore/use-cases/feasibility.md diff --git a/docs/src/intro/use-cases/internal-mii-data-sharing.md b/docs/src/explore/use-cases/internal-mii-data-sharing.md similarity index 100% rename from docs/src/intro/use-cases/internal-mii-data-sharing.md rename to docs/src/explore/use-cases/internal-mii-data-sharing.md diff --git a/docs/src/intro/use-cases/num.md b/docs/src/explore/use-cases/num.md similarity index 100% rename from docs/src/intro/use-cases/num.md rename to docs/src/explore/use-cases/num.md diff --git a/docs/src/network-operations/README.md b/docs/src/network-operations/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/oldstable/README.md b/docs/src/oldstable/README.md deleted file mode 100644 index c8929105a..000000000 --- a/docs/src/oldstable/README.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Version 0.9.x -icon: guide ---- - -Data Sharing Framework 0.9.x is an old version of the Data Sharing Framework. Click [here](/intro/) to find more information about the DSF in general. - -## Overview (v 0.9.x) -- [General Information](generalInformation/) -- [Code](code/) -- [Build and Test](build/) -- [Releases and Deployment](releases/) -- [DSF Process Plugin Tutorial](tutorial/) \ No newline at end of file diff --git a/docs/src/oldstable/build/README.md b/docs/src/oldstable/build/README.md deleted file mode 100644 index d851f4d95..000000000 --- a/docs/src/oldstable/build/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Build and Test -icon: back-stage ---- -- [Build & Test Project](build.md) -- [Proxy Test Tool](proxyTestTool.md) -- [Release a new version](releaseANewVersion.md) diff --git a/docs/src/oldstable/build/build.md b/docs/src/oldstable/build/build.md deleted file mode 100644 index 1a124aa40..000000000 --- a/docs/src/oldstable/build/build.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Build and Test -icon: back-stage ---- -## Build Project -Prerequisite: Java 11, Maven 3.6, Docker - -``` -mvn install -``` - -## Manual Integration Testing (without Docker) -Prerequisite: Java 11, Maven 3.6, PostgreSQL 11 - -* Build the entire project from the root directory of the repository - ``` - mvn install - ``` -* Install PostgreSQL 11 (localhost:5432) -* Add DB User *liquibase_user* - ``` SQL - CREATE USER liquibase_user WITH LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION - PASSWORD 'fLp6ZSd5QrMAkGZMjxqXjmcWrTfa3Dn8fA57h92Y'; - ``` -* Create Databases *fhir* and *bpe* with owner *liquibase_user* - ``` SQL - CREATE DATABASE bpe OWNER liquibase_user; - CREATE DATABASE fhir OWNER liquibase_user; - ``` -* Start *org.highmed.dsf.fhir.FhirJettyServerHttps* from your IDE with execution folder: *.../highmed-dsf/dsf-fhir/dsf-fhir-server-jetty* -* Start *org.highmed.dsf.bpe.BpeJettyServerHttps* from your IDE with execition folder: *.../highmed-dsf/dsf-bpe/dsf-bpe-server-jetty* -* To access the FHIR endpoint (https://localhost:8001/fhir/...) and BPE rest interface (https://localhost:8002/bpe/...) via WebBrowser install *.../highmed-dsf/dsf-tools/dsf-tools-test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12* (Password: *password*) in your browsers certifiate store. The p12 file includes a client certificate for "Webbrowser Test User" and the "Test CA" certificate. All private-keys and certificates including the Test CA are generated during the maven build and are private to your machine. Make sure to protect the CA private-key at *.../highmed-dsf/dsf-tools/dsf-tools-test-data-generator/cert/ca/testca_private-key.pem* from third-party access if you have installed the Test CA certificate in your certificate store. - -## Manual Integration Testing (local with Docker) -Prerequisite: Java 11, Maven 3.6, Docker 18 - -* Build the entire project from the root directory of this repository - ``` - mvn install - ``` -* Build docker images - * Windows: in the .../dsf-docker-test-setup folder execute - ``` - docker-build.bat - ``` - * Unix/Linux: in the .../dsf-docker-test-setup folder execute - ``` - docker-build.sh - ``` -* Start docker containers - * To start the FHIR server execute in the .../dsf-docker-test-setup/fhir folder - ``` - dev: - docker-compose up - - prod: - docker-compose -f docker-compose.yml -f docker-compose.prod.yml up - ``` - * To start the BPE server execute in the .../dsf-docker-test-setup/bpe folder - ``` - dev: - docker-compose up - - prod: - docker-compose -f docker-compose.yml -f docker-compose.prod.yml up - ``` -* To access the FHIR endpoint (https://localhost/fhir/...) and BPE rest interface (https://localhost:8443/bpe/...) via WebBrowser install *.../highmed-dsf/dsf-tools/dsf-tools-test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12* (Password: *password*) in your browsers certifiate store. The p12 file includes a client certificate for "Webbrowser Test User" and the "Test CA" certificate. All private-keys and certificates including the Test CA are generated during the maven build and are private to your machine. Make sure to protect the CA private-key at *.../highmed-dsf/dsf-tools/dsf-tools-test-data-generator/cert/ca/testca_private-key.pem* from third-party access if you have installed the Test CA certificate in your certificate store. - -### Troubleshooting -* If you run in docker network troubles, clean up your network using ``docker network ls -q | xargs docker network rm`` -* In production: if the warning _Service "db" is using volume "/var/lib/postgresql/data" from the previous container_ appears, run the command - ``` - docker-compose down -v - ``` - before starting the containers. - -## Manual Integration Testing (VMs for Docker-Registry, 3 MeDICs, TTP) -* For hints on setting up 5 Ubuntu VMs with Docker running on a Windows 10 host with Hyper-V and Ansible see [test_setup_windows.txt](../blob/master/dsf-docker-test-setup-3medic-ttp/test_setup_windows.txt) -* For hints on setting up 5 Ubuntu VMs with Docker running on a MacOS Catalina host with VirtualBox and Ansible see [test_setup_macos.txt](../blob/master/dsf-docker-test-setup-3medic-ttp/test_setup_macos.txt) - -### Starting the Processes -Each process contains an *ExampleStarter* which creates FHIR resources and sends them to a designated FHIR-Endpoint in order to start the corresponding process in the Manual Integration Test Setup. The same client certificate can be used as above: *.../highmed-dsf/dsf-tools/dsf-tools-test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12* (Password: *password*). - -The following configuration is needed: -* The path to the client certificate: either the environment-variable `DSF_CLIENT_CERTIFICATE_PATH` or `args[0]` has to be set -* The password of the client certificate: either the environment-variable `DSF_CLIENT_CERTIFICATE_PASSWORD` or `args[1]` has to be set \ No newline at end of file diff --git a/docs/src/oldstable/build/proxyTestTool.md b/docs/src/oldstable/build/proxyTestTool.md deleted file mode 100644 index 078ee432a..000000000 --- a/docs/src/oldstable/build/proxyTestTool.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Proxy Test Tool -icon: back-stage ---- -If the BPE will be deployed behind a proxy, you can test the internet access of the BPE using the tool in `dsf-tools/dsf-tools-proxy-test`. - -The proxy test jar takes three input variables: -* args[0]: the base url to test against (e.g. https://www.google.de) -* args[1]: the proxy url to connect to (e.g. http://proxy.klinikum.de:8080) -* args[1]: the proxy username - -The proxy password will be asked as command line input. The name of the main class is `ProxyTest`. - diff --git a/docs/src/oldstable/build/releaseANewVersion.md b/docs/src/oldstable/build/releaseANewVersion.md deleted file mode 100644 index a9d539aa2..000000000 --- a/docs/src/oldstable/build/releaseANewVersion.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Release a new version -icon: back-stage ---- -## Release a new final version - -1. Write release notes -2. Create new release/x.y.z branch from develop -3. Remove `-SNAPSHOT` from version in pom.xml files -4. Change status from `draft` to `active` and update dates, verify versions in FHIR resources -5. Update `version` and `date-released` in CITATION.cff -6. Push branch release/x.y.z -7. Create pull request (release/x.y.z -> main) -8. Build maven -9. Build docker images and run manual tests in 3MeDIC/TTP test setup -10. Execute [trivy](https://aquasecurity.github.io/trivy/) and check CVEs for the docker images -11. Merge release/x.y.z into main -12. Git tag main branch -13. Push main branch (including Git tag) -14. Build maven -15. Run multi-arch docker build (including push) -16. Update release notes with docker links, check Git tag -17. Publish release notes -18. Create 'start next development cycle' issue and branch -19. Merge main into issue branch -20. Increase version -21. Merge next development cycle issue branch into develop via PR - -## Release a new candidate version - -1. Write release notes -2. Create new release/x.y.z-RC# branch from develop -3. Replace `-SNAPSHOT` in versions with `-RC#` in pom.xml files -4. Change status from `draft` to `active` and update dates, verify versions in FHIR resources -5. Update `version` and `date-released` in CITATION.cff -6. Git tag release/x.y.z-RC# branch -7. Build maven -8. Build docker images and run manual tests in 3MeDIC/TTP test setup -9. Execute [trivy](https://aquasecurity.github.io/trivy/) and check CVEs for the docker images -10. Push release/x.y.z-RC# branch (including Git tag) -11. Run multi-arch docker build (including push) -12. Update release notes with docker links, check Git tag -13. Publish release notes \ No newline at end of file diff --git a/docs/src/oldstable/code/README.md b/docs/src/oldstable/code/README.md deleted file mode 100644 index ad4896054..000000000 --- a/docs/src/oldstable/code/README.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Code -icon: code ---- - -- [Writing Code](code.md) -- [Using the GitHub Maven Package Registry](usingTheGitHubMaven.md) -- [Adding a new FHIR Resource](addingANewFhirR.md) -- [Changing BPMN Processes by Service Task Overwrites](changingBpmnProcesses.md) -- [Adding a new MPI Client](addingANewMpiClient.md) -- [Adding a new openEHR Client](addingANewOpenEhrClient.md) -- [Libraries](libraries.md) \ No newline at end of file diff --git a/docs/src/oldstable/code/addingANewFhirR.md b/docs/src/oldstable/code/addingANewFhirR.md deleted file mode 100644 index 39c1146f4..000000000 --- a/docs/src/oldstable/code/addingANewFhirR.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Adding FHIR Resources -icon: code ---- -This wiki entry walks through the steps to add a new FHIR resource to the server -## Database - -- ``dsf-fhir-server > resources > db`` copy/past one file and change content to new resource (don't forget to allow permanent deletes like in ``db.questionnaires.changelog-0.6.0.xml``) -- ``dsf-fhir-server > resources > db > db.changelog.xml`` include new generated db changelog file (are in alphabetic order) -- ``dsf-fhir-server > resources > db > trigger_functions`` copy/paste existing functions for insert/update triggers and change content to new resource -- ``dsf-fhir-server > resources > db > db.read_access.changelog.xml`` include new generated functions for insert/update triggers (are in alphabetic order) - -## JSON/XML Adapter -- ``dsf-fhir-rest-adapter > java`` copy/paste existing adapter for json/xml/html and change content to new resource -- ``dsf-fhir-webservice-client > java > FhirWebserviceClientJersey.java``register generated json/xml (not html) adapters according to existing registrations (are in alphabetic order) - -## DAO -- ``dsf-fhir-server > java > dao`` copy/paste dao interface and change content to new resource -- ``dsf-fhir-server > java > search > parameters`` copy/paste a search parameter class based on type of the parameter (extends abstract search parameter type) and change content to new resource (existing search parameters can be found on the resources specification website) -- ``dsf-fhir-server > java > search > parameters > rev > include`` copy/paste rev include class and adapt content to resource to be rev included -- ``dsf-fhir-server > java > search > parameters > user`` copy/paste a search user filter class and adapt content to new resource -- ``dsf-fhir-server > java > dao > jdbc copy/paste dao jdbc`` class and adapt content (add search user filter and parameter) -- ``dsf-fhir-server > java > spring > config > DaoConfig.java`` register bean by adding a method according to existing resource bean methods (are in alphabetic order) and add it in the `daoProvider()´ method -- ``dsf-fhir-server > java > spring > config > EventConfig.java`` add the new created bean from the ``DaoConfig`` to the ``MatcherFactory`` according to existing dao's (are in alphabetic order) -- ``dsf-fhir-server > java > dao > provider > DaoProvider.java`` add a method similar to the existing one -- ``dsf-fhir-server > java > dao > provider > DaoProviderImpl.java`` adapt the class according to the other resource and implement the method similar to the existing one - -## Resolve Resource References if needed -- ``dsf-fhir-rest-adapter > java > service > ReferenceExtractor.java`` add a method similar to the existing ones -- ``dsf-fhir-rest-adapter > java > service > ReferenceExtractorImpl.java`` implement the method similar to the existing ones - -## Authorization -- ``dsf-fhir-server > java > authorization`` copy/paste class and change content to new resource -- ``dsf-fhir-server > java > spring > config > AuthorizationConfig.java`` register bean by adding a method according to existing resource bean methods (are in alphabetic order) and add it in the ``authorizationRuleProvider()`` and the ``binaryAuthorizationRule()`` method - -## Webservice - -* `dsf-fhir-server > java > webservice > specification` copy/paste interface and change content to new resource -* `dsf-fhir-server > java > webservice > impl` copy/paste class and change content to new resource -* `dsf-fhir-server > java > webservice > jaxrs` copy/paste class and change content to new resource -* `dsf-fhir-server > java > webservice > secure` copy/paste class and change content to new resource -* `dsf-fhir-server > java > webservice > impl > ConformanceServiceImpl` add new Resource to list and add Search Parameter created above -* `dsf-fhir-server > java > spring > config > WebserviceConfig.java` register bean by adding a method according to existing resource bean methods (are in alphabetic order) - -## Test -* `dsf-fhir-server > test-java > dao` copy/paste class and change tests to new resource -* `dsf-fhir-server > test-java > integration` copy/paste class and change tests to new resource and above create search parameters - diff --git a/docs/src/oldstable/code/addingANewMpiClient.md b/docs/src/oldstable/code/addingANewMpiClient.md deleted file mode 100644 index f6790d9be..000000000 --- a/docs/src/oldstable/code/addingANewMpiClient.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Adding MPI Clients -icon: code ---- -The Master Patient Index (MPI) client that will be used by the Business Process Engine (BPE) is determined by the property `org.highmed.dsf.bpe.mpi.webservice.factory.class` and loaded using a service loader, which searches for a class of type [`MasterPatientIndexClientFactory`](https://github.com/highmed/highmed-dsf/blob/master/dsf-mpi/dsf-mpi-client/src/main/java/org/highmed/mpi/client/MasterPatientIndexClientFactory.java) on startup of the BPE. - -The framework currently includes an MPI client using the IHE PDQ interface, also supporting client certificate authentication. To use it, add the jar of the `dsf-mpi-client-pdq` module to the `plugin` configuration folder and set the property value to `org.highmed.mpi.client.pdq.MasterPatientIndexClientPdqFactory`. - -To implement a new MPI client, the following has to be taken into account: -* The plugin needs to supply an MPI client factory implementing the interface [`MasterPatientIndexClientFactory`](https://github.com/highmed/highmed-dsf/blob/master/dsf-mpi/dsf-mpi-client/src/main/java/org/highmed/mpi/client/MasterPatientIndexClientFactory.java) from the [`dsf-mpi-client`](https://github.com/highmed/highmed-dsf/tree/master/dsf-mpi/dsf-mpi-client) module. -* The resources folder must contain a file with the name `META-INF/services/org.highmed.mpi.client.MasterPatientIndexClientFactory` containing the name of the new MPI client factory including the full package name. -* The client needs to implement the interface [`MasterPatientIndexClient`](https://github.com/highmed/highmed-dsf/blob/master/dsf-mpi/dsf-mpi-client/src/main/java/org/highmed/mpi/client/MasterPatientIndexClient.java). The interface defines a method returning instances of the interface [`Idat`](https://github.com/highmed/highmed-dsf/blob/master/dsf-mpi/dsf-mpi-client/src/main/java/org/highmed/mpi/client/Idat.java) based on patient-ids used within the openEHR repository. - -An example of an MPI client implementation can be found in the [`dsf-mpi-client-pdq`](https://github.com/highmed/highmed-dsf/tree/master/dsf-mpi/dsf-mpi-client-pdq) module. - - diff --git a/docs/src/oldstable/code/addingANewOpenEhrClient.md b/docs/src/oldstable/code/addingANewOpenEhrClient.md deleted file mode 100644 index e32ba4cda..000000000 --- a/docs/src/oldstable/code/addingANewOpenEhrClient.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Adding openEHR Clients -icon: code ---- -The openEHR client that will be used by the Business Process Engine (BPE) is determined by the property `org.highmed.dsf.bpe.openehr.webservice.factory.class` and loaded using a service loader, which searches for a class of type [`OpenEhrClientFactory`](https://github.com/highmed/highmed-dsf/blob/master/dsf-openehr/dsf-openehr-client/src/main/java/org/highmed/openehr/client/OpenEhrClientFactory.java) on startup of the BPE. - -The framework currently includes an openEHR Jersey REST client using basic authentication. To use it, add the jar of the `dsf-openehr-client-impl` module to the `plugin` configuration folder and set the property value to `org.highmed.openehr.client.impl.OpenEhrClientJerseyFactory`. - -To implement a new openEHR client, the following has to be taken into account: -* The plugin needs to supply an openEHR client factory implementing the interface [`OpenEhrClientFactory`](https://github.com/highmed/highmed-dsf/blob/master/dsf-openehr/dsf-openehr-client/src/main/java/org/highmed/openehr/client/OpenEhrClientFactory.java) from the [`dsf-openehr-client`](https://github.com/highmed/highmed-dsf/tree/master/dsf-openehr/dsf-openehr-client) module. -* The resources folder must contain a file with the name `META-INF/services/org.highmed.openehr.client.OpenEhrClientFactory` containing the name of the new openehr client factory including the full package name. -* The client needs to implement the interface [`OpenEhrClient`](https://github.com/highmed/highmed-dsf/blob/master/dsf-openehr/dsf-openehr-client/src/main/java/org/highmed/openehr/client/OpenEhrClient.java). The interface defines a method executing an openEHR query returning an instance of an openEHR [`ResultSet`](https://github.com/highmed/highmed-dsf/blob/master/dsf-openehr/dsf-openehr-model/src/main/java/org/highmed/openehr/model/structure/ResultSet.java). - -An example of an openEHR client implementation can be found in the [`dsf-openehr-client-impl`](https://github.com/highmed/highmed-dsf/tree/master/dsf-openehr/dsf-openehr-client-impl) module. - - diff --git a/docs/src/oldstable/code/changingBpmnProcesses.md b/docs/src/oldstable/code/changingBpmnProcesses.md deleted file mode 100644 index 1a13b078a..000000000 --- a/docs/src/oldstable/code/changingBpmnProcesses.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Changing BPMN Processes by Service Task Overwrites -icon: code ---- -> `DEPRECATED SINCE VERSION 0.4.0` - -A service task of a process integrated in the framework can be overwritten using the plugin interface. This means that entire processes do not have to be replaced when only individual steps need adaption. An example can be found in the module `dsf-bpe > dsf-bpe-process-plugin-example > dsf-bpe-process-service-overwrite`. - -A plugin has as its only dependency the process module which contains the service task to be overwritten. - -For a plugin replacing one service task, two new files must be generated: -- A new service task extending the task it overwrites. The method to be overwritten is `doExecute(DelegateExecution execution)`. -- A new configuration file containing a method that has as return type the service task you want to overwrite. This method then returns a Bean of your own implementation of this specific service task. The method has to be annotated with `@Primary`. \ No newline at end of file diff --git a/docs/src/oldstable/code/code.md b/docs/src/oldstable/code/code.md deleted file mode 100644 index c014ad187..000000000 --- a/docs/src/oldstable/code/code.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Writing Code -icon: code ---- -## Code Style -HiGHmed DSF code-style configurations for Eclipse and IntelliJ IDEA can be found here: - -- [Eclipse](eclipseContent.md) -- [IntelliJ IDEA](intelliJContent.md) - -Pull Requests are only approved, if the code is formatted according to the code-style configurations above. To format the code with maven before pushing to GitHub, use ``mvn compile -Pformat-and-sort``. - -## Git Workflow -Since Release 0.1.0, we follow ``git-flow`` as described [here](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow). -New features should branch from ``develop`` and merged back if done. Hot-Fixes for the latest release will branch of ``master`` and will be merged into develop and later into master. A new release will branch of develop for a ramp down phase and will then be merged into master. The new master should merge back into develop to start a new development cycle. - -### Branch Naming: - -- Features: ``issue/<issue-number>_<issue-name>`` -- Hot-Fix: ``hot-fix/<issue-number>_<issue-name>`` -- Release: ``release/<version>`` - diff --git a/docs/src/oldstable/code/eclipseContent.md b/docs/src/oldstable/code/eclipseContent.md deleted file mode 100644 index 790a3fe62..000000000 --- a/docs/src/oldstable/code/eclipseContent.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: Eclipse code-style configurations -icon: code ---- -[Back](code.md) -```xml -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<profiles version="15"> - <profile kind="CodeFormatterProfile" name="highmed_dsf" version="15"> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/> - <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/> - <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/> - <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/> - <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/> - <setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/> - <setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/> - <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/> - <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/> - <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/> - <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/> - </profile> -</profiles> -``` -[Back](code.md) \ No newline at end of file diff --git a/docs/src/oldstable/code/intelliJContent.md b/docs/src/oldstable/code/intelliJContent.md deleted file mode 100644 index 2b779f282..000000000 --- a/docs/src/oldstable/code/intelliJContent.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: IntelliJ code-style configurations -icon: code ---- -[Back](code.md) -```xml -<code_scheme name="highmed_dsf" version="173"> - <option name="FORMATTER_TAGS_ENABLED" value="true" /> - <JavaCodeStyleSettings> - <option name="ANNOTATION_PARAMETER_WRAP" value="1" /> - <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> - <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> - <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND"> - <value /> - </option> - <option name="IMPORT_LAYOUT_TABLE"> - <value> - <package name="" withSubpackages="true" static="true" /> - <emptyLine /> - <package name="java" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="javax" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="org" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="com" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="ca" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="de" withSubpackages="true" static="false" /> - <emptyLine /> - <package name="" withSubpackages="true" static="false" /> - <emptyLine /> - </value> - </option> - </JavaCodeStyleSettings> - <codeStyleSettings language="JAVA"> - <option name="KEEP_LINE_BREAKS" value="false" /> - <option name="KEEP_FIRST_COLUMN_COMMENT" value="false" /> - <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> - <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" /> - <option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> - <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" /> - <option name="BRACE_STYLE" value="2" /> - <option name="CLASS_BRACE_STYLE" value="2" /> - <option name="METHOD_BRACE_STYLE" value="2" /> - <option name="ELSE_ON_NEW_LINE" value="true" /> - <option name="WHILE_ON_NEW_LINE" value="true" /> - <option name="CATCH_ON_NEW_LINE" value="true" /> - <option name="FINALLY_ON_NEW_LINE" value="true" /> - <option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> - <option name="ALIGN_MULTILINE_RESOURCES" value="false" /> - <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="true" /> - <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" /> - <option name="CALL_PARAMETERS_WRAP" value="1" /> - <option name="METHOD_PARAMETERS_WRAP" value="1" /> - <option name="RESOURCE_LIST_WRAP" value="5" /> - <option name="EXTENDS_LIST_WRAP" value="1" /> - <option name="THROWS_LIST_WRAP" value="1" /> - <option name="EXTENDS_KEYWORD_WRAP" value="1" /> - <option name="THROWS_KEYWORD_WRAP" value="1" /> - <option name="METHOD_CALL_CHAIN_WRAP" value="1" /> - <option name="BINARY_OPERATION_WRAP" value="1" /> - <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> - <option name="TERNARY_OPERATION_WRAP" value="5" /> - <option name="ARRAY_INITIALIZER_WRAP" value="1" /> - <option name="PARAMETER_ANNOTATION_WRAP" value="2" /> - <option name="VARIABLE_ANNOTATION_WRAP" value="2" /> - <indentOptions> - <option name="USE_TAB_CHARACTER" value="true" /> - </indentOptions> - </codeStyleSettings> -</code_scheme> -``` -[Back](code.md) \ No newline at end of file diff --git a/docs/src/oldstable/code/libraries.md b/docs/src/oldstable/code/libraries.md deleted file mode 100644 index 1a77822f9..000000000 --- a/docs/src/oldstable/code/libraries.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Libraries -icon: folder ---- diff --git a/docs/src/oldstable/code/usingTheGitHubMaven.md b/docs/src/oldstable/code/usingTheGitHubMaven.md deleted file mode 100644 index d95f176d7..000000000 --- a/docs/src/oldstable/code/usingTheGitHubMaven.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Using the Github Maven Package Registry -icon: code ---- -## Authenticating to GitHub Packages - -For more information take a look at this GitHub documentation about [authentication](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry#authenticating-to-github-packages). - -In order to install the HiGHmed DSF packages using Maven in your own projects you need a personal GitHub access token. This [GitHub documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) shows you how to generate one. - -After that, add the following configuration to your local .m2/settings.xml. Replace ``USERNAME`` with your GitHub username and ``TOKEN`` with the previously generated personal GitHub access token. The token needs at least the scope ``read:packages``. - -```xml - <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 - http://maven.apache.org/xsd/settings-1.0.0.xsd"> - - <activeProfiles> - <activeProfile>github</activeProfile> - </activeProfiles> - - <profiles> - <profile> - <id>github</id> - <repositories> - <repository> - <id>github</id> - <name>GitHub HiGHmed Apache Maven Packages</name> - <url>https://maven.pkg.github.com/highmed/highmed-dsf</url> - <releases><enabled>true</enabled></releases> - <snapshots><enabled>true</enabled></snapshots> - </repository> - </repositories> - </profile> - </profiles> - - <servers> - <server> - <id>github</id> - <username>USERNAME</username> - <password>TOKEN</password> - </server> - </servers> -</settings> -``` -## Installing a Package -For more information take a look at this GitHub documentation about [package installation](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry#installing-a-package). - -To install an Apache Maven package from GitHub Packages edit the element ``dependencies`` in the *pom.xml* file by including the package. This could look as follows to include the ``dsf-bpe-process-base`` package (replace ``VERSION`` with the package version, e.g. ``0.4.0-SNAPSHOT``): -```xml -<dependencies> - <dependency> - <groupId>org.highmed.dsf</groupId> - <artifactId>dsf-bpe-process-base</artifactId> - <version>VERSION</version> - </dependency> -<dependencies> -``` diff --git a/docs/src/oldstable/generalinformation/README.md b/docs/src/oldstable/generalinformation/README.md deleted file mode 100644 index 344c5b203..000000000 --- a/docs/src/oldstable/generalinformation/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: General Information -icon: set ---- -- [Authentication](authentication.md) -- [Network Setup and General Architecture](networkSetup.md) \ No newline at end of file diff --git a/docs/src/oldstable/generalinformation/authentication.md b/docs/src/oldstable/generalinformation/authentication.md deleted file mode 100644 index 746ae7d7a..000000000 --- a/docs/src/oldstable/generalinformation/authentication.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Authentication -icon: lock ---- -Authentication of organizations within the DSF is handled by the use of X.509 client and server certificates. Currently the certificate authorities run by [DFN-PKI Global G2](https://www.pki.dfn.de/ueberblick-dfn-pki/), [D-Trust via TMF e.V.](https://www.tmf-ev.de) and [GÉANT TCS via DFN](https://doku.tid.dfn.de/de:dfnpki:start) are supported. All participating organizations are entered in a distributed and synchronized allow-list of valid organizations and certificates. - -A webserver certificate is needed to run the FHIR endpoint and a 802.1X client certificate is used to authenticate against other organizations endpoints and as a server certificate for the business process engine. For available certificate profiles see [DFN-PKI-Zertifikatprofile_Global.pdf](https://www.pki.dfn.de/fileadmin/PKI/anleitungen/DFN-PKI-Zertifikatprofile_Global.pdf) - -## Certificate Requests -### FHIR Endpoint -* Purpose: Server certificate to authenticate the FHIR endpoint on the local network and against other organizations -* Certificate profile: - * DFN-PKI Global G2 via DFN e.V.: Web Server - * D-Trust via TMF e.V.: Advanced SSL ID - * GÉANT TCS via DFN e.V.: Web Server -* Common name: FQDN of the server used while accessing from other organizations (external FQDN) -* Subject alternative DNS entries: Use additional alternative FQDNs if a different name is used while accessing the Server from the local Network (local FQDN) - -### Business Process Engine Server -* Purpose: Client certificate to authenticate against remote FHIR endpoints (when either the BPE Server or the FHIR Endpoint Server is acting as a client), server certificate to authenticate the business process engine server on the local network -* Certificate profile: - * DFN-PKI Global G2 via DFN e.V.: 802.1X Client - * D-Trust via TMF e.V.: Basic Team ID - * GÉANT TCS via DFN e.V.: Web Server -* Common name: FQDN of the server used while accessing from the local network (local FQDN) diff --git a/docs/src/oldstable/generalinformation/networkSetup.md b/docs/src/oldstable/generalinformation/networkSetup.md deleted file mode 100644 index 9dcb71003..000000000 --- a/docs/src/oldstable/generalinformation/networkSetup.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Network Setup and General Architecture -icon: customize ---- -The Data Sharing Framework consists of two components: A FHIR Endpoint Server used to except Task resources and provide resources for download by other organizations and a Business Process Engine Server run internal and not accessible by other organization to execute and coordinate processes. - -![Network Setup Diagramm](/photos/guideline/generalInformation/highmed_dsf_network_setup.svg) - -* FHIR Reverse Proxy: The FHIR Reverse Proxy is used to terminate incoming https connections to the FHIR App Server. The Reverse Proxy needs to be accessible on port 443 from the internet. Incoming https connection will be delegate as http on a docker internal network to the FHIR App Server. -* FHIR App Server: The FHIR App Server is used as a FHIR Endpoint for incoming Task resources and providing resources for download by other organizations. In order to validate incoming FHIR resources the server will communicate with FHIR Servers at other organizations. Access to resources and authorization for creating or updating resources is granted based on the content of the resource and/or based on the client (identified by its client certificate) being part of an allow list. JDBC connections to the FHIR DB Server -* FHIR DB Server: PostgreSQL database for the FHIR App Server. -* BPE App Server: The BPE App Server is executing BPMN 2.0 business processes with the included business process engine. Automatic BPMN service tasks are used for example to check resource, access the PDP- and MPI-servers as well as the MDAT repository. The calculation of record linkage bit vectors (Record Bloom Filters) is also performed using an automatic service task. As of version 0.3.0 the BPE server does not provide any webservices for modifying an server resources. -* BPE DB Server: PostgreSQL database for the BPE App Server. -* PDP: IHE Policy Decision Point for deciding on patient consent. -* MDAT Repo: Repository (e.g. openEHR) for storing medical data (MDAT). -* MPI: IHE Master Patient Index for storing identifying patient date (IDAT) e.g. first name, last name, date of birth. -* Cohort Browser: Example for a system to trigger patient cohort size estimations across multiple organizations. - -More information on Client- and Server-Certificates are available on the dedicated wiki page: [Authentication: Client/Server Certificates](Authentication) - -## Additional Reverse Proxy in external DMZ -In some organizations an additional reverse proxy in an external DMZ is needed. This can be accomplished by using for example nginx or haproxy as a TCP-Proxy. Example configurations routing traffic using SNI can be found below. Configuring an additional reverse proxy to terminate the incoming TLS connection early is not recommended. - -![Network Setup Diagramm](/photos/guideline/generalInformation/highmed_dsf_network_setup_ext_dmz.svg) - -**nginx** -``` -http { - # ... -} - -stream { - map $ssl_preread_server_name $name { - fhir.example.com fhir; - } - - upstream fhir { - server 192.168.0.1:443; - } - - server { - listen 443; - proxy_pass $name; - ssl_preread on; - } -} -``` - -**haproxy** -``` -defaults - timeout connect 5s - timeout client 30s - timeout server 30s - -frontend ingress - bind :443 - mode tcp - - tcp-request inspect-delay 5s - tcp-request content accept if { req_ssl_hello_type 1 } - use_backend fhir if { req.ssl_sni fhir.example.com } - -backend fhir - mode tcp - - server fhir 192.168.0.1:443 -``` \ No newline at end of file diff --git a/docs/src/oldstable/introduction.md b/docs/src/oldstable/introduction.md deleted file mode 100644 index 2bd994e6e..000000000 --- a/docs/src/oldstable/introduction.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Introduction -icon: info ---- -The Data Sharing Framework implements a distributed process engine based on the BPMN 2.0 and FHIR R4 standards. The DSF is used to support biomedical research with routine data. Every participating site runs a FHIR endpoint (dsf-fhir) accessible by other sites and a business process engine (dsf-bpe) in the local secured network. Authentication between sites is handled using X.509 client/server certificates. The process engines execute BPMN processes in order to coordinate local and remote steps necessary to enable cross-site data sharing and feasibility analyses. This includes access to local data repositories, use-and-access-committee decision support, consent filtering, and privacy preserving record-linkage and pseudonymization. - -![DSF Architecture](/photos/guideline/introduction/dsf_architecture.svg) - diff --git a/docs/src/oldstable/releases/README.md b/docs/src/oldstable/releases/README.md deleted file mode 100644 index d69dc518c..000000000 --- a/docs/src/oldstable/releases/README.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Releases and Deployment -icon: install ---- - - -- [Configuration Parameters FHIR Reverse Proxy](configFhirReverseProxy.md) -- [Configuration Parameters FHIR](configFhir.md) -- [Configuration Parameters BPE](configBpe.md) -- [Upgrade from 0.9.1](upgradeFrom91.md) -- [Upgrade from 0.9.2](upgradeFrom92.md) -- [Older Versions](https://github.com/highmed/highmed-dsf/wiki/Deployment-Archive) -- [NUM-CODEX Install](num-codexInstall.md) -- [HiGHmed Install](highmedInstall.md) diff --git a/docs/src/oldstable/releases/configBpe.md b/docs/src/oldstable/releases/configBpe.md deleted file mode 100644 index 5c2c7248d..000000000 --- a/docs/src/oldstable/releases/configBpe.md +++ /dev/null @@ -1,482 +0,0 @@ -## DSF 0.9.3 Configuration Parameters - BPE Server -Please note: Additional parameters (not listed here) are used to configure process plugins. - -### ORG_HIGHMED_DSF_BPE_CONSENT_WEBSERVICE_FACTORY_CLASS -- **Property:** org.highmed.dsf.bpe.consent.webservice.factory.class -- **Required:** No -- **Description:** Factory for client implementations used to connect to a consent server in order to check permissions to access patient medical data -- **Recommendation:** The default value is a factory for a stub implementation, change to a factory for client implementation that matches the API of your Consent server -- **Default:** `org.highmed.consent.client.stub.ConsentClientStubFactory` - - -### ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD or ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.db.liquibase.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF BPE server to execute database migrations -- **Recommendation:** Use docker secret file to configure by using *ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE* -- **Example:** `/run/secrets/db_liquibase.password` - - -### ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_USERNAME -- **Property:** org.highmed.dsf.bpe.db.liquibase.username -- **Required:** No -- **Description:** The user name to access the database from the DSF BPE server to execute database migrations -- **Default:** `liquibase_user` - - -### ORG_HIGHMED_DSF_BPE_DB_URL -- **Property:** org.highmed.dsf.bpe.db.url -- **Required:** Yes -- **Description:** The address of the database used for the DSF BPE server -- **Recommendation:** Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose -- **Example:** `jdbc:postgresql://db/bpe` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP -- **Property:** org.highmed.dsf.bpe.db.user.camunda.group -- **Required:** No -- **Description:** The name of the user group to access the database from the DSF BPE server for camunda processes -- **Default:** `camunda_users` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.db.user.camunda.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF BPE server for camunda processes -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE* -- **Example:** `/run/secrets/db_user_camunda.password` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME -- **Property:** org.highmed.dsf.bpe.db.user.camunda.username -- **Required:** No -- **Description:** The user name to access the database from the DSF BPE server for camunda processes -- **Recommendation:** Use a different user then in *ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME* -- **Default:** `camunda_server_user` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_GROUP -- **Property:** org.highmed.dsf.bpe.db.user.group -- **Required:** No -- **Description:** The name of the user group to access the database from the DSF BPE server -- **Default:** `bpe_users` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD or ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.db.user.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF BPE server -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE* -- **Example:** `/run/secrets/db_user.password` - - -### ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME -- **Property:** org.highmed.dsf.bpe.db.user.username -- **Required:** No -- **Description:** The user name to access the database from the DSF BPE server -- **Default:** `bpe_server_user` - - -### ORG_HIGHMED_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND -- **Property:** org.highmed.dsf.bpe.debug.log.message.onActivityEnd -- **Required:** No -- **Description:** To enable debug log messages for every bpmn activity end, set to `true`. -- **Recommendation:** This debug function should only be activated during process plugin development. -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART -- **Property:** org.highmed.dsf.bpe.debug.log.message.onActivityStart -- **Required:** No -- **Description:** To enable debug log messages for every bpmn activity start, set to `true`. -- **Recommendation:** This debug function should only be activated during process plugin development. -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES -- **Property:** org.highmed.dsf.bpe.debug.log.message.variables -- **Required:** No -- **Description:** To enable loging bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to `true`. -- **Recommendation:** This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log! -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE -- **Property:** org.highmed.dsf.bpe.fhir.client.certificate -- **Required:** Yes -- **Description:** PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_certificate.pem` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY -- **Property:** org.highmed.dsf.bpe.fhir.client.certificate.private.key -- **Required:** Yes -- **Description:** Private key corresponding to the local client certificate as PEM encoded file. Use ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_certificate_private_key.pem` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.fhir.client.certificate.private.key.password -- **Required:** No -- **Description:** Password to decrypt the local client certificate encrypted private key -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* -- **Example:** `/run/secrets/app_client_certificate_private_key.pem.password` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_PROXY_PASSWORD or ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_PROXY_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.fhir.client.local.proxy.password -- **Required:** No -- **Description:** Proxy password, set if the DSF BPE server can reach internal servers, like the DSF FHIR server, only through a proxy which requests authentication -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_PROXY_PASSWORD_FILE* - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_PROXY_URL -- **Property:** org.highmed.dsf.bpe.fhir.client.local.proxy.url -- **Required:** No -- **Description:** Proxy location, set if the DSF BPE server can reach internal servers, like the DSF FHIR server, only through a proxy -- **Example:** `http://proxy.foo:8080` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_PROXY_USERNAME -- **Property:** org.highmed.dsf.bpe.fhir.client.local.proxy.username -- **Required:** No -- **Description:** Proxy username, set if the DSF BPE server can reach internal servers, like the DSF FHIR server, only through a proxy which requests authentication - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT -- **Property:** org.highmed.dsf.bpe.fhir.client.local.timeout.connect -- **Required:** No -- **Description:** The timeout in milliseconds until a connection is established with the local DSF FHIR server -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `2000` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ -- **Property:** org.highmed.dsf.bpe.fhir.client.local.timeout.read -- **Required:** No -- **Description:** The timeout in milliseconds until a reading a resource from the local DSF FHIR server is aborted -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `60000` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE -- **Property:** org.highmed.dsf.bpe.fhir.client.local.verbose -- **Required:** No -- **Description:** To enable verbose logging of requests to and replies from the local DSF FHIR server, set to `true` -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_WEBSOCKET_PROXY_PASSWORD or ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_WEBSOCKET_PROXY_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.fhir.client.local.websocket.proxy.password -- **Required:** No -- **Description:** Proxy password, set if the DSF BPE server can reach internal servers via websocket, like the getSub server, only through a proxy which requests authentication -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_WEBSOCKET_PROXY_PASSWORD_FILE* - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_WEBSOCKET_PROXY_URL -- **Property:** org.highmed.dsf.bpe.fhir.client.local.websocket.proxy.url -- **Required:** No -- **Description:** Proxy location, set if the DSF BPE server can reach internal servers via websocket, like the DSF FHIR server, only through a proxy -- **Example:** `http://proxy.foo:8080` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_LOCAL_WEBSOCKET_PROXY_USERNAME -- **Property:** org.highmed.dsf.bpe.fhir.client.local.websocket.proxy.username -- **Required:** No -- **Description:** Proxy username, set if the DSF BPE server can reach internal servers via websocket, like the DSF FHIR server, only through a proxy which requests authentication - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_PROXY_PASSWORD or ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_PROXY_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.proxy.password -- **Required:** No -- **Description:** Proxy password, set if the the DSF FHIR server can reach the internet only through a proxy which requests authentication -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_PROXY_PASSWORD_FILE* - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_PROXY_URL -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.proxy.url -- **Required:** No -- **Description:** Proxy location, set if the DSF BPE server can reach the internet only through a proxy -- **Example:** `http://proxy.foo:8080` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_PROXY_USERNAME -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.proxy.username -- **Required:** No -- **Description:** Proxy username, set if the the DSF BPE server can reach the internet only through a proxy which requests authentication - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.timeout.connect -- **Required:** No -- **Description:** The timeout in milliseconds until a connection is established with a remote DSF FHIR server -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `5000` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.timeout.read -- **Required:** No -- **Description:** The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `60000` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE -- **Property:** org.highmed.dsf.bpe.fhir.client.remote.verbose -- **Required:** No -- **Description:** To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to `true` -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES -- **Property:** org.highmed.dsf.bpe.fhir.client.trust.certificates -- **Required:** Yes -- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_trust_certificates.pem` - - -### ORG_HIGHMED_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER -- **Property:** org.highmed.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter -- **Required:** No -- **Description:** Subscription to receive notifications about questionnaire response resources from the DSF FHIR server -- **Default:** `?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson` - - -### ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL -- **Property:** org.highmed.dsf.bpe.fhir.server.base.url -- **Required:** Yes -- **Description:** The base address of the local DSF FHIR server to read/store fhir resources -- **Example:** `https://foo.bar/fhir` - - -### ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE -- **Property:** org.highmed.dsf.bpe.fhir.server.organization.identifier.value -- **Required:** Yes -- **Description:** The local identifier value used in the Allow-List -- **Recommendation:** By convention: The shortest possible FQDN that resolve the homepage of the organization -- **Example:** `hospital.com` - - -### ORG_HIGHMED_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX -- **Property:** org.highmed.dsf.bpe.fhir.task.subscription.retry.max -- **Required:** No -- **Description:** Number of retries until a websocket connection can be established with the DSF FHIR server, `-1` means infinite number of retries -- **Default:** `-1` - - -### ORG_HIGHMED_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP -- **Property:** org.highmed.dsf.bpe.fhir.task.subscription.retry.sleep -- **Required:** No -- **Description:** Milliseconds between two retries to establish a websocket connection with the DSF FHIR server -- **Default:** `5000` - - -### ORG_HIGHMED_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER -- **Property:** org.highmed.dsf.bpe.fhir.task.subscription.search.parameter -- **Required:** No -- **Description:** Subscription to receive notifications about task resources from the DSF FHIR server -- **Default:** `?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson` - - -### ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE -- **Property:** org.highmed.dsf.bpe.mail.client.certificate -- **Required:** No -- **Description:** PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via *ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS* -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/smtp_server_client_certificate.pem` - - -### ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY -- **Property:** org.highmed.dsf.bpe.mail.client.certificate.private.key -- **Required:** No -- **Description:** Private key corresponging to the SMTP server client certificate as PEM encoded file. Use ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted. Requires SMTP over TLS to be enabled via *ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS* -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/smtp_server_client_certificate_private_key.pem` - - -### ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.mail.client.certificate.private.key.password -- **Required:** No -- **Description:** Password to decrypt the local client certificate encrypted private key -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* -- **Example:** `/run/secrets/smtp_server_client_certificate_private_key.pem.password` - - -### ORG_HIGHMED_DSF_BPE_MAIL_FROMADDRESS -- **Property:** org.highmed.dsf.bpe.mail.fromAddress -- **Required:** No -- **Description:** Mail service sender address -- **Example:** `sender@localhost` - - -### ORG_HIGHMED_DSF_BPE_MAIL_HOST -- **Property:** org.highmed.dsf.bpe.mail.host -- **Required:** No -- **Description:** SMTP server hostname -- **Example:** `smtp.server.de` - - -### ORG_HIGHMED_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE -- **Property:** org.highmed.dsf.bpe.mail.mailOnErrorLogEventBufferSize -- **Required:** No -- **Description:** Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect. -- **Default:** `4` - - -### ORG_HIGHMED_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION -- **Property:** org.highmed.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation -- **Required:** No -- **Description:** Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect. -- **Default:** `/opt/bpe/log/bpe.log` - - -### ORG_HIGHMED_DSF_BPE_MAIL_PASSWORD or ORG_HIGHMED_DSF_BPE_MAIL_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.mail.password -- **Required:** No -- **Description:** SMTP server authentication password -- **Recommendation:** Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_MAIL_PASSWORD_FILE*; enable SMTP over TLS via *ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS* - - -### ORG_HIGHMED_DSF_BPE_MAIL_PORT -- **Property:** org.highmed.dsf.bpe.mail.port -- **Required:** No -- **Description:** SMTP server port -- **Example:** `465` -- **Default:** `0` - - -### ORG_HIGHMED_DSF_BPE_MAIL_REPLYTOADDRESSES -- **Property:** org.highmed.dsf.bpe.mail.replyToAddresses -- **Required:** No -- **Description:** Mail service reply to addresses; comma or space separated list, YAML block scalars supported -- **Example:** `reply.to@localhost` - - -### ORG_HIGHMED_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT -- **Property:** org.highmed.dsf.bpe.mail.sendMailOnErrorLogEvent -- **Required:** No -- **Description:** To enable mails being send for every ERROR logged, set to `true`. Requires SMTP server to be configured. -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP -- **Property:** org.highmed.dsf.bpe.mail.sendTestMailOnStartup -- **Required:** No -- **Description:** To enable a test mail being send on startup of the BPE, set to `true`. Requires SMTP server to be configured. -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_MAIL_SMIME_P12KEYSTORE -- **Property:** org.highmed.dsf.bpe.mail.smime.p12Keystore -- **Required:** No -- **Description:** PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/smime_certificate.p12` - - -### ORG_HIGHMED_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or ORG_HIGHMED_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE -- **Property:** org.highmed.dsf.bpe.mail.smime.p12Keystore.password -- **Required:** No -- **Description:** Password to decrypt the PKCS12 encoded S/MIMIE certificate file -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE* -- **Example:** `/run/secrets/smime_certificate.p12.password` - - -### ORG_HIGHMED_DSF_BPE_MAIL_TOADDRESSES -- **Property:** org.highmed.dsf.bpe.mail.toAddresses -- **Required:** No -- **Description:** Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported -- **Example:** `recipient@localhost` - - -### ORG_HIGHMED_DSF_BPE_MAIL_TOADDRESSESCC -- **Property:** org.highmed.dsf.bpe.mail.toAddressesCc -- **Required:** No -- **Description:** Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported -- **Example:** `cc.recipient@localhost` - - -### ORG_HIGHMED_DSF_BPE_MAIL_TRUST_CERTIFICATES -- **Property:** org.highmed.dsf.bpe.mail.trust.certificates -- **Required:** No -- **Description:** PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via *ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS* -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/smtp_server_trust_certificates.pem` - - -### ORG_HIGHMED_DSF_BPE_MAIL_USERNAME -- **Property:** org.highmed.dsf.bpe.mail.username -- **Required:** No -- **Description:** SMTP server authentication username -- **Recommendation:** Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via *ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS* - - -### ORG_HIGHMED_DSF_BPE_MAIL_USESMTPS -- **Property:** org.highmed.dsf.bpe.mail.useSmtps -- **Required:** No -- **Description:** To enable SMTP over TLS (smtps), set to `true` -- **Default:** `false` - - -### ORG_HIGHMED_DSF_BPE_MPI_WEBSERVICE_FACTORY_CLASS -- **Property:** org.highmed.dsf.bpe.mpi.webservice.factory.class -- **Required:** No -- **Description:** Factory for client implementations used to connect to a Master Patient Index (MPI) server in order to read patient demographic data -- **Recommendation:** The default value is a factory for a stub implementation, change to a factory for client implementation that matches the API of your MPI -- **Default:** `org.highmed.mpi.client.stub.MasterPatientIndexClientStubFactory` - - -### ORG_HIGHMED_DSF_BPE_OPENEHR_WEBSERVICE_FACTORY_CLASS -- **Property:** org.highmed.dsf.bpe.openehr.webservice.factory.class -- **Required:** No -- **Description:** Factory for client implementations used to connect to an openEHR repository in order to read patient medical data -- **Recommendation:** The default value is a factory for a stub implementation, change to a factory for client implementation that matches the API of your openEHR repository -- **Default:** `org.highmed.openehr.client.stub.OpenEhrClientStubFactory` - - -### ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED -- **Property:** org.highmed.dsf.bpe.process.excluded -- **Required:** No -- **Description:** List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported -- **Recommendation:** Only deploy processes that can be started depending on your organization's roles in the Allow-List - - -### ORG_HIGHMED_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX -- **Property:** org.highmed.dsf.bpe.process.fhir.server.retry.max -- **Required:** No -- **Description:** Number of retries until a connection can be established with the local DSF FHIR server during process deployment, `-1` means infinite number of retries -- **Default:** `-1` - - -### ORG_HIGHMED_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP -- **Property:** org.highmed.dsf.bpe.process.fhir.server.retry.sleep -- **Required:** No -- **Description:** Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment -- **Default:** `5000` - - -### ORG_HIGHMED_DSF_BPE_PROCESS_PLUGIN_DIRECTROY -- **Property:** org.highmed.dsf.bpe.process.plugin.directroy -- **Required:** No -- **Description:** Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server -- **Recommendation:** Change only if you don't use the provided directory structure from the installation guide or made changes to tit -- **Default:** `process` - - -### ORG_HIGHMED_DSF_BPE_PROCESS_RETIRED -- **Property:** org.highmed.dsf.bpe.process.retired -- **Required:** No -- **Description:** List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported -- **Recommendation:** Retire processes that where deployed previously but are not anymore available - - -### ORG_HIGHMED_DSF_BPE_PSEUDONYMIZATION_WEBSERVICE_FACTORY_CLASS -- **Property:** org.highmed.dsf.bpe.pseudonymization.webservice.factory.class -- **Required:** No -- **Description:** Factory for client implementations used to connect to a pseudonymization service in order to pseudonymize patient demographic and medical data -- **Recommendation:** The default value is a factory for a stub implementation, change to a factory for client implementation that matches the API of your pseudonymization service -- **Default:** `org.highmed.pseudonymization.client.stub.PseudonymizationClientStubFactory` diff --git a/docs/src/oldstable/releases/configFhir.md b/docs/src/oldstable/releases/configFhir.md deleted file mode 100644 index 5926d25bc..000000000 --- a/docs/src/oldstable/releases/configFhir.md +++ /dev/null @@ -1,194 +0,0 @@ -## DSF 0.9.3 Configuration Parameters - FHIR Server -Please note: Additional parameters (not listed here) are used to define elements of the external FHIR bundle. - -### ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE -- **Property:** org.highmed.dsf.fhir.client.certificate -- **Required:** Yes -- **Description:** PEM encoded file with local client certificate for https connections to remote DSF FHIR servers -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_certificate.pem` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY -- **Property:** org.highmed.dsf.fhir.client.certificate.private.key -- **Required:** Yes -- **Description:** Private key corresponding to the local client certificate as PEM encoded file. Use *ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_certificate_private_key.pem` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE -- **Property:** org.highmed.dsf.fhir.client.certificate.private.key.password -- **Required:** No -- **Description:** Password to decrypt the local client certificate encrypted private key -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* -- **Example:** `/run/secrets/app_client_certificate_private_key.pem.password` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_PROXY_PASSWORD or ORG_HIGHMED_DSF_FHIR_CLIENT_PROXY_PASSWORD_FILE -- **Property:** org.highmed.dsf.fhir.client.proxy.password -- **Required:** No -- **Description:** Proxy password, set if the the DSF FHIR server can reach the internet only through a proxy which requests authentication -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_FHIR_CLIENT_PROXY_PASSWORD_FILE* - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_PROXY_URL -- **Property:** org.highmed.dsf.fhir.client.proxy.url -- **Required:** No -- **Description:** Proxy location, set if the DSF FHIR server can reach the internet only through a proxy -- **Example:** `http://proxy.foo:8080` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_PROXY_USERNAME -- **Property:** org.highmed.dsf.fhir.client.proxy.username -- **Required:** No -- **Description:** Proxy username, set if the the DSF FHIR server can reach the internet only through a proxy which requests authentication - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_TIMEOUT_CONNECT -- **Property:** org.highmed.dsf.fhir.client.timeout.connect -- **Required:** No -- **Description:** The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `2000` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_TIMEOUT_READ -- **Property:** org.highmed.dsf.fhir.client.timeout.read -- **Required:** No -- **Description:** The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted -- **Recommendation:** Change default value only if timeout exceptions occur -- **Default:** `10000` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES -- **Property:** org.highmed.dsf.fhir.client.trust.certificates -- **Required:** Yes -- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/app_client_trust_certificates.pem` - - -### ORG_HIGHMED_DSF_FHIR_CLIENT_VERBOSE -- **Property:** org.highmed.dsf.fhir.client.verbose -- **Required:** No -- **Description:** To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to `true` -- **Default:** `false` - - -### ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD or ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE -- **Property:** org.highmed.dsf.fhir.db.liquibase.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF FHIR server to execute database migrations -- **Recommendation:** Use docker secret file to configure by using *ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE* -- **Example:** `/run/secrets/db_liquibase.password` - - -### ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_USERNAME -- **Property:** org.highmed.dsf.fhir.db.liquibase.username -- **Required:** No -- **Description:** The user name to access the database from the DSF FHIR server to execute database migrations -- **Default:** `liquibase_user` - - -### ORG_HIGHMED_DSF_FHIR_DB_URL -- **Property:** org.highmed.dsf.fhir.db.url -- **Required:** Yes -- **Description:** The address of the database used for the DSF FHIR server -- **Recommendation:** Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose -- **Example:** `jdbc:postgresql://db/fhir` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP -- **Property:** org.highmed.dsf.fhir.db.user.group -- **Required:** No -- **Description:** The name of the user group to access the database from the DSF FHIR server -- **Default:** `fhir_users` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD or ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE -- **Property:** org.highmed.dsf.fhir.db.user.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF FHIR server -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE* -- **Example:** `/run/secrets/db_user.password` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP -- **Property:** org.highmed.dsf.fhir.db.user.permanent.delete.group -- **Required:** No -- **Description:** The name of the user group to access the database from the DSF FHIR server for permanent deletes -- **Default:** `fhir_permanent_delete_users` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE -- **Property:** org.highmed.dsf.fhir.db.user.permanent.delete.password -- **Required:** Yes -- **Description:** The password to access the database from the DSF FHIR server for permanent deletes -- **Recommendation:** Use docker secret file to configure using *ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE* -- **Example:** `/run/secrets/db_user_permanent_delete.password` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME -- **Property:** org.highmed.dsf.fhir.db.user.permanent.delete.username -- **Required:** No -- **Description:** The user name to access the database from the DSF FHIR server for permanent deletes -- **Recommendation:** Use a different user then *ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME* -- **Default:** `fhir_server_permanent_delete_user` - - -### ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME -- **Property:** org.highmed.dsf.fhir.db.user.username -- **Required:** No -- **Description:** The user name to access the database from the DSF FHIR server -- **Default:** `fhir_server_user` - - -### ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL -- **Property:** org.highmed.dsf.fhir.server.base.url -- **Required:** Yes -- **Description:** The base address of this DSF FHIR server to read/store fhir resources -- **Example:** `https://foo.bar/fhir` - - -### ORG_HIGHMED_DSF_FHIR_SERVER_CORS_ORIGINS -- **Property:** org.highmed.dsf.fhir.server.cors.origins -- **Required:** No -- **Description:** List of allowed CORS origins, used to set the *Access-Control-Allow-Origin* HTTP response header, which indicates whether the response can be shared with requesting code from the given origin; comma or space separated list, YAML block scalars supported - - -### ORG_HIGHMED_DSF_FHIR_SERVER_INIT_BUNDLE -- **Property:** org.highmed.dsf.fhir.server.init.bundle -- **Required:** No -- **Description:** The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server -- **Recommendation:** Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source -- **Default:** `conf/bundle.xml` - - -### ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE -- **Property:** org.highmed.dsf.fhir.server.organization.identifier.value -- **Required:** Yes -- **Description:** The local identifier value used in the Allow-List -- **Recommendation:** By convention: The shortest possible FQDN that resolve the homepage of the organization -- **Example:** `hospital.com` - - -### ORG_HIGHMED_DSF_FHIR_SERVER_PAGE_COUNT -- **Property:** org.highmed.dsf.fhir.server.page.count -- **Required:** No -- **Description:** The page size returned by the DSF FHIR server when reading/searching fhir resources -- **Default:** `20` - - -### ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS -- **Property:** org.highmed.dsf.fhir.server.user.thumbprints -- **Required:** Yes -- **Description:** List of SHA512 thumbprints as hex from local client certificates that can be used to access the DSF FHIR server; comma or space separated list, YAML block scalars supported -- **Recommendation:** Besides the DSF BPE client certificate thumbprint, add a second thumbprint of a personal client certificate for administration purposes - - -### ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE -- **Property:** org.highmed.dsf.fhir.server.user.thumbprints.permanent.delete -- **Required:** Yes -- **Description:** List of SHA512 thumbprints as hex from local client certificates that can be used to access the DSF FHIR server for permanent deletes; comma or space separated list, YAML block scalars supported -- **Recommendation:** Besides the DSF BPE client certificate thumbprint, add a second thumbprint of a personal client certificate for administration purposes diff --git a/docs/src/oldstable/releases/configFhirReverseProxy.md b/docs/src/oldstable/releases/configFhirReverseProxy.md deleted file mode 100644 index 5b045e89b..000000000 --- a/docs/src/oldstable/releases/configFhirReverseProxy.md +++ /dev/null @@ -1,72 +0,0 @@ -## DSF 0.9.3 Configuration Parameters - FHIR Reverse Proxy - - -## APP_SERVER_IP -- **Required:** Yes -- **Description:** Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target -- **Example:** `app`, `172.28.1.3` - - -## HTTPS_SERVER_NAME_PORT -- **Required:** Yes -- **Description:** External FQDN of your DSF FHIR server with port, typically `443` -- **Example:** `my-external.fqdn:443` - - -## PROXY_PASS_CONNECTION_TIMEOUT_HTTP -- **Required:** No -- **Description:** Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established -- **Default:** `30` seconds - - -## PROXY_PASS_CONNECTION_TIMEOUT_WS -- **Required:** No -- **Description:** Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established -- **Default:** `30` seconds - - -## PROXY_PASS_TIMEOUT_HTTP -- **Required:** No -- **Description:** Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply -- **Default:** `60` seconds - - -## PROXY_PASS_TIMEOUT_WS -- **Required:** No -- **Description:** Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply -- **Default:** `60` seconds - - -## SSL_CA_CERTIFICATE_FILE -- **Required:** Yes -- **Description:** Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter `SSLCACertificateFile` -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/ssl_ca_certificate_file.pem` - - -## SSL_CA_DN_REQUEST_FILE -- **Required:** No -- **Description:** File containing all signing certificates excepted, will be used to specify the `Acceptable client certificate CA names` send to the client, during TLS handshake, sets the apache httpd parameter `SSLCADNRequestFile`; if omitted all entries from `SSL_CA_CERTIFICATE_FILE` are used -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/ssl_ca_dn_request_file.pem` - - -## SSL_CERTIFICATE_CHAIN_FILE -- **Required:** No -- **Description:** Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter `SSLCertificateChainFile`; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via `SSL_CERTIFICATE_FILE` contains the certificate chain -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/ssl_certificate_chain_file.pem` - - -## SSL_CERTIFICATE_FILE -- **Required:** Yes -- **Description:** Server certificate file, PEM encoded, sets the apache httpd parameter `SSLCertificateFile` -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/ssl_certificate_file.pem` - - -## SSL_CERTIFICATE_KEY_FILE -- **Required:** Yes -- **Description:** Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter `SSLCertificateKeyFile` -- **Recommendation:** Use docker secret file to configure -- **Example:** `/run/secrets/ssl_certificate_key_file.pem` diff --git a/docs/src/oldstable/releases/highmedInstall.md b/docs/src/oldstable/releases/highmedInstall.md deleted file mode 100644 index 65af01a49..000000000 --- a/docs/src/oldstable/releases/highmedInstall.md +++ /dev/null @@ -1,259 +0,0 @@ -This setup guide uses pre-build docker images for DSF Version 0.9.3. This guide is **only** suitable for HiGHmed organizations. -If you are not a member of HiGHmed, see [NUM-CODEX Install](NUM‐CODEX-DSF-0.9.3-Deployment). - -## Prerequisites -### Virtual Machines -* DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD -* DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD -### Docker / Docker-Compose -Both VMs need latest docker and docker-compose. For the latest install guide see https://docs.docker.com/engine/install and https://docs.docker.com/compose/install - -docker: -``` -sudo apt-get update -sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -sudo apt-get update -sudo apt-get install docker-ce docker-ce-cli containerd.io -``` - -docker-compose (warning: [2.17.3](https://github.com/docker/compose/releases/tag/v2.17.3) might not be [latest](https://github.com/docker/compose/releases)): -``` -sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -``` - -### Client/Server Certificates -Two Certificates from the DFN-PKI Global G2 (via DFN e.V.), GÉANT TCS (via DFN e.V.) or D-Trust (via TMF e.V.) are needed, more infos see [Authentication](../generalinformation/authentication) -* Certificate A: Server Certificate (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN) -* Certificate B: Client Certificate (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN) - -### Network setup / Network access -For additional information on the network setup see [Network-and-Architecture](../generalinformation/networkSetup). -* The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception. -* The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception. - -Here is a quick overview of the expected network setup. Connections to the fTTP, the terminology server and simplifier.net for validating GECCO FHIR resources as well as the local GECCO FHIR server are not listed: - -| Source | Target | Port | Protocol | -| ----------------------------- | ----------------------------- | ---- | ---------------------- | -| DSF BPE (local) | DSF FHIR (local) | 443 | https, wss | -| DSF BPE (local) | DSF FHIR (GECCO Transfer Hub) | 443 | https | -| DSF FHIR (local) | DSF FHIR (GECCO Transfer Hub) | 443 | https (HTTP HEAD only) | -| DSF BPE (GECCO Transfer Hub) | DSF FHIR (local) | 443 | https | -| DSF FHIR (GECCO Transfer Hub) | DSF FHIR (local) | 443 | https (HTTP HEAD only) | - - -### On-Boarding Excel Spreadsheet -You are required to fill out the on-boarding Excel spreadsheet, provided with the NUM-CODEX hackathon invite, and send it to the GECCO Transfer Hub. If the GECCO Transfer Hub already received and validated your On-Boarding Excel spreadsheet and you do not have to change any information, you can skip this step. - -## Setup -### Prepare Certificates -1. Server Certificate (certificate A) - _This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)_ - * Store PEM encoded certificate as `ssl_certificate_file.pem` - * Store unencrypted, PEM encoded private-key as `ssl_certificate_key_file.pem` - -1. Client Certificate (certificate B) - _This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)_ - * Store PEM encoded certificate as `client_certificate.pem` - * Store encrypted or not encrypted, PEM encoded private-key as `client_certificate_private_key.pem` - -### DSF FHIR Server -1. Add Group/User - Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below: - ``` - sudo addgroup --gid 2101 fhir - sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir - ``` - -1. Download and Extract Config Files - Download prepared DSF FHIR server config files and folder structure from - * **Test HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_fhir_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_fhir_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_test_fhir_0_9_3.tar.gz - ``` - * **Production HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_fhir_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_fhir_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_prod_fhir_0_9_3.tar.gz - ``` - _The `tar` command will unpack the config files at `/opt/fhir` assuming you changed into the `/opt` directory._ - -1. Verify that the `fhir` system user or group can write into the following folder - * `/opt/fhir/log` - -1. Add certificates and keys - * Add the server certificate (certificate A) and the corresponding private-key to **/opt/fhir/secrets/** - * ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) - * ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker) - * Add the client certificate (certificate B) and the corresponding private-key to **/opt/fhir/secrets/** - * client_certificate.pem (chmod: 440, chown: fhir:docker) - * client_certificate_private_key.pem (chmod: 440, chown: fhir:docker) - * If the private key is encrypted, add a password file with the password as the only content to **/opt/fhir/secrets/** - * client_certificate_private_key.pem.password - * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file - ``` - L39: - app_client_certificate_private_key.pem.password - ... - L56: ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ... - L136: app_client_certificate_private_key.pem.password: - L137: file: ./secrets/client_certificate_private_key.pem.password - ``` - -1. Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by `DFN-Verein Global Issuing CA` - ``` - L101: ssl_certificate_chain_file.pem: - L102: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem - ``` - -1. Modify database passwords - * **/opt/fhir/secrets/db_liquibase.password** - * Generate a random password (min. 32 characters recommended) and replace the content of the file. - * **/opt/fhir/secrets/db_user.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - * **/opt/fhir/secrets/db_user_permanent_delete.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - -1. Modify the docker-compose.yml file and set environment variables to the appropriate values - * **services -> proxy -> environment:** - * **HTTPS_SERVER_NAME_PORT**: __TODO_DSF_FRIR_SERVER_EXTERNAL_FQDN:443__ - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `foo.bar.de:443` - * For additional environment variables, see [DSF 0.9.3 FHIR Reverse Proxy configuration parameters](configFhirReverseProxy) - * **services -> app -> environment:** - * **ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL**: https://_TODO_DSF_FRIR_SERVER_EXTERNAL_FQDN_/fhir - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE**: _TODO_ORGANIZATION_IDENTIFIER_ - Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_NAME**: _TODO_ORGANIZATION_NAME_ - Set your Organizations official name, e.g. Hochschule Heilbronn - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT**: _TODO_CLIENT_CERTIFICATE_THUMBPRINT_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - Use `certtool --fingerprint --hash=sha512 --infile=client_certificate.pem` to generate the hash. - * **ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS**: _TODO_CLIENT_CERTIFICATE_THUMBPRINTS_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - This parameter is a comma separated list e.g. `ab12...37ff,f3a2...bb22`. You can add additional client certificate thumbprints for example the thumbprint of your (the admins) personal DFN PKI S/MIME certificate, to access the DSF FHIR servers REST interface. - * **ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE**: _TODO_CLIENT_CERTIFICATE_THUMBPRINTS_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - This parameter is a comma separated list e.g. `ab12...37ff,f3a2...bb22`. Usually it is not necessary to add additional thumbprints other than your client certificate (certificate B) here. When a client uses a certificate with a thumbprint listed here, the client is allowed to permanently delete FHIR resources. - * For additional environment variables, see [DSF 0.9.3 FHIR Server configuration parameters](configFhir) - -1. Start the DSF FHIR Server - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) - -### DSF BPE Server -1. Add Group/User - Add group and user used by the DSF BPE java application. Ubuntu compatible commands below: - ``` - sudo addgroup --gid 2202 bpe - sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe - ``` -1. Download and Extract Config Files - Download prepared DSF BPE server config files and folder structure from - * **Test HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_bpe_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_bpe_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_test_bpe_0_9_3.tar.gz - ``` - * **Production HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_bpe_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_bpe_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_prod_bpe_0_9_3.tar.gz - ``` - _The `tar` command will unpack the config files at `/opt/bpe` assuming you changed into the `/opt` directory._ - -1. Verify that the `bpe` system user or group can write into the following folders - * `/opt/bpe/log` - * `/opt/bpe/psn` - -1. Add certificates and keys - * Add the client certificate (certificate B) and the corresponding private-key to **/opt/bpe/secrets/** - * client_certificate.pem (chmod: 440 chown: bpe:docker) - * client_certificate_private_key.pem (chmod: 440 chown: bpe:docker) - * If the private key is encrypted, add a password file with the password as the only content to **/opt/bpe/secrets/** - * client_certificate_private_key.pem.password - * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file - ``` - L13: - app_client_certificate_private_key.pem.password - ... - L41: ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ... - L99: app_client_certificate_private_key.pem.password: - L100: file: ./secrets/client_certificate_private_key.pem.password - ``` - * Add the CRR public-key used for asymmetrically encrypting the GECCO FHIR Bundles to **/opt/bpe/secrets/** - * crr_public_key.pem (chmod: 440 chown: bpe:docker) - * You can download the 4096 Bit RSA PEM encoded public-key for - * a **Test** instance from: - https://keys.num-codex.de/crr_public-key-pre-prod.pem - * a **Production** instance from: - https://keys.num-codex.de/crr_public-key-prod.pem - -1. Modify database passwords - * **/opt/bpe/secrets/db_liquibase.password** - * Generate a random password (min. 32 characters recommended) and replace the content of the file. - * **/opt/bpe/secrets/db_user.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - * **/opt/bpe/secrets/db_user_camunda.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - -1. Modify the docker-compose.yml file and set environment variables to the appropriate values - * **services -> app -> environment:** - * **ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE**: _TODO_ORGANIZATION_IDENTIFIER_ - Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de - * **ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL**: https://__TODO_DSF_FRIR_SERVER_FQDN__/fhir - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` - * For additional environment variables, see [DSF 0.9.3 BPE Server configuration parameters](configBpe) - -1. Start the DSF BPE Server (without process plugins) - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) - -1. Verify DSF BPE Startup - * Check that the BPE was able to download new Task resources from the DSF FHIR server during startup. - * Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup. - * Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup. - - If you need to debug the TLS connection to your DSF FHIR server use for example: - `docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443` - The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like `[...]tlsv13 alert certificate required[...]` - -1. Stop the DSF BPE Server - * Hit Ctrl-C to close log - * Stop using: `docker-compose stop` - -1. Add the following DSF BPE process plugins, for instructions on how to configure the plugin, see release notes. - * **num-codex / codex-processes-ap1** version 0.7.0 or later: - https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0 - See [NUM-CODEX: Process Deployment and Configuration](https://github.com/num-codex/codex-processes-ap1/wiki/Process-Deployment-and-Configuration-v0.7.0) on how to configure the process plugin. - * **highmed / highmed-processes / data-sharing** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - * **highmed / highmed-processes / feasibility** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - * **highmed / highmed-processes / feasibility-mpc** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - * **highmed / highmed-processes / local-services** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - * **highmed / highmed-processes / ping** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - * **highmed / highmed-processes / update-allow-list** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - See [HiGHmed: Process Ping Deployment](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Deployment-v0.7.0) on how to deploy and configure the process plugin. - - _Notice: Jar-files within the folders `/opt/bpe/process` and `/opt/bpe/plugin` need to be readable by the linxux `bpe` user -> `chown root:bpe`, `chmod 440`_ - -1. Start the DSF BPE Server (with process plugins) - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) - -1. Request Allow-List upload from HiGHmed TTP - The Allow-List upload is needed in order to execute HiGHmed and NUM-CODEX processes. \ No newline at end of file diff --git a/docs/src/oldstable/releases/num-codexInstall.md b/docs/src/oldstable/releases/num-codexInstall.md deleted file mode 100644 index 84f2dca42..000000000 --- a/docs/src/oldstable/releases/num-codexInstall.md +++ /dev/null @@ -1,246 +0,0 @@ -This setup guide uses pre-build docker images for DSF Version 0.9.3. This guide is not suitable for HiGHmed organizations. -If you are a member of HiGHmed, see [HiGHmed Install](HiGHmed-DSF-0.9.3-Deployment). - -## Prerequisites -### Virtual Machines -* DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD -* DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD -### Docker / Docker-Compose -Both VMs need latest docker and docker-compose. For the latest install guide see https://docs.docker.com/engine/install and https://docs.docker.com/compose/install - -docker: -``` -sudo apt-get update -sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -sudo apt-get update -sudo apt-get install docker-ce docker-ce-cli containerd.io -``` - -docker-compose (warning: [2.17.3](https://github.com/docker/compose/releases/tag/v2.17.3) might not be [latest](https://github.com/docker/compose/releases)): -``` -sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -``` - -### Client/Server Certificates -Two Certificates from the DFN-PKI Global G2 (via DFN e.V.), GÉANT TCS (via DFN e.V.) or D-Trust (via TMF e.V.) are needed, more infos see [Authentication](../generalinformation/authentication) -* Certificate A: Server Certificate (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN) -* Certificate B: Client Certificate (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN) - -### Network setup / Network access -For additional information on the network setup see [Network-and-Architecture](../generalinformation/networkSetup). -* The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception. -* The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception. - -Here is a quick overview of the expected network setup. Connections to the fTTP, the terminology server and simplifier.net for validating GECCO FHIR resources as well as the local GECCO FHIR server are not listed: - -| Source | Target | Port | Protocol | -| ----------------------------- | ----------------------------- | ---- | ---------------------- | -| DSF BPE (local) | DSF FHIR (local) | 443 | https, wss | -| DSF BPE (local) | DSF FHIR (GECCO Transfer Hub) | 443 | https | -| DSF FHIR (local) | DSF FHIR (GECCO Transfer Hub) | 443 | https (HTTP HEAD only) | -| DSF BPE (GECCO Transfer Hub) | DSF FHIR (local) | 443 | https | -| DSF FHIR (GECCO Transfer Hub) | DSF FHIR (local) | 443 | https (HTTP HEAD only) | - -### On-Boarding Excel Spreadsheet -You are required to fill out the on-boarding Excel spreadsheet, provided with the NUM-CODEX hackathon invite, and send it to the GECCO Transfer Hub. If the GECCO Transfer Hub already received and validated your On-Boarding Excel spreadsheet and you do not have to change any information, you can skip this step. - -## Setup -### Prepare Certificates -1. Server Certificate (certificate A) - _This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)_ - * Store PEM encoded certificate as `ssl_certificate_file.pem` - * Store unencrypted, PEM encoded private-key as `ssl_certificate_key_file.pem` - -1. Client Certificate (certificate B) - _This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)_ - * Store PEM encoded certificate as `client_certificate.pem` - * Store encrypted or not encrypted, PEM encoded private-key as `client_certificate_private_key.pem` - -### DSF FHIR Server -1. Add Group/User - Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below: - ``` - sudo addgroup --gid 2101 fhir - sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir - ``` - -1. Download and Extract Config Files - Download prepared DSF FHIR server config files and folder structure from - * **Test NUM-CODEX** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_fhir_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_fhir_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_codex_test_fhir_0_9_3.tar.gz - ``` - * **Production NUM-CODEX** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_fhir_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_fhir_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_codex_prod_fhir_0_9_3.tar.gz - ``` - _The `tar` command will unpack the config files at `/opt/fhir` assuming you changed into the `/opt` directory._ - -1. Verify that the `fhir` system user or group can write into the following folder - * `/opt/fhir/log` - -1. Add certificates and keys - * Add the server certificate (certificate A) and the corresponding private-key to **/opt/fhir/secrets/** - * ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) - * ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker) - * Add the client certificate (certificate B) and the corresponding private-key to **/opt/fhir/secrets/** - * client_certificate.pem (chmod: 440, chown: fhir:docker) - * client_certificate_private_key.pem (chmod: 440, chown: fhir:docker) - * If the private key is encrypted, add a password file with the password as the only content to **/opt/fhir/secrets/** - * client_certificate_private_key.pem.password - * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file - ``` - L39: - app_client_certificate_private_key.pem.password - ... - L56: ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ... - L137: app_client_certificate_private_key.pem.password: - L138: file: ./secrets/client_certificate_private_key.pem.password - ``` - -1. Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by `DFN-Verein Global Issuing CA` - ``` - L102: ssl_certificate_chain_file.pem: - L103: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem - ``` - -1. Modify database passwords - * **/opt/fhir/secrets/db_liquibase.password** - * Generate a random password (min. 32 characters recommended) and replace the content of the file. - * **/opt/fhir/secrets/db_user.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - * **/opt/fhir/secrets/db_user_permanent_delete.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - -1. Modify the docker-compose.yml file and set environment variables to the appropriate values - * **services -> proxy -> environment:** - * **HTTPS_SERVER_NAME_PORT**: __TODO_DSF_FRIR_SERVER_EXTERNAL_FQDN:443__ - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `foo.bar.de:443` - * For additional environment variables, see [DSF 0.9.3 FHIR Reverse Proxy configuration parameters](configFhirReverseProxy) - * **services -> app -> environment:** - * **ORG_HIGHMED_DSF_FHIR_SERVER_FQDN**: _TODO_DSF_FRIR_SERVER_EXTERNAL_FQDN_ - Set your FHIR servers external FQDN, e.g. `foo.bar.de` - * **ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL**: https://_TODO_DSF_FRIR_SERVER_EXTERNAL_FQDN_/fhir - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE**: _TODO_ORGANIZATION_IDENTIFIER_ - Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_NAME**: _TODO_ORGANIZATION_NAME_ - Set your Organizations official name, e.g. Hochschule Heilbronn - * **ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT**: _TODO_CLIENT_CERTIFICATE_THUMBPRINT_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - Use `certtool --fingerprint --hash=sha512 --infile=client_certificate.pem` to generate the hash. - * **ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS**: _TODO_CLIENT_CERTIFICATE_THUMBPRINTS_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - This parameter is a comma separated list e.g. `ab12...37ff,f3a2...bb22`. You can add additional client certificate thumbprints for example the thumbprint of your (the admins) personal DFN PKI S/MIME certificate, to access the DSF FHIR servers REST interface. - * **ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE**: _TODO_CLIENT_CERTIFICATE_THUMBPRINTS_ - Set the SHA-512 Hash (lowercase hex) of your client certificate (certificate B) - This parameter is a comma separated list e.g. `ab12...37ff,f3a2...bb22`. Usually it is not necessary to add additional thumbprints other than your client certificate (certificate B) here. When a client uses a certificate with a thumbprint listed here, the client is allowed to permanently delete FHIR resources. - * For additional environment variables, see [DSF 0.9.3 FHIR Server configuration parameters](configFhir) - -1. Start the DSF FHIR Server - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) - -### DSF BPE Server -1. Add Group/User - Add group and user used by the DSF BPE java application. Ubuntu compatible commands below: - ``` - sudo addgroup --gid 2202 bpe - sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe - ``` -1. Download and Extract Config Files - Download prepared DSF BPE server config files and folder structure from - * **Test NUM-CODEX** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_bpe_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_bpe_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_codex_test_bpe_0_9_3.tar.gz - ``` - * **Production NUM-CODEX** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_bpe_0_9_3.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_bpe_0_9_3.tar.gz - sudo tar --same-owner -zxvf dsf_codex_prod_bpe_0_9_3.tar.gz - ``` - _The `tar` command will unpack the config files at `/opt/bpe` assuming you changed into the `/opt` directory._ - -1. Verify that the `bpe` system user or group can write into the following folders - * `/opt/bpe/log` - -1. Add certificates and keys - * Add the client certificate (certificate B) and the corresponding private-key to **/opt/bpe/secrets/** - * client_certificate.pem (chmod: 440 chown: bpe:docker) - * client_certificate_private_key.pem (chmod: 440 chown: bpe:docker) - * If the private key is encrypted, add a password file with the password as the only content to **/opt/bpe/secrets/** - * client_certificate_private_key.pem.password - * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file - ``` - L13: - app_client_certificate_private_key.pem.password - ... - L38: ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ... - L92: app_client_certificate_private_key.pem.password: - L93: file: ./secrets/client_certificate_private_key.pem.password - ``` - * Add the CRR public-key used for asymmetrically encrypting the GECCO FHIR Bundles to **/opt/bpe/secrets/** - * crr_public_key.pem (chmod: 440 chown: bpe:docker) - * You can download the 4096 Bit RSA PEM encoded public-key for - * a **Test** instance from: - https://keys.num-codex.de/crr_public-key-pre-prod.pem - * a **Production** instance from: - https://keys.num-codex.de/crr_public-key-prod.pem - -1. Modify database passwords - * **/opt/bpe/secrets/db_liquibase.password** - * Generate a random password (min. 32 characters recommended) and replace the content of the file. - * **/opt/bpe/secrets/db_user.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - * **/opt/bpe/secrets/db_user_camunda.password** - * Generate a random password (min. 16 characters recommended) and replace the content of the file. - -1. Modify the docker-compose.yml file and set environment variables to the appropriate values - * **services -> app -> environment:** - * **ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE**: _TODO_ORGANIZATION_IDENTIFIER_ - Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de - * **ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL**: https://__TODO_DSF_FRIR_SERVER_FQDN__/fhir - Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` - * For additional environment variables, see [DSF 0.9.3 BPE Server configuration parameters](configBpe) - -1. Start the DSF BPE Server (without process plugins) - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) - -1. Verify DSF BPE Startup - * Check that the BPE was able to download new Task resources from the DSF FHIR server during startup. - * Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup. - * Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup. - - If you need to debug the TLS connection to your DSF FHIR server use for example: - `docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443` - The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like `[...]tlsv13 alert certificate required[...]` - -1. Stop the DSF BPE Server - * Hit Ctrl-C to close log - * Stop using: `docker-compose stop` - -1. Add the following DSF BPE process plugins, for instructions on how to configure the plugin, see release notes. - * **num-codex / codex-processes-ap1** version 0.7.0 or later: - https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0 - See [NUM-CODEX: Process Deployment and Configuration](https://github.com/num-codex/codex-processes-ap1/wiki/Process-Deployment-and-Configuration-v0.7.0) on how to deploy and configure the process plugin. - * **highmed / highmed-processes / ping** version 0.7.0 or later: - https://github.com/highmed/highmed-processes/releases/tag/v0.7.0 - See [HiGHmed: Process Ping Deployment](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Deployment-v0.7.0) on how to deploy and configure the process plugin. - - _Notice: Jar-files within the folders `/opt/bpe/process` and `/opt/bpe/plugin` need to be readable by the linxux `bpe` user -> `chown root:bpe`, `chmod 440`_ - -1. Start the DSF BPE Server (with process plugins) - Start using: `docker-compose up -d && docker-compose logs -f` (Ctrl-C will close log, but not stop container) \ No newline at end of file diff --git a/docs/src/oldstable/releases/upgradeFrom7.md b/docs/src/oldstable/releases/upgradeFrom7.md deleted file mode 100644 index c356d5427..000000000 --- a/docs/src/oldstable/releases/upgradeFrom7.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: Upgrading from 0.7.0 to 0.9.0 -icon: install ---- -Upgrading the DSF from 0.7.0 to 0.9.0 involves replacing a config file, modifying the docker-compose.yml files, replacing the process plugins and recreating the containers. - -**If you are upgrading from 0.6.0 please see the [Upgrade from 0.6.0 to 0.7.0 guide](https://github.com/highmed/highmed-dsf/wiki/DSF-Upgrade-From-0.6.0-to-0.7.0) first.** - - -## Modify DSF FHIR Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_0.9.0_upgrade` - -1. Modify the DSF FHIR docker-compose.yml file, replace 0.7.0 with 0.9.0 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - proxy: - - image: ghcr.io/highmed/fhir_proxy:0.7.0 - + image: ghcr.io/highmed/fhir_proxy:0.9.0 - restart: on-failure - ports: - - 127.0.0.1:80:80 - @@ -27,7 +27,7 @@ services: - - app - - app: - - image: ghcr.io/highmed/fhir:0.7.0 - + image: ghcr.io/highmed/fhir:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient"] - ``` - -1. Download prepared DSF FHIR server config files and extract/replace the external FHIR bundle - * **Test NUM-CODEX** (non HiGHmed) instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_fhir_0_9_0.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_test_fhir_0_9_0.tar.gz - sudo tar --same-owner -zxvf dsf_codex_test_fhir_0_9_0.tar.gz fhir/conf/bundle.xml - ``` - * **Test HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_fhir_0_9_0.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_test_fhir_0_9_0.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_test_fhir_0_9_0.tar.gz fhir/conf/bundle.xml - ``` - * **Production NUM-CODEX** (non HiGHmed) instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_fhir_0_9_0.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_codex_prod_fhir_0_9_0.tar.gz - sudo tar --same-owner -zxvf dsf_codex_prod_fhir_0_9_0.tar.gz fhir/conf/bundle.xml - ``` - * **Production HiGHmed** instance: - https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_fhir_0_9_0.tar.gz - ``` - cd /opt - wget https://github.com/highmed/highmed-dsf/wiki/resources/dsf_highmed_prod_fhir_0_9_0.tar.gz - sudo tar --same-owner -zxvf dsf_highmed_prod_fhir_0_9_0.tar.gz fhir/conf/bundle.xml - ``` - The command will update the external FHIR bundle at `/opt/fhir/conf/bundle.xml` - - The output of the tar command should be - ``` - fhir/conf/bundle.xml - ``` - -1. Upgrade the DSF FHIR containers - From `/opt/fhir` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -## Modify DSF BPE Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_0.9.0_upgrade` - -1. Modify the DSF BPE docker-compose.yml file - * **NUM-CODEX** (non HiGHmed) instance: - Change the bpe container version from 0.7.0 to 0.9.0, update the process exclude config and remove a bind mount - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.7.0 - + image: ghcr.io/highmed/bpe:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - @@ -29,9 +29,6 @@ services: - - type: bind - source: ./log - target: /opt/bpe/log - - - type: bind - - source: ./last_event - - target: /opt/bpe/last_event - - type: bind - source: ./cache - target: /opt/bpe/cache - @@ -48,8 +45,8 @@ services: - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: TODO_ORGANIZATION_IDENTIFIER - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://TODO_DSF_FRIR_SERVER_FQDN/fhir - ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED: | - - wwwnetzwerk-universitaetsmedizinde_dataTranslate/0.6.0 - - wwwnetzwerk-universitaetsmedizinde_dataReceive/0.6.0 - + wwwnetzwerk-universitaetsmedizinde_dataTranslate/0.7.0 - + wwwnetzwerk-universitaetsmedizinde_dataReceive/0.7.0 - - #TODO modify ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED for later process versions - #TODO add process specific environment variables, see process documentation - ``` - - * **HiGHmed** instance: - Change the bpe container version from 0.7.0 to 0.9.0, update the process exclude config, and remove a bind mount - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.7.0 - + image: ghcr.io/highmed/bpe:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - @@ -29,9 +29,6 @@ services: - - type: bind - source: ./log - target: /opt/bpe/log - - - type: bind - - source: ./last_event - - target: /opt/bpe/last_event - - type: bind - source: ./psn - target: /opt/bpe/psn - @@ -51,11 +48,11 @@ services: - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: TODO_ORGANIZATION_IDENTIFIER - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://TODO_DSF_FRIR_SERVER_FQDN/fhir - ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED: | - - highmedorg_computeFeasibility/0.6.0 - - highmedorg_computeDataSharing/0.6.0 - - highmedorg_updateAllowList/0.6.0 - - wwwnetzwerk-universitaetsmedizinde_dataTranslate/0.6.0 - - wwwnetzwerk-universitaetsmedizinde_dataReceive/0.6.0 - + highmedorg_computeFeasibility/0.7.0 - + highmedorg_computeDataSharing/0.7.0 - + highmedorg_updateAllowList/0.7.0 - + wwwnetzwerk-universitaetsmedizinde_dataTranslate/0.7.0 - + wwwnetzwerk-universitaetsmedizinde_dataReceive/0.7.0 - - #TODO modify ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED for later process versions - #TODO add process specific environment variables, see process documentation - ``` - -1. Upgrade DSF Plugins and Process-Plugins - * **NUM-CODEX** (non HiGHmed) instance: - * Process plugins in `/opt/bpe/process`: - 1. Replace `codex-process-data-transfer-0.6.0.jar` with `codex-process-data-transfer-0.7.0.jar` from the [latest NUM-CODEX processes release](https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0) - 1. Replace `dsf-bpe-process-ping-0.6.0.jar` with `dsf-bpe-process-ping-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - - Make sure the process plugins in `/opt/bpe/process` are configured with `chmod 440` and `chown root:bpe`. - * **HiGHmed** instance: - * Process plugins in `/opt/bpe/process`: - 1. Replace `codex-process-data-transfer-0.6.0.jar` with `codex-process-data-transfer-0.7.0.jar` from the [latest NUM-CODEX processes release](https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0) - 1. Replace `dsf-bpe-process-data-sharing-0.6.0.jar` with `dsf-bpe-process-data-sharing-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-feasibility-0.6.0.jar` with `dsf-bpe-process-feasibility-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-feasibility-mpc-0.6.0.jar` with `dsf-bpe-process-feasibility-mpc-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-local-services-0.6.0.jar` with `dsf-bpe-process-local-services-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-ping-0.6.0.jar` with `dsf-bpe-process-ping-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-update-allow-list-0.6.0.jar` with `dsf-bpe-process-update-allow-list-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - - Make sure the process plugins in `/opt/bpe/process` are configured with `chmod 440` and `chown root:bpe`. - - * Plugins in '/opt/bpe/plugin': - 1. If you are using the provided PDQ MPI Client, replace `dsf-mpi-client-pdq-0.7.0.jar`, `hapi-base-2.3.jar` and `hapi-structures-v25-2.3.jar` with the new files from `dsf-mpi-client-pdq-0.9.0.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.0) - 1. If you are using the provided openEHR Client, replace `dsf-openehr-client-impl-0.7.0.jar` with the new file from `dsf-openehr-client-impl-0.9.0.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.0) - - Make sure the plugins in `/opt/bpe/plugin` are configured with `chmod 440` and `chown root:bpe`. - - -1. Upgrade the DSF BPE containers - From `/opt/bpe` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -1. Verify your upgrade: - * Verify the DSF FHIR server is running in version 0.9.0. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 0.9.0, [...]` - * Verify the DSF FHIR server started without errors - * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) - * Verify the DSF BPE server is running in version 0.9.0. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 0.9.0, [...]` - * Verify the DSF BPE server started without errors - * Verify the DSF BPE server removed ActivityDefinition resources for the deleted process plugin from the DSF FHIR server and created new ActivityDefinition for the new process plugin. - * Verify your install with a ping/pong test - For a Task resource compatible with the 0.7.0 release of the ping process, see the [Ping/Pong process wiki](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Start-v0.7.0). \ No newline at end of file diff --git a/docs/src/oldstable/releases/upgradeFrom8.md b/docs/src/oldstable/releases/upgradeFrom8.md deleted file mode 100644 index cfd5c587f..000000000 --- a/docs/src/oldstable/releases/upgradeFrom8.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Upgrading from 0.8.0 to 0.9.0 -icon: install ---- -Upgrading the DSF from 0.8.0 to 0.9.0 involves modifying the docker-compose.yml files, replacing the process plugins and recreating the containers. - -**If you are upgrading from 0.6.0 please see the [Upgrade from 0.6.0 to 0.7.0 guide](https://github.com/highmed/highmed-dsf/wiki/DSF-Upgrade-From-0.6.0-to-0.7.0) first and then visit the [Upgrade from 0.7.0 to 0.9.0 guide](https://github.com/highmed/highmed-dsf/wiki/DSF-Upgrade-From-0.7.0-to-0.9.0).** -**If you are upgrading from 0.7.0 please see the [Upgrade from 0.7.0 to 0.9.0 guide](upgradeFrom7.md).** - - -## Modify DSF FHIR Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_0.9.0_upgrade` - -1. Modify the DSF FHIR docker-compose.yml file, replace 0.8.0 with 0.9.0 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - proxy: - - image: ghcr.io/highmed/fhir_proxy:0.8.0 - + image: ghcr.io/highmed/fhir_proxy:0.9.0 - restart: on-failure - ports: - - 127.0.0.1:80:80 - @@ -27,7 +27,7 @@ services: - - app - - app: - - image: ghcr.io/highmed/fhir:0.8.0 - + image: ghcr.io/highmed/fhir:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient"] - ``` - -1. Upgrade the DSF FHIR containers - From `/opt/fhir` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -## Modify DSF BPE Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_0.9.0_upgrade` - -1. Modify the DSF BPE docker-compose.yml file - * **NUM-CODEX** (non HiGHmed) instance: - Change the bpe container version from 0.8.0 to 0.9.0, update the process exclude config and remove a bind mount - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.8.0 - + image: ghcr.io/highmed/bpe:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - ``` - - * **HiGHmed** instance: - Change the bpe container version from 0.7.0 to 0.9.0, update the process exclude config, and remove a bind mount - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.8.0 - + image: ghcr.io/highmed/bpe:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - @@ -48,9 +48,9 @@ services: - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: TODO_ORGANIZATION_IDENTIFIER - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://TODO_DSF_FRIR_SERVER_FQDN/fhir - ORG_HIGHMED_DSF_BPE_PROCESS_EXCLUDED: | - - highmedorg_computeFeasibility/0.6.0 - - highmedorg_computeDataSharing/0.6.0 - - highmedorg_updateAllowList/0.6.0 - + highmedorg_computeFeasibility/0.7.0 - + highmedorg_computeDataSharing/0.7.0 - + highmedorg_updateAllowList/0.7.0 - wwwnetzwerk-universitaetsmedizinde_dataTranslate/0.7.0 - wwwnetzwerk-universitaetsmedizinde_dataReceive/0.7.0 - - ``` - -1. Upgrade DSF Plugins and Process-Plugins - * **NUM-CODEX** (non HiGHmed) instance: - * Process plugins in `/opt/bpe/process`: - 1. Replace `codex-process-data-transfer-0.6.0.jar` with `codex-process-data-transfer-0.7.0.jar` from the [latest NUM-CODEX processes release](https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0) - 1. Replace `dsf-bpe-process-ping-0.6.0.jar` with `dsf-bpe-process-ping-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - - Make sure the process plugins in `/opt/bpe/process` are configured with `chmod 440` and `chown root:bpe`. - * **HiGHmed** instance: - * Process plugins in `/opt/bpe/process`: - 1. Replace `codex-process-data-transfer-0.6.0.jar` with `codex-process-data-transfer-0.7.0.jar` from the [latest NUM-CODEX processes release](https://github.com/num-codex/codex-processes-ap1/releases/tag/v0.7.0) - 1. Replace `dsf-bpe-process-data-sharing-0.6.0.jar` with `dsf-bpe-process-data-sharing-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-feasibility-0.6.0.jar` with `dsf-bpe-process-feasibility-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-feasibility-mpc-0.6.0.jar` with `dsf-bpe-process-feasibility-mpc-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-local-services-0.6.0.jar` with `dsf-bpe-process-local-services-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-ping-0.6.0.jar` with `dsf-bpe-process-ping-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - 1. Replace `dsf-bpe-process-update-allow-list-0.6.0.jar` with `dsf-bpe-process-update-allow-list-0.7.0.jar` from the [latest HiGHmed processes release](https://github.com/highmed/highmed-processes/tree/v0.7.0) - - Make sure the process plugins in `/opt/bpe/process` are configured with `chmod 440` and `chown root:bpe`. - - * Plugins in '/opt/bpe/plugin': - 1. If you are using the provided PDQ MPI Client, replace `dsf-mpi-client-pdq-0.7.0.jar`, `hapi-base-2.3.jar` and `hapi-structures-v25-2.3.jar` with the new files from `dsf-mpi-client-pdq-0.9.0.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.0) - 1. If you are using the provided openEHR Client, replace `dsf-openehr-client-impl-0.7.0.jar` with the new file from `dsf-openehr-client-impl-0.9.0.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.0) - - Make sure the plugins in `/opt/bpe/plugin` are configured with `chmod 440` and `chown root:bpe`. - - -1. Upgrade the DSF BPE containers - From `/opt/bpe` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -1. Verify your upgrade: - * Verify the DSF FHIR server is running in version 0.9.0. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 0.9.0, [...]` - * Verify the DSF FHIR server started without errors - * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) - * Verify the DSF BPE server is running in version 0.9.0. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 0.9.0, [...]` - * Verify the DSF BPE server started without errors - * Verify the DSF BPE server removed ActivityDefinition resources for the deleted process plugin from the DSF FHIR server and created new ActivityDefinition for the new process plugin. - * Verify your install with a ping/pong test - For a Task resource compatible with the 0.7.0 release of the ping process, see the [Ping/Pong process wiki](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Start-v0.7.0). \ No newline at end of file diff --git a/docs/src/oldstable/releases/upgradeFrom90.md b/docs/src/oldstable/releases/upgradeFrom90.md deleted file mode 100644 index 3397ca62f..000000000 --- a/docs/src/oldstable/releases/upgradeFrom90.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Upgrading from 0.9.0 to 0.9.1 -icon: install ---- -Upgrading the DSF from 0.9.0 to 0.9.1 involves modifying the docker-compose.yml files, replacing the process plugins and recreating the containers. - - -**If you are upgrading from 0.8.0 please see the [Upgrade from 0.8.0 to 0.9.0 guide](upgradeFrom8.md).** - - -## Modify DSF FHIR Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_0.9.1_upgrade` - -1. Modify the DSF FHIR docker-compose.yml file, replace 0.9.0 with 0.9.1 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - proxy: - - image: ghcr.io/highmed/fhir_proxy:0.9.0 - + image: ghcr.io/highmed/fhir_proxy:0.9.1 - restart: on-failure - ports: - - 127.0.0.1:80:80 - @@ -27,7 +27,7 @@ services: - - app - - app: - - image: ghcr.io/highmed/fhir:0.9.0 - + image: ghcr.io/highmed/fhir:0.9.1 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient"] - ``` - -1. Upgrade the DSF FHIR containers - From `/opt/fhir` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -## Modify DSF BPE Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_0.9.1_upgrade` - -1. Modify the DSF BPE docker-compose.yml file - * **NUM-CODEX** (non HiGHmed) instance: - Change the bpe container version from 0.9.0 to 0.9.1 - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.9.0 - + image: ghcr.io/highmed/bpe:0.9.1 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - ``` - - * **HiGHmed** instance: - Change the bpe container version from 0.9.0 to 0.9.1 - - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.8.0 - + image: ghcr.io/highmed/bpe:0.9.0 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - ``` - -1. Upgrade DSF Plugins and Process-Plugins - * Plugins in '/opt/bpe/plugin': - 1. If you are using the provided PDQ MPI Client, replace `dsf-mpi-client-pdq-0.7.0.jar`, `hapi-base-2.3.jar` and `hapi-structures-v25-2.3.jar` with the new files from `dsf-mpi-client-pdq-0.9.1.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.1) - 1. If you are using the provided openEHR Client, replace `dsf-openehr-client-impl-0.7.0.jar` with the new file from `dsf-openehr-client-impl-0.9.1.zip`, see [DSF release notes](https://github.com/highmed/highmed-dsf/releases/tag/v0.9.1) - - Make sure the plugins in `/opt/bpe/plugin` are configured with `chmod 440` and `chown root:bpe`. - - -1. Upgrade the DSF BPE containers - From `/opt/bpe` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -1. Verify your upgrade: - * Verify the DSF FHIR server is running in version 0.9.1. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 0.9.1, [...]` - * Verify the DSF FHIR server started without errors - * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) - * Verify the DSF BPE server is running in version 0.9.1. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 0.9.1, [...]` - * Verify the DSF BPE server started without errors - * Verify the DSF BPE server removed ActivityDefinition resources for the deleted process plugin from the DSF FHIR server and created new ActivityDefinition for the new process plugin. - * Verify your install with a ping/pong test - For a Task resource compatible with the 0.7.0 release of the ping process, see the [Ping/Pong process wiki](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Start-v0.7.0). \ No newline at end of file diff --git a/docs/src/oldstable/releases/upgradeFrom91.md b/docs/src/oldstable/releases/upgradeFrom91.md deleted file mode 100644 index a2d14f047..000000000 --- a/docs/src/oldstable/releases/upgradeFrom91.md +++ /dev/null @@ -1,72 +0,0 @@ -# Upgrading from 0.9.1 -Upgrading the DSF from 0.9.1 to 0.9.2 involves modifying the docker-compose.yml files and recreating the containers. - -**As the upgrade from 0.9.0 to 0.9.1 does not require any changes except the change of the version numbers, you can directly follow the following instructions.** - -## Modify DSF FHIR Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_0.9.2_upgrade` - -1. Modify the DSF FHIR docker-compose.yml file, replace 0.9.1 (or 0.9.0) with 0.9.2 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - proxy: - - image: ghcr.io/highmed/fhir_proxy:0.9.1 - + image: ghcr.io/highmed/fhir_proxy:0.9.2 - restart: on-failure - ports: - - 127.0.0.1:80:80 - @@ -27,7 +27,7 @@ services: - - app - - app: - - image: ghcr.io/highmed/fhir:0.9.1 - + image: ghcr.io/highmed/fhir:0.9.2 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient"] - ``` - -1. Upgrade the DSF FHIR containers - From `/opt/fhir` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -## Modify DSF BPE Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_0.9.2_upgrade` - -1. Modify the DSF BPE docker-compose.yml file, replace 0.9.1 (or 0.9.0) with 0.9.2 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.9.1 - + image: ghcr.io/highmed/bpe:0.9.2 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - ``` - -1. Upgrade the DSF BPE containers - From `/opt/bpe` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -1. Verify your upgrade: - * Verify the DSF FHIR server is running in version 0.9.2. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 0.9.2, [...]` - * Verify the DSF FHIR server started without errors - * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) - * Verify the DSF BPE server is running in version 0.9.2. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 0.9.2, [...]` - * Verify the DSF BPE server started without errors - * Verify your install with a ping/pong test - For a Task resource compatible with the 0.7.0 release of the ping process, see the [Ping/Pong process wiki](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Start-v0.7.0). \ No newline at end of file diff --git a/docs/src/oldstable/releases/upgradeFrom92.md b/docs/src/oldstable/releases/upgradeFrom92.md deleted file mode 100644 index d074c7a9b..000000000 --- a/docs/src/oldstable/releases/upgradeFrom92.md +++ /dev/null @@ -1,72 +0,0 @@ -# Upgrading from 0.9.2 -Upgrading the DSF from 0.9.2 to 0.9.3 involves modifying the docker-compose.yml files and recreating the containers. - -**As the upgrade from 0.9.0 to 0.9.1 and 0.9.1 to 0.9.2 does not require any changes except the change of the version numbers, you can directly follow the following instructions.** - -## Modify DSF FHIR Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_0.9.3_upgrade` - -1. Modify the DSF FHIR docker-compose.yml file, replace 0.9.2 (or 0.9.0, 0.9.1) with 0.9.3 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - proxy: - - image: ghcr.io/highmed/fhir_proxy:0.9.2 - + image: ghcr.io/highmed/fhir_proxy:0.9.3 - restart: on-failure - ports: - - 127.0.0.1:80:80 - @@ -27,7 +27,7 @@ services: - - app - - app: - - image: ghcr.io/highmed/fhir:0.9.2 - + image: ghcr.io/highmed/fhir:0.9.3 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient"] - ``` - -1. Upgrade the DSF FHIR containers - From `/opt/fhir` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -## Modify DSF BPE Server Setup -1. Preparation / Backup - * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. - For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_0.9.3_upgrade` - -1. Modify the DSF BPE docker-compose.yml file, replace 0.9.2 (or 0.9.0, 0.9.1) with 0.9.3 - ```diff - @@ -1,7 +1,7 @@ - version: '3.8' - services: - app: - - image: ghcr.io/highmed/bpe:0.9.2 - + image: ghcr.io/highmed/bpe:0.9.3 - restart: on-failure - healthcheck: - test: ["CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient"] - ``` - -1. Upgrade the DSF BPE containers - From `/opt/bpe` execute - ``` - docker-compose up -d && docker-compose logs -f - ``` - -1. Verify your upgrade: - * Verify the DSF FHIR server is running in version 0.9.3. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 0.9.3, [...]` - * Verify the DSF FHIR server started without errors - * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) - * Verify the DSF BPE server is running in version 0.9.3. The log should contain a message: - `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 0.9.3, [...]` - * Verify the DSF BPE server started without errors - * Verify your install with a ping/pong test - For a Task resource compatible with the 0.7.0 release of the ping process, see the [Ping/Pong process wiki](https://github.com/highmed/highmed-processes/wiki/Process-Ping-Start-v0.7.0). \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/README.md b/docs/src/oldstable/tutorial/README.md deleted file mode 100644 index d47ec3525..000000000 --- a/docs/src/oldstable/tutorial/README.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: DSF Process Plugin Tutorial -icon: slides ---- -## Implementing BPMN Processes as DSF Process-Plugins - -This [repository](https://github.com/highmed/dsf-process-tutorial) contains exercises to learn how to implement process plugins for the [Data Sharing Framework (DSF)](https://github.com/highmed/highmed-dsf). The tutorial is divided into several exercises that build on each other. For each exercise, a sample solution is provided in a separate branch. -This tutorial was first executed at the [GMDS / TMF 2022](https://gmds-tmf-2022.de/) conference. A recording of the opening remarks by H. Hund and R. Wettstein can be found on [YouTube](https://gmds-tmf-2022.de/). The slides of the opening remarks are available as a [PDF download](https://raw.githubusercontent.com/highmed/dsf-process-tutorial/main/exercises/figures/2022-08-21_GMDS_2022_DSF_Process_Tutorial.pdf). - -### Prerequisites ---- -In order to be able to solve the exercises described in this tutorial a software development environment with git, Java 11, Maven 3.8, Docker, docker-compose, a Java IDE like Eclipse or IntelliJ, a BPMN Editor like the Camunda Modeler and a minimum 16GB of RAM is needed. For more details see the [detailed prerequisites document](/oldstable/tutorial/prerequisites.md). - -### Exercise 1 - Simple Process ---- -The first exercise focuses on setting up the testing environment used in this tutorial and shows how to implement and execute a simple BPMN process. For more details see the [exercise 1 description](/oldstable/tutorial/exercise1-simpleProcess.md). - -#### Exercise 1.1 - Process Debugging ---- -Exercise 1.1 looks at how to use the Java debugger of your IDE to remote debug the execution of a process plugin. For more details see the [exercise 1.1 description](/oldstable/tutorial/exercise11-processDebugging.md). - -### Exercise 2 - Input Parameters ---- -In order to configure processes that are packaged as process plugins, we will take a look at two possibilities on how to pass parameters to a process. For more details see the [exercise 2 description](/oldstable/tutorial/exercise2-inputParameters.md). - -### Exercise 3 - Message Events ---- -Communication between organizations is modeled using message flow in BPMN processes. The third exercise shows how a process at one organization can trigger a process at another organization. For more details see the [exercise 3 description](/oldstable/tutorial/exercise3-messageEvents.md). - -### Exercise 4 - Exclusive Gateways ---- -Different execution paths in a process based on the state of process variables can be achieved using Exclusive Gateways. In Exercise 4 we will examine how this can be implemented. For more details see the [exercise 4 description](/oldstable/tutorial/exercise4-exclusiveGateways.md). - -### Exercise 5 - Event Based Gateways and Intermediate Events ---- -In the final exercise we will look at message flow between three organizations as well as how to continue a waiting process if no return message arrives. For more details see the [exercise 5 description](/oldstable/tutorial/exercise5-eventBasedGateways.md). - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/ex11-docker-composeyml.md b/docs/src/oldstable/tutorial/ex11-docker-composeyml.md deleted file mode 100644 index f43466a21..000000000 --- a/docs/src/oldstable/tutorial/ex11-docker-composeyml.md +++ /dev/null @@ -1,469 +0,0 @@ ---- -title: Exercise 1.1 - Process Debugging -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - -### docker-compose.yml -```yml -version: '3.8' -services: - proxy: - image: nginx:1.23 - restart: "no" - ports: - - 127.0.0.1:443:443 - secrets: - - proxy_certificate_and_int_cas.pem - - proxy_certificate_private_key.pem - - proxy_trusted_client_cas.pem - volumes: - - type: bind - source: ./proxy/conf.d - target: /etc/nginx/conf.d - read_only: true - - type: bind - source: ./proxy/nginx.conf - target: /etc/nginx/nginx.conf - read_only: true - networks: - dic-fhir-frontend: - ipv4_address: 172.20.0.66 - hrp-fhir-frontend: - ipv4_address: 172.20.0.82 - cos-fhir-frontend: - ipv4_address: 172.20.0.98 - internet: - aliases: - - cos - - dic - - hrp - environment: - TZ: Europe/Berlin - - db: - image: postgres:13 - restart: "no" - healthcheck: - test: ["CMD-SHELL", "pg_isready -U liquibase_user -d postgres"] - interval: 10s - timeout: 5s - retries: 5 - environment: - TZ: Europe/Berlin - POSTGRES_PASSWORD_FILE: /run/secrets/db_liquibase.password - POSTGRES_USER: liquibase_user - POSTGRES_DB: postgres - networks: - - cos-fhir-backend - - dic-fhir-backend - - hrp-fhir-backend - - cos-bpe-backend - - dic-bpe-backend - - hrp-bpe-backend - secrets: - - db_liquibase.password - volumes: - - type: volume - source: db-data - target: /var/lib/postgresql/data - - type: bind - source: ./db/init-db.sh - target: /docker-entrypoint-initdb.d/init-db.sh - read_only: true - - cos-fhir: - image: ghcr.io/highmed/fhir:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5002:5002 - secrets: - - db_liquibase.password - - db_cos_fhir_user.password - - db_cos_fhir_user_permanent_delete.password - - app_client_trust_certificates.pem - - app_cos_client_certificate.pem - - app_cos_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./cos/fhir/conf/bundle.xml - target: /opt/fhir/conf/bundle.xml - - type: bind - source: ./cos/fhir/log - target: /opt/fhir/log - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5002 - ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE: /run/secrets/db_cos_fhir_user.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE: /run/secrets/db_cos_fhir_user_permanent_delete.password - ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_cos_client_certificate.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_cos_client_certificate_private_key.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_FHIR_DB_URL: jdbc:postgresql://db/cos_fhir - ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP: cos_fhir_users - ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME: cos_fhir_server_user - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: cos_fhir_permanent_delete_users - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: cos_fhir_server_permanent_delete_user - ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: https://cos/fhir - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_COS - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${COS_USER_THUMBPRINTS} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${COS_USER_THUMBPRINTS_PERMANENT_DELETE} - networks: - cos-fhir-frontend: - ipv4_address: 172.20.0.99 - cos-fhir-backend: - internet: - depends_on: - - db - - proxy - cos-bpe: - image: ghcr.io/highmed/bpe:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5005:5005 - secrets: - - db_liquibase.password - - db_cos_bpe_user.password - - db_cos_bpe_user_camunda.password - - app_client_trust_certificates.pem - - app_cos_client_certificate.pem - - app_cos_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./cos/bpe/plugin - target: /opt/bpe/plugin - read_only: true - - type: bind - source: ./cos/bpe/process - target: /opt/bpe/process - read_only: true - - type: bind - source: ./cos/bpe/log - target: /opt/bpe/log - - type: bind - source: ./cos/bpe/last_event - target: /opt/bpe/last_event - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE: /run/secrets/db_cos_bpe_user.password - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE: /run/secrets/db_cos_bpe_user_camunda.password - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_cos_client_certificate.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_cos_client_certificate_private_key.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_BPE_DB_URL: jdbc:postgresql://db/cos_bpe - ORG_HIGHMED_DSF_BPE_DB_USER_GROUP: cos_bpe_users - ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: cos_bpe_server_user - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: cos_camunda_users - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: cos_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_COS - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://cos/fhir - networks: - cos-bpe-frontend: - cos-bpe-backend: - internet: - depends_on: - - db - - cos-fhir - - dic-fhir: - image: ghcr.io/highmed/fhir:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5000:5000 - secrets: - - db_liquibase.password - - db_dic_fhir_user.password - - db_dic_fhir_user_permanent_delete.password - - app_client_trust_certificates.pem - - app_dic_client_certificate.pem - - app_dic_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./dic/fhir/conf/bundle.xml - target: /opt/fhir/conf/bundle.xml - - type: bind - source: ./dic/fhir/log - target: /opt/fhir/log - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5000 - ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE: /run/secrets/db_dic_fhir_user.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE: /run/secrets/db_dic_fhir_user_permanent_delete.password - ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_dic_client_certificate.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_dic_client_certificate_private_key.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_FHIR_DB_URL: jdbc:postgresql://db/dic_fhir - ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP: dic_fhir_users - ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME: dic_fhir_server_user - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: dic_fhir_permanent_delete_users - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: dic_fhir_server_permanent_delete_user - ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: https://dic/fhir - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_DIC - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${DIC_USER_THUMBPRINTS} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${DIC_USER_THUMBPRINTS_PERMANENT_DELETE} - networks: - dic-fhir-frontend: - ipv4_address: 172.20.0.67 - dic-fhir-backend: - internet: - depends_on: - - db - - proxy - dic-bpe: - image: ghcr.io/highmed/bpe:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5003:5003 - secrets: - - db_liquibase.password - - db_dic_bpe_user.password - - db_dic_bpe_user_camunda.password - - app_client_trust_certificates.pem - - app_dic_client_certificate.pem - - app_dic_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./dic/bpe/plugin - target: /opt/bpe/plugin - read_only: true - - type: bind - source: ./dic/bpe/process - target: /opt/bpe/process - read_only: true - - type: bind - source: ./dic/bpe/log - target: /opt/bpe/log - - type: bind - source: ./dic/bpe/last_event - target: /opt/bpe/last_event - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5003 - ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE: /run/secrets/db_dic_bpe_user.password - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE: /run/secrets/db_dic_bpe_user_camunda.password - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_dic_client_certificate.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_dic_client_certificate_private_key.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_BPE_DB_URL: jdbc:postgresql://db/dic_bpe - ORG_HIGHMED_DSF_BPE_DB_USER_GROUP: dic_bpe_users - ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: dic_bpe_server_user - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: dic_camunda_users - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: dic_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_DIC - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://dic/fhir - networks: - dic-bpe-frontend: - dic-bpe-backend: - internet: - depends_on: - - db - - dic-fhir - - hrp-fhir: - image: ghcr.io/highmed/fhir:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5001:5001 - secrets: - - db_liquibase.password - - db_hrp_fhir_user.password - - db_hrp_fhir_user_permanent_delete.password - - app_client_trust_certificates.pem - - app_hrp_client_certificate.pem - - app_hrp_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./hrp/fhir/conf/bundle.xml - target: /opt/fhir/conf/bundle.xml - - type: bind - source: ./hrp/fhir/log - target: /opt/fhir/log - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5001 - ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE: /run/secrets/db_hrp_fhir_user.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE: /run/secrets/db_hrp_fhir_user_permanent_delete.password - ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_hrp_client_certificate.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_hrp_client_certificate_private_key.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_FHIR_DB_URL: jdbc:postgresql://db/hrp_fhir - ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP: hrp_fhir_users - ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME: hrp_fhir_server_user - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: hrp_fhir_permanent_delete_users - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: hrp_fhir_server_permanent_delete_user - ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: https://hrp/fhir - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${HRP_USER_THUMBPRINTS} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${HRP_USER_THUMBPRINTS_PERMANENT_DELETE} - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_HRP - networks: - hrp-fhir-frontend: - ipv4_address: 172.20.0.83 - hrp-fhir-backend: - internet: - depends_on: - - db - - proxy - hrp-bpe: - image: ghcr.io/highmed/bpe:0.7.0 - restart: "no" - ports: - - 127.0.0.1:5004:5004 - secrets: - - db_liquibase.password - - db_hrp_bpe_user.password - - db_hrp_bpe_user_camunda.password - - app_client_trust_certificates.pem - - app_hrp_client_certificate.pem - - app_hrp_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - volumes: - - type: bind - source: ./hrp/bpe/plugin - target: /opt/bpe/plugin - read_only: true - - type: bind - source: ./hrp/bpe/process - target: /opt/bpe/process - read_only: true - - type: bind - source: ./hrp/bpe/log - target: /opt/bpe/log - - type: bind - source: ./hrp/bpe/last_event - target: /opt/bpe/last_event - environment: - TZ: Europe/Berlin - EXTRA_JVM_ARGS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5004 - ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE: /run/secrets/db_hrp_bpe_user.password - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE: /run/secrets/db_hrp_bpe_user_camunda.password - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_hrp_client_certificate.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_hrp_client_certificate_private_key.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_BPE_DB_URL: jdbc:postgresql://db/hrp_bpe - ORG_HIGHMED_DSF_BPE_DB_USER_GROUP: hrp_bpe_users - ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: hrp_bpe_server_user - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: hrp_camunda_users - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: hrp_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_HRP - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://hrp/fhir - networks: - hrp-bpe-frontend: - hrp-bpe-backend: - internet: - depends_on: - - db - - hrp-fhir - -secrets: - proxy_certificate_and_int_cas.pem: - file: ./secrets/proxy_certificate_and_int_cas.pem - proxy_certificate_private_key.pem: - file: ./secrets/proxy_certificate_private_key.pem - proxy_trusted_client_cas.pem: - file: ./secrets/proxy_trusted_client_cas.pem - - db_liquibase.password: - file: ./secrets/db_liquibase.password - - db_dic_fhir_user.password: - file: ./secrets/db_dic_fhir_user.password - db_dic_fhir_user_permanent_delete.password: - file: ./secrets/db_dic_fhir_user_permanent_delete.password - db_dic_bpe_user.password: - file: ./secrets/db_dic_bpe_user.password - db_dic_bpe_user_camunda.password: - file: ./secrets/db_dic_bpe_user_camunda.password - - db_hrp_fhir_user.password: - file: ./secrets/db_hrp_fhir_user.password - db_hrp_fhir_user_permanent_delete.password: - file: ./secrets/db_hrp_fhir_user_permanent_delete.password - db_hrp_bpe_user.password: - file: ./secrets/db_hrp_bpe_user.password - db_hrp_bpe_user_camunda.password: - file: ./secrets/db_hrp_bpe_user_camunda.password - - db_cos_fhir_user.password: - file: ./secrets/db_cos_fhir_user.password - db_cos_fhir_user_permanent_delete.password: - file: ./secrets/db_cos_fhir_user_permanent_delete.password - db_cos_bpe_user.password: - file: ./secrets/db_cos_bpe_user.password - db_cos_bpe_user_camunda.password: - file: ./secrets/db_cos_bpe_user_camunda.password - - app_client_trust_certificates.pem: - file: ./secrets/app_client_trust_certificates.pem - app_client_certificate_private_key.pem.password: - file: ./secrets/app_client_certificate_private_key.pem.password - - app_dic_client_certificate.pem: - file: ./secrets/app_dic_client_certificate.pem - app_dic_client_certificate_private_key.pem: - file: ./secrets/app_dic_client_certificate_private_key.pem - - app_hrp_client_certificate.pem: - file: ./secrets/app_hrp_client_certificate.pem - app_hrp_client_certificate_private_key.pem: - file: ./secrets/app_hrp_client_certificate_private_key.pem - - app_cos_client_certificate.pem: - file: ./secrets/app_cos_client_certificate.pem - app_cos_client_certificate_private_key.pem: - file: ./secrets/app_cos_client_certificate_private_key.pem - -networks: - internet: - dic-fhir-frontend: - driver: bridge - ipam: - driver: default - config: - - subnet: 172.20.0.64/28 - dic-fhir-backend: - dic-bpe-frontend: - dic-bpe-backend: - hrp-fhir-frontend: - driver: bridge - ipam: - driver: default - config: - - subnet: 172.20.0.80/28 - hrp-fhir-backend: - hrp-bpe-frontend: - hrp-bpe-backend: - cos-fhir-frontend: - driver: bridge - ipam: - driver: default - config: - - subnet: 172.20.0.96/28 - cos-fhir-backend: - cos-bpe-frontend: - cos-bpe-backend: - - -volumes: - db-data: - name: dsf-process-tutorial-db -``` - - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md b/docs/src/oldstable/tutorial/exercise1-simpleProcess.md deleted file mode 100644 index b50920c6c..000000000 --- a/docs/src/oldstable/tutorial/exercise1-simpleProcess.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Exercise 1 - Simple Process -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | Exercise 1 | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - -## Exercise 1 - Simple Process - -The first exercise focuses on setting up the testing environment used in this tutorial and shows how to implement and execute a simple BPMN process. - -With this exercise we will take a look at the general setup of the tutorial code base, modify a service class and execute the service within a simple demo process. - -### Introduction ---- -#### Tutorial Code Base Structure and Docker Test Setup - -The tutorial project consists of three parts: A `test-data-generator` project used to generate X.509 certificates and FHIR resources during the maven build of the project. The certificates and FHIR resources are needed to start DSF instances simulating installations at three different organizations used for this tutorial. The DSF instances are configured using a `docker-compose.yml` file in the `test-setup` folder. The docker-compose test setup uses a single PostgreSQL database server, a single nginx reverse proxy as well as three separate DSF FHIR server- and 3 separate DSF BPE server instances. The `tutorial-process` project contains all resource (FHIR resources, BPMN process models and Java code) for the actual DSF process plugin. - -Java code for the `tutorial-process` project is located at `src/main/java`, FHIR resources and BPMN process models at `src/main/resources` as well as prepared JUnit tests to verify your solution at `src/test/java`. - -#### Process Plugin Main Components - -The most imported Java class used to specify the process plugin for the DSF BPE server is a class that implements the `org.highmed.dsf.bpe.ProcessPluginDefinition` interface from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module. The DSF BPE server searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. For this tutorial the `TutorialProcessPluginDefinition` class implements this interface. It is appropriately specified in the `src/main/resources/META-INF/services/org.highmed.dsf.bpe`.ProcessPluginDefinition file. The `TutorialProcessPluginDefinition` class is used to specify name and version of the process plugin, what BPMN processes are to be deployed and what FHIR resources and required by the BPMN processes. For the implementation of service task and message events of the processes a special Spring context is used for every process plugin. The `TutorialProcessPluginDefinition` class specifies what via [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) with Spring Beans are used for the process plugin specific Spring Context. For this plugin the `TutorialConfig` cass is used to define Spring Beans. - -The business process engine used by the DSF BPE server is based on the OpenSource Camunda Process Engine 7. In order to specify what Java code should be executed for a BPMN [ServiceTask](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/service-task/) you need to specify the fully-qualified Java class name in the ServiceTask inside the BPMN model. To be executable the Java class needs to extend the `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` from the DSF [dsf-bpe-process-base](https://github.com/highmed/highmed-dsf/packages/503054) module and the class needs to be defined as as Spring Bean. - -#### Process Execution and FHIR Task Resources - -Business process instances are started or the execution continued via FHIR [Task](http://hl7.org/fhir/R4/task.html) resources. The [Task](http://hl7.org/fhir/R4/task.html) resource specifies what process to instantiate or continue, what organization is requesting this action and what organization is the target for the request. When a [Task](http://hl7.org/fhir/R4/task.html) resource starts a process we call it "leading", when it continues a process it's called "current". This differentiation is important for multi-instance use cases not covered by this tutorial. Each Java class extending the abstract class `org.highmed.dsf.bpe.delegate.AbstractServiceDelegate` has methods to access both types of [Task](http://hl7.org/fhir/R4/task.html) resources. - -#### Process Access Control - -FHIR [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources are used to announce what processes can be instantiated at a given DSF instance. These resources are used by the DSF to specify what profile the [Task](http://hl7.org/fhir/R4/task.html) resource needs to conform to and what BPMN message name is used to correlate the appropriate start or intermediate event within the BPMN model. The [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) also defines what kind of organization can request the instantiation or continuation of a process instance and what kind of organization are allowed to fulfill the request. - -We will take a closer look as [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources in [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) and [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md). - -### Exercise Tasks ---- -1. Add a log message to the ``HelloDic#doExecute`` method that logs the recipient organization identifier from the "leading" Task. -2. Register the ``HelloDic`` class as a singleton bean in the TutorialConfig class. -3. Set the HelloDic class as the service implementation of the appropriate service task within the ``hello-dic.bpmn`` process model. -4. Modify the ActivityDefinition for the ``highmedorg_helloDic`` process to only allow local clients to instantiate the process via a ``helloDic`` message. - -### Solution Verification ---- -#### Maven Build and Automated Tests - -Execute a maven build of the dsf-process-tutorial parent module via: -``` -mvn clean install -Pexercise-1 -``` -Verify that the build was successful and no test failures occurred. - -#### Process Execution and Manual Tests - -To verify the ``highmedorg_helloDic`` process can be executed successfully, we need to deploy it into a DSF instance and execute the process. The maven ``install`` build is configured to create a process jar file with all necessary resources and to copy the jar to the appropriate locations of the docker test setup. - -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -Verify the DSF FHIR server started successfully. You can access the webservice of the DSF FHIR server at https://dic/fhir. -The DSF FHIR server uses a server certificate that was generated during the first maven install build. To authenticate yourself to the server you can use the client certificate located at ``.../dsf-process-tutorial/test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12`` (Password: password). Add the certificate and the generated Root CA to your browser certificate store. - -Caution: If you add the generated Root CA to your browsers certificate store as a trusted Root CA, make sure you are the only one with access to the private key at ``.../dsf-process-tutorial/test-data-generator/cert/ca/testca_private-key.pem``. - -2. Start the DSF BPE server for the ``Test_DIC`` organization in a second console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-bpe -``` -Verify the DSF BPE server started successfully and deployed the highmedorg_helloDic process. The DSF BPE server should print a message that the process was deployed. The DSF FHIR server should now have a new ActivityDefinition resource. Go to https://dic/fhir/ActivityDefinition to check if the expected resource was created by the BPE while deploying the process. The returned FHIR Bundle should contain a single ActivityDefinition. Also, go to https://dic/fhir/StructureDefinition?url=http://highmed.org/fhir/StructureDefinition/task-hello-dic to check if the expected Task profile was created. - - -3. Start the ``highmedorg_helloDic`` process by posting an appropriate FHIR [Task](http://hl7.org/fhir/R4/task.html) resource to the DSF FHIR server: - -The [Task](http://hl7.org/fhir/R4/task.html) resource is used to tell the DSF BPE server via the DSF FHIR server that a specific organization wants to start (or continue) one process instance at a specified organization. The needed [Task](http://hl7.org/fhir/R4/task.html) resource can be generated and posted to the DSF FHIR server by executing the ``main`` method of the ``org.highmed.dsf.process.tutorial.TutorialExampleStarter`` class. For the TutorialExampleStarter to work the location of the client certificate and its password need to be specified: - -- Either specify the location and password via program arguments: 1. location of the client certificate (``.../dsf-process-tutorial/test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12``), 2. password for the client certificate (``password``) -- Or set the environment variables ``DSF_CLIENT_CERTIFICATE_PATH`` and ``DSF_CLIENT_CERTIFICATE_PASSWORD`` with the appropriate values. - -Verify that the FHIR [Task](http://hl7.org/fhir/R4/task.html) resource could be created at the DSF FHIR server. The TutorialExampleStarter class should print a message ``HTTP 201: Created`` showing that the [Task](http://hl7.org/fhir/R4/task.html) resource was created. - -Verify that the ``highmedorg_helloDic`` process was executed by the DSF BPE server. The BPE server should print a message showing that the process was started, print the log message you added to the ``HelloDic`` class and end with a message showing that the process finished. - - -Continue with [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md). - ---- -[Prerequisites](/oldstable/tutorial/prerequisites.md) | Exercise 1 | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise11-processDebugging.md b/docs/src/oldstable/tutorial/exercise11-processDebugging.md deleted file mode 100644 index 2ba01c121..000000000 --- a/docs/src/oldstable/tutorial/exercise11-processDebugging.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Exercise 1.1 - Process Debugging -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | Exercise 1.1 | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - -## Exercise 1.1 - Process Debugging - -This exercise looks at how to use the Java debugger of your IDE to remote debug the execution of a process plugin. - -### Introduction ---- -The DSF FHIR server and the DSF BPE server applications are written in Java and as such are execute on a headless JRE 11 within their docker containers. Command line arguments can be passed to the JVM inside the ghcr.io/highmed/fhir and ghcr.io/highmed/bpe docker images by specifying the environment variable ``EXTRA_JVM_ARGS``. This can be used for example to configure the minimum and maximum heap of the JVM; but can also be used to specify a remote debugging port, which we will use in this exercise. - -An ``EXTRA_JVM_ARGS`` environment variable is already configure for all DSF FHIR server and DSF BPE server docker containers in the tutorial docker-compose test setup. Take a look at the [docker-compose.yml](/oldstable/tutorial/ex11-docker-composeyml.md) file to lookup the port numbers specified for the different DSF FHIR and DSF BPE servers. - -### Exercise Tasks ---- -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -2. Start the DSF BPE server for the ``Test_DIC`` organization in second console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-bpe -``` -3. Configure your Java IDE for remote debugging - -- Eclipse: -![Eclipse](/photos/guideline/tutorial/eclipse.png) - -- IntelliJ: -![IntelliJ](/photos/guideline/tutorial/intelliJ.png) - - -4. Create a debug breakpoint in the first line of the ``HelloDic`` class ``doExecute`` method. - -5. Start your previously defined remote Java debugger in your IDE. - -6. Execute the ``TutorialExampleStarter`` class to start ``highmed_helloDic`` process. - -7. User your IDE's debugger to step thru the code of the ``HelloDic`` class ``doExecute`` method. - -Continue with [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md). - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | Exercise 1.1 | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise2-inputParameters.md b/docs/src/oldstable/tutorial/exercise2-inputParameters.md deleted file mode 100644 index f1fb17bd1..000000000 --- a/docs/src/oldstable/tutorial/exercise2-inputParameters.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Exercise 2 - Input Parameters -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | Exercise 2 | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - - -## Exercise 2 - Input Parameters -In order to configure processes that are packaged as process plugins, we will take a look at two possibilities on how to pass parameters to a process. The goal of this exercise is to enhance the ``highmedorg_helloDic`` process by trying them both. - -### Introduction ---- -DSF process plugins can be configured with input parameters using two different approaches: - -- Static configuration using environment variables during the deployment of a process plugin. -- Dynamic configuration by sending values as part of the [Task](http://hl7.org/fhir/R4/task.html) resource to start or continue a process instance. - -#### Environment Variables -Environment variables are the same for all running process instances and allow static configuration of processes. They can be defined by adding a member variable having the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class ``TutorialConfig``. The value of the annotation uses the ``${..}`` notation and follows the form ``${some.property:defaultValue}``, where each dot in the property name corresponds to an underscore in the environment variable and environment variables are always written upper-case. The property ``some.property`` therefore corresponds to the environment variable ``SOME_PROPERTY``. - -To create an automated documentation of environment variables during the Maven build process, the DSF provided [@ProcessDocumentation](https://github.com/highmed/highmed-dsf/blob/main/dsf-tools/dsf-tools-documentation-generator/src/main/java/org/highmed/dsf/tools/generator/ProcessDocumentation.java) annotation from the package ``org.highmed.dsf.tools.generator`` can be used. The ``pom.xml`` of the ``tutorial-process`` submodule calls the DSF provided [DocumentGenerator](https://github.com/highmed/highmed-dsf/blob/main/dsf-tools/dsf-tools-documentation-generator/src/main/java/org/highmed/dsf/tools/generator/DocumentationGenerator.java) class from the same package during the prepare-package phase of the build process. The generator searches for all [@ProcessDocumentation](https://github.com/highmed/highmed-dsf/blob/main/dsf-tools/dsf-tools-documentation-generator/src/main/java/org/highmed/dsf/tools/generator/ProcessDocumentation.java) annotations and generates a Markdown documentation based on the annotation's values in the target folder. - -#### Task Input Parameters -Providing input parameters to a specific process instance allows for dynamic configuration of process instances. It can be done by sending additional values as part of the [Task](http://hl7.org/fhir/R4/task.html) resource that starts or continues a process instance. It should be noted that a FHIR profile must be created for each [Task](http://hl7.org/fhir/R4/task.html) resource, i.e. for each message event in a process model, which inherits from the [DSF Task Base Profile](https://github.com/highmed/highmed-dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/highmed-task-base-0.5.0.xml). This base profile defines three default input parameters: - -- ``message-name`` (mandatory 1..1): the name of the BPMN message event, same as in the BPMN model -- ``business-key`` (optional 0..1): used to identify process instances -- ``correlation-key``(optional 0..1): used to identify multi-instance process instances used for messaging multiple targets - -A later exercise will examine these input parameters and their meaning in more detail. - -Since input parameters of [Task](http://hl7.org/fhir/R4/task.html) resources are identified by predefined codes, they are defined via FHIR [CodeSystem](http://hl7.org/fhir/R4/codesystem.html) and [ValueSet](hl7.org/fhir/R4/valueset.html) resources. The [BPMN-Message CodeSystem](https://github.com/highmed/highmed-dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/highmed-bpmn-message-0.5.0.xml) and the [BPMN-Message ValueSet](https://github.com/highmed/highmed-dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/ValueSet/highmed-bpmn-message-0.5.0.xml) are used in the [DSF Task Base Profile](https://github.com/highmed/highmed-dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/highmed-task-base-0.5.0.xml) to define the three default input parameters of [Task](http://hl7.org/fhir/R4/task.html) resources. - -#### Version and Release-Date Placeholders -To avoid the need to specify the version and release date for each [CodeSystem](http://hl7.org/fhir/R4/codesystem.html), [StructureDefinition (Task profile)](http://hl7.org/fhir/R4/structuredefinition.html) and [ValueSet](http://hl7.org/fhir/R4/valueset.html) resource, the placeholders ``#{version}`` and ``#{date}`` can be used. They are replaced with the values returned by the methods ``ProcessPluginDefinition#getVersion()`` and ``ProcessPluginDefinition#getReleaseDate()`` respectively during deployment of a process plugin by the DSF BPE server. - -Read Access Tag -While writing FHIR resources on the DSF FHIR server is only allowed by the own organization (except [Task](http://hl7.org/fhir/R4/task.html)), rules have to be defined for reading FHIR resources by external organizations (again except [Task](http://hl7.org/fhir/R4/task.html)). The ``Resource.meta.tag`` field is used for this purpose. To allow read access for all organizations (the standard for metadata resources), the following ``read-access-tag`` value can be written into this field: -```xml -<meta> - <tag> - <system value="http://highmed.org/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> -</meta> -``` -The read access rules for [Task](http://hl7.org/fhir/R4/task.html) resources are defined through the fields ``Task.requester`` and ``Task.restriction.recipient``. Therefore, no ``read-access-tag`` is needed. - -It is also possible to restrict read access of FHIR resources to organizations with a specific role in a consortium or a specific identifier, but this is not covered in the tutorial. - -The write access rules for [Task](http://hl7.org/fhir/R4/task.html) resources are defined through the [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources belonging to the process. We will take a look at this in [exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) and [exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md). - - -### Exercise Tasks ---- -1. Add an environment variable to enable/disable logging to the ``TutorialConfig`` class specify the default value as ``false``. -2. Inject the value of the environment variable in to ``HelloDic`` class, by modifying its constructor and using the new field of the ``TutorialConfig`` class. -3. Use the value of the environment variable in the ``HelloDic`` class to decide whether the log message from exercise 1 should be printed. -4. Adapt ``test-setup/docker-compose.yml`` by adding the new environment variable to the service dic-bpe and set the value to ``"true"``. -5. Create a new [CodeSystem](http://hl7.org/fhir/R4/codesystem.html) with url ``http://highmed.org/fhir/CodeSystem/tutorial`` having a concept with code ``tutorial-input``. -6. Create a new [ValueSet](http://hl7.org/fhir/R4/valueset.html) with url ``http://highmed.org/fhir/ValueSet/tutorial`` that includes all concepts from the [CodeSystem](http://hl7.org/fhir/R4/codesystem.html). -7. Add the new [CodeSystem](http://hl7.org/fhir/R4/codesystem.html) and ValueSet resources to the highmedorg_helloDic process in the TutorialProcessPluginDefinition class. -8. Add a new input parameter of type ``string`` to the ``task-hello-dic.xml`` [Task](http://hl7.org/fhir/R4/task.html) profile using the concept of the new [CodeSystem](http://hl7.org/fhir/R4/codesystem.html) as a fixed coding. -9. Read the new input parameter in the ``HelloDic`` class from the "leading" [Task](http://hl7.org/fhir/R4/task.html) and add the value to the log message from exercise 1. -10. Adapt the starter class ``TutorialExampleStarter`` by adding the new input parameter with an arbitrary string. - - -### Solution Verification ---- -#### Maven Build and Automated Tests - -Execute a maven build of the ``dsf-process-tutorial`` parent module via: -``` -mvn clean install -Pexercise-2 -``` -Verify that the build was successful and no test failures occurred. - -#### Process Execution and Manual Tests - -To verify the ``highmedorg_helloDic`` process can be executed successfully, we need to deploy it into a DSF instance and execute the process. The maven ``install`` build is configured to create a process jar file with all necessary resources and copy the jar to the appropriate locations of the docker test setup. - -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -Verify the DSF FHIR server started successfully. - -2. Start the DSF BPE server for the ``Test_DIC`` organization in second console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-bpe -``` -Verify the DSF BPE server started successfully and deployed the highmedorg_helloDic process. - -3. Start the ``highmedorg_helloDic`` process by posting an appropriate FHIR [Task](http://hl7.org/fhir/R4/task.html) resource to the DSF FHIR server of the ``Test_DIC`` organization: Execute the ``main`` method of the ``org.highmed.dsf.process.tutorial.TutorialExampleStarter`` class as in [exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) to create the [Task](http://hl7.org/fhir/R4/task.html) resource needed to start the ``highmedorg_helloDic`` process. - -Verify that the ``highmedorg_helloDic`` process was executed by the DSF BPE server. The BPE server should: -- Print a message showing that the process was started. -- If logging is enabled - print the log message and the value of the input parameter you added to the ``HelloDic`` implementation. -- Print a message showing that the process finished. - -Check that you can disable logging of you message by modifying the ``docker-compose.yml`` file and configuring your environment variable with the value ``"false"`` or removing the environment variable. -Note: Changes to environment variable require recreating the docker container. - -Also check that modification to the [Task](http://hl7.org/fhir/R4/task.html) input parameter specified in the ``TutorialExampleStarter`` class, have the appropriate effect on your log message. - -Continue with [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md). - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | Exercise 2 | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise3-messageEvents.md b/docs/src/oldstable/tutorial/exercise3-messageEvents.md deleted file mode 100644 index af6314b0f..000000000 --- a/docs/src/oldstable/tutorial/exercise3-messageEvents.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Exercise 3 - Message Events -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | Exercise 3 | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - -## Exercise 3 - Message Events -Communication between organizations is modeled using message flow in BPMN processes. The third exercise shows how a process at one organization can trigger a process at another organization. - -To demonstrate communication between two organizations we will configure message flow between the processes ``highmedorg_helloDic`` and ``highmedorg_helloCos``. The processes are then to be executed at the organizations ``Test_DIC`` and ``Test_COS`` respectively in the docker test setup, with the former triggering execution of the latter by automatically sending a [Task](http://hl7.org/fhir/R4/task.html) from organization ``Test_DIC`` to organization ``Test_COS``. - -### Introduction ---- -#### Message Flow and FHIR Task resources - -BPMN processes are instantiated and started within the DSF by creating a matching FHIR [Task](http://hl7.org/fhir/R4/task.html) resource in the DSF FHIR server. This is true for executing a process on the local DSF BPE server by manually creating a [Task](http://hl7.org/fhir/R4/task.html) resource, but also works by creating and starting a process instance at a remote DSF BPE server from an executing process automatically. - -In order to exchange information between different processes, for example at two different organizations, BPMN message flow is used. Typically represented by a dashed line arrow between elements with black (send) and white (receive) envelop icons. The following BPMN collaboration diagram shows two processes. The process at "Organization 1" is sending a message to "Organization 2" which results in the instantiation and execution of new process instance at the second organization. - -![Message Flow](/photos/guideline/tutorial/ex3.png) - -Every time message flow is used in a BPMN process for the DSF, a corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) profile needs to be specified for every interaction. This profile specifies which process should be started or continued and what the message name is when correlating the appropriate [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event) or [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event). A *Business Key* and a *Correlation Key* are specified if different process instances need to be linked to a single execution, for example to be able to send a message back. - -#### BPMN Process Definition Key vs. FHIR Task.instantiatesUri and ActivityDefinition.url / version - -FHIR ActivityDefinition resources are used to announce what processes can be instantiated at a given DSF instance. They also control what kind of organization can request the instantiation or continuation of a process instance and what kind of organization is allowed to fulfill the request. - -In order to link the FHIR and BPMN worlds the BPMN process definition key needs to be specified following the pattern ``^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$`` for example: -``` -domainorg_processKey -``` -In addition the BPM process needs to specify a process version with the pattern ``^\d+.\d+.\d+$`` for example: -``` -1.0.0 -``` -This results in a canonical URL used to identify the process, for example: -``` -http://domain.org/bpe/Process/processKey/1.0.0 -``` -The canonical URL is used for [Task.instantiatesUri](http://hl7.org/fhir/R4/task.html) and [ActivityDefinition.url / version](http://hl7.org/fhir/R4/activitydefinition.html). - - -#### ActivityDefinitions for the DSF - -FHIR [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources are used to announce what processes can be instantiated at a given DSF instance and contain the authorization rules for the specified process. [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) for the DSF need to comply with the http://highmed.org/fhir/StructureDefinition/activity-definition profile, with authorization rules configured using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization extension. - -The authorization extension needs to be configured at least once and has four sub extensions: - -##### message-name [1..1] - -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. - -##### task-profile [1..1] - -Canonical URL value specifying the [Task](http://hl7.org/fhir/R4/task.html) profile this authorization rule should match. Can only be specified once per authorization rule extension. - -##### requester [1..] - -Coding value matching entries from the http://highmed.org/fhir/ValueSet/process-authorization-requester ValueSet: - -- LOCAL_ORGANIZATION A local organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- REMOTE_ORGANIZATION A remote (non local) organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- LOCAL_ROLE A local organizations with a specific role defined via [OrganizationAffiliation](http://hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- REMOTE_ROLE A remote (non local) organizations with a specific role defined via [OrganizationAffiliation](hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- LOCAL_ALL All local organizations regardless of their identifier or role in a consortium. - -- REMOTE_ALL All remote (non local) organizations regardless of their identifier or role in a consortium. - -##### recipient [1..] - -Coding value matching entries from the http://highmed.org/fhir/ValueSet/process-authorization-recipient ValueSet. - -- LOCAL_ORGANIZATION Organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- LOCAL_ROLE Organizations with a specific role defined via [OrganizationAffiliation](http://hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- LOCAL_ALL All organizations regardless of their identifier or role in a consortium. - -The local organization of a DSF instance is configured using the environment variables [ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE](https://github.com/highmed/highmed-dsf/wiki/DSF-0.7.0-Configuration-Parameters-FHIR#org_highmed_dsf_fhir_server_organization_identifier_value) for the DSF FHIR server and [ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE](https://github.com/highmed/highmed-dsf/wiki/DSF-0.7.0-Configuration-Parameters-BPE#org_highmed_dsf_bpe_fhir_server_organization_identifier_value) for the DSF BPE server. - -#### Authorization Extension Example - -The following example specifies that process execution can only be requested by a organization with a specific identifier and only allows execution of the process in the DSF instance of an organization with a specific identifier. -```xml -<extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="some-message-name" /> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://foo.org/fhir/StructureDefinition/profile|#{version}" /> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://highmed.org/sid/organization-identifier" /> - <value value="identifier.remote.org" /> - </valueIdentifier> - </extension> - <system value="http://highmed.org/fhir/CodeSystem/process-authorization" /> - <code value="REMOTE_ORGANIZATION" /> - </valueCoding> - </extension> - <extension url="recipient"> - <valueCoding> - <extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://highmed.org/sid/organization-identifier" /> - <value value="identifier.local.org" /> - </valueIdentifier> - </extension> - <system value="http://highmed.org/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ORGANIZATION" /> - </valueCoding> - </extension> -</extension> -``` - -### Exercise Tasks ---- -1. Modify the ``highmedorg_helloDic`` process in the ``hello-dic.bpmn`` file and replace the [End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/none-events/#none-end-event) with a [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event). Configure input parameters ``instantiatesUri``, ``profile`` and ``messageName`` in the BPMN model for the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event). Set the message name of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) and configure it to be executed using the HelloCosMessage class. - Use http://highmed.org/fhir/StructureDefinition/task-hello-cos|#{version} as the profile and ``helloCos`` as the message name. Figure out what the appropriate ``instantiatesUri`` value is, based on the name (process definition key) of the process to be triggered. -2. Modify the ``highmedorg_helloCos`` process in the ``hello-cos.bpmn`` file and configure the message name of the [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event) with the same value as the message name of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) in the ``highmedorg_helloDic`` process. -3. Create a new [StructureDefinition](http://hl7.org/fhir/R4/structuredefinition.html) with a [Task](http://hl7.org/fhir/R4/task.html) profile for the ``helloCos`` message. -4. Create a new [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource for the ``highmedorg_helloCos`` process and configure the authorization extension to allow the ``Test_DIC`` organization as the requester and the ``Test_COS`` organization as the recipient. -5. Add the ``highmedorg_helloCos`` process and its resources to the ``TutorialProcessPluginDefinition`` class. -6. Modify ``HelloDic`` service class to set the ``target`` process variable for the ``Test_COS`` organization. -7. Configure the ``HelloCosMessage`` class as a spring in the ``TutorialConfig`` class. - - -### Solution Verification ---- -#### Maven Build and Automated Tests - -Execute a maven build of the ``dsf-process-tutorial`` parent module via: -``` -mvn clean install -Pexercise-3 -``` -Verify that the build was successful and no test failures occurred. - -#### Process Execution and Manual Tests - -To verify the ``highmedorg_helloDic`` and ``highmedorg_helloCos`` processes can be executed successfully, we need to deploy them into DSF instances and execute the ``highmedorg_helloDic`` process. The maven ``install`` build is configured to create a process jar file with all necessary resources and copy the jar to the appropriate locations of the docker test setup. - -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -Verify the DSF FHIR server started successfully. - -2. Start the DSF BPE server for the ``Test_DIC`` organization in another console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-bpe -``` -Verify the DSF BPE server started successfully and deployed the highmedorg_helloDic process. - -3. Start the DSF FHIR server for the ``Test_COS`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-fhir -``` -Verify the DSF FHIR server started successfully. You can access the webservice of the DSF FHIR server at https://cos/fhir. -The DSF FHIR server uses a server certificate that was generated during the first maven build. To authenticate yourself to the server you can use the client certificate located at ``.../dsf-process-tutorial/test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12`` (Password: password). - -4. Start the DSF BPE server for the ``Test_COS`` organization in another console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-bpe -``` -Verify the DSF BPE server started successfully and deployed the ``highmedorg_helloCos`` process. The DSF BPE server should print a message that the process was deployed. The DSF FHIR server should now have a new [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource. Go to https://cos/fhir/ActivityDefinition to check if the expected resource was created by the BPE while deploying the process. The returned FHIR [Bundle](http://hl7.org/fhir/R4/bundle.html) should contain two [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources. Also, go to https://cos/fhir/StructureDefinition?url=http://highmed.org/fhir/StructureDefinition/task-hello-cos to check if the expected [Task](http://hl7.org/fhir/R4/task.html) profile was created. - -5. Start the ``highmedorg_helloDic`` process by posting a specific FHIR [Task](http://hl7.org/fhir/R4/task.html) resource to the DSF FHIR server of the ``Test_DIC`` organization: Execute therefore the ``main`` method of the ``org.highmed.dsf.process.tutorial.TutorialExampleStarter`` class to create the Task resource needed to start the ``highmedorg_helloDic`` process. - -Verify that the FHIR [Task](http://hl7.org/fhir/R4/task.html) resource was created at the DSF FHIR server and the ``highmedorg_helloDic`` process was executed by the DSF BPE server of the ``Test_DIC`` organization. The DSF BPE server of the ``Test_DIC`` organization should print a message showing that a [Task](http://hl7.org/fhir/R4/task.html) resource to start the ``highmedorg_helloCos`` process was send to the ``Test_COS`` organization. -Verify that a FHIR [Task](http://hl7.org/fhir/R4/task.html) resource was created at the DSF FHIR server of the ``Test_COS`` organization and the ``highmedorg_helloCos`` process was then executed by the DSF BPE server of the ``Test_COS`` organization. - - -Continue with [exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md). - - - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | Exercise 3 | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md b/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md deleted file mode 100644 index e11e63562..000000000 --- a/docs/src/oldstable/tutorial/exercise4-exclusiveGateways.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Exercise 4 - Exclusive Gateways -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | Exercise 4 | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - -## Exercise 4 - Exclusive Gateways -Different execution paths in a process based on the state of process variables can be achieved using Exclusive Gateways. In Exercise 4 we will examine how this can be implemented by modifying the ``highmedorg_helloDic`` process. - -### Introduction ---- -#### Exclusive Gateways - -Different sequence flows during the execution of a process instance can be modeled using BPMN [Exclusive Gateways](https://docs.camunda.org/manual/7.4/reference/bpmn20/gateways/exclusive-gateway/). For each outgoing sequence flow of the gateway, a BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) can be added to the process model, deciding whether a sequence flow should be followed. Thereby, all condition decisions must be in an XOR relationship to each other. - -#### Condition Expressions - -A BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) uses the ``${..}`` notation. Within the curly braces all execution variables of a process instance can be accessed, e.g. the ones that were stored in a previous Java implementation of a BPMN [ServiceTask](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/service-task/). For example, the BPMN [Condition Expression](https://docs.camunda.org/manual/7.17/user-guide/process-engine/expression-language/#conditions) ``${cohortSize > 100}`` checks whether the value in the execution variable *cohortSize* is greater than 100. - -#### Storing / Modifying Process Variables - -Via the ``DelegateExecution execution`` parameter of the ``doExecute`` method of a class extending ``AbstractServiceDelegate``, we can write and read process variables of the current process instance. The following code listing show how to write and read a ``boolean`` variable: -``` -{ - execution.setVariable("variable-name", Variables.booleanValue(false)); - boolean variable = (boolean) execution.getVariable("variable-name"); -} -``` -For more details on process variables see the [Camunda documentation](https://docs.camunda.org/manual/7.17/user-guide/process-engine/variables/). - -### Exercise Tasks ---- - -1. In the ``HelloDic`` class, write an algorithm deciding based on the "leading" Task's input parameter ``tutorial-input``, whether the ``highmedorg_helloCos`` process should be started. -2. Add a boolean variable to the process instance execution variables storing the decision. -3. Add an exclusive gateway to the ``highmedorg_helloDic`` process model and two outgoing sequence flows - the first starting process ``highmedorg_helloDic``, the second stopping process ``highmedorg_helloDic`` without starting process ``highmedorg_helloCos``. -4. Add a condition expressions to each outgoing sequence flow based on the previously stored execution variable. - -### Solution Verification ---- -#### Maven Build and Automated Tests - -Execute a maven build of the dsf-process-tutorial parent module via: -``` -mvn clean install -Pexercise-4 -``` -Verify that the build was successful and no test failures occurred. - -#### Process Execution and Manual Tests - -To verify the ``highmedorg_helloDic`` and ``highmedorg_helloCos`` processes can be executed successfully, we need to deploy them into DSF instances and execute the ``highmedorg_helloDic`` process. The maven ``install`` build is configured to create a process jar file with all necessary resources and copy the jar to the appropriate locations of the docker test setup. - -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -Verify the DSF FHIR server started successfully. - -2. Start the DSF BPE server for the ``Test_DIC`` organization in a second console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-fhir -``` -Verify the DSF FHIR server started successfully. - -3. Start the DSF BPE server for the ``Test_COS`` organization in a fourth console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-bpe -``` -Verify the DSF BPE server started successfully and deployed the ``highmedorg_helloCos`` process. - -4. Start the ``highmedorg_helloDic`` process by posting a specific FHIR [Task](http://hl7.org/fhir/R4/task.html) resource to the DSF FHIR server of the ``Test_DIC`` organization: Execute therefore the ``main`` method of the ``org.highmed.dsf.process.tutorial.TutorialExampleStarter`` class to create the [Task](http://hl7.org/fhir/R4/task.html) resource needed to start the ``highmedorg_helloDic`` process. - -Verify that the ``highmedorg_helloDic`` process was executed successfully by the ``Test_DIC`` DSF BPE server and possibly the ``highmedorg_helloCos`` process by the ``Test_COS`` DSF BPE server, depending on whether decision of your algorithm based on the input parameter allowed to start the ``highmedorg_helloDic`` process. - - -Continue with [exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) - - - - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | Exercise 4 | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md b/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md deleted file mode 100644 index d6afe6d87..000000000 --- a/docs/src/oldstable/tutorial/exercise5-eventBasedGateways.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Exercise 5 - Event Based Gateways and Intermediate Events -icon: slides ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | Exercise 5 - - ## Exercise 5 - Event Based Gateways and Intermediate Events - -In the final exercise we will look at message flow between three organizations as well as how to continue a waiting process if no return message arrives. With this exercise we will add a third process and complete a message loop from ``Test_DIC`` to ``Test_COR`` to ``Test_HRP`` back to ``Test_DIC``. - -### Introduction ---- -#### Managing Multiple- and Missing Messages - -If an existing and started process instance is waiting for a message from another organization, the corresponding FHIR [Task](http://hl7.org/fhir/R4/task.html) may never arrive. Either because the other organization decides to never send the "message" or because some technical problem prohibits the [Task](http://hl7.org/fhir/R4/task.html) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. - -In order to solve this problem we can add an [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/) to the process waiting for a response and then either handle a [Task](http://hl7.org/fhir/R4/task.html) resource with the response and finish the process in a success state or fire of an [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if two different message or no message could be received: - -![](/photos/guideline/tutorial/ex5.png) - -##### Timer Events - -For [Timer Events](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/) the duration until the timer fires is specified using the [ISO 8601 Durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found in the [Camunda 7 documentation](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#time-duration). - -#### Matching Process Instances With Business Keys - -In the example above the first organization is sending a "message" to the second and waiting for a reply. In order to correlate the return message with the waiting process instance, a unique identifier needs to be exchanged between both process instances. Within the DSF this is implemented using the process instance business-key and a corresponding [Task.input](http://hl7.org/fhir/R4/task.html) parameter. For 1:1 communication relationships this is handled by the DSF BPE servers automatically, but the corresponding [Task](http://hl7.org/fhir/R4/task.html) profiles need to define the business-key input parameter as mandatory. - -If multiple message are send in a 1:n relationship with a n:1 return an additional correlation-key needs to be configured in order to correlate every bidirectional communication between two DSF instances. - -#### ActivityDefinitions for the DSF - -FHIR [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources are used to announce what processes can be instantiated at a given DSF instance and contain the authorization rules for the specified process. [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) for the DSF need to comply with the http://highmed.org/fhir/StructureDefinition/activity-definition profile, with authorization rules configured using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization extension. - -The authorization extension needs to be configured at least once and has four sub extensions: - -##### message-name [1..1] - -String value specifying the message name of [Message Start Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-start-event), [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) or [Message Receive Task](https://docs.camunda.org/manual/7.17/reference/bpmn20/tasks/receive-task/) this authorization rule should match. Can only be specified once per authorization rule extension. - -##### task-profile [1..1] - -Canonical URL value specifying the [Task](http://hl7.org/fhir/R4/task.html) profile this authorization rule should match. Can only be specified once per authorization rule extension. - -##### requester [1..] -Coding value matching entries from the http://highmed.org/fhir/ValueSet/process-authorization-requester ValueSet: - -- LOCAL_ORGANIZATION A local organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- REMOTE_ORGANIZATION A remote (non local) organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- LOCAL_ROLE A local organizations with a specific role defined via [OrganizationAffiliation](http://hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- REMOTE_ROLE A remote (non local) organizations with a specific role defined via [OrganizationAffiliation](http://hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- LOCAL_ALL All local organizations regardless of their identifier or role in a consortium. - -- REMOTE_ALL All remote (non local) organizations regardless of their identifier or role in a consortium. - -##### recipient [1..] - -Coding value matching entries from the http://highmed.org/fhir/ValueSet/process-authorization-recipient ValueSet. - -- LOCAL_ORGANIZATION Organization with a specific identifier. The organization identifier needs to specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-organization extension. - -- LOCAL_ROLE Organizations with a specific role defined via [OrganizationAffiliation](http://hl7.org/fhir/R4/organizationaffiliation.html). Role and consortium identifier need to be specified using the http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role extension. - -- LOCAL_ALL All organizations regardless of their identifier or role in a consortium. - -The local organization of a DSF instance is configured using the environment variables [ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE](https://github.com/highmed/highmed-dsf/wiki/DSF-0.7.0-Configuration-Parameters-FHIR#org_highmed_dsf_fhir_server_organization_identifier_value) for the DSF FHIR server and [ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE](https://github.com/highmed/highmed-dsf/wiki/DSF-0.7.0-Configuration-Parameters-BPE#org_highmed_dsf_bpe_fhir_server_organization_identifier_value) for the DSF BPE server. - -#### Authorization Extension Example - -The following example specifies that process execution can only be requested by a organization with a specific identifier and only allows execution of the process in the DSF instance of an organization with a specific identifier. -```xml -<extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="some-message-name" /> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://foo.org/fhir/StructureDefinition/profile|#{version}" /> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role"> - <extension url="consortium"> - <valueIdentifier> - <system value="http://highmed.org/sid/organization-identifier" /> - <value value="identifier.consortium.org" /> - </valueIdentifier> - </extension> - <extension url="role"> - <valueCoding> - <system value="http://highmed.org/fhir/CodeSystem/organization-role" /> - <code value="SOME_ROLE" /> - </valueCoding> - </extension> - </extension> - <system value="http://highmed.org/fhir/CodeSystem/process-authorization" /> - <code value="REMOTE_ROLE" /> - </valueCoding> - </extension> - <extension url="recipient"> - <valueCoding> - <extension url="http://highmed.org/fhir/StructureDefinition/extension-process-authorization-consortium-role"> - <extension url="consortium"> - <valueIdentifier> - <system value="http://highmed.org/sid/organization-identifier" /> - <value value="identifier.consortium.org" /> - </valueIdentifier> - </extension> - <extension url="role"> - <valueCoding> - <system value="http://highmed.org/fhir/CodeSystem/organization-role" /> - <code value="SOME_ROLE" /> - </valueCoding> - </extension> - </extension> - <system value="http://highmed.org/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ROLE" /> - </valueCoding> - </extension> -</extension> -``` - -### Exercise Tasks ---- -1. Modify the ``HelloCosMessage`` and use the value from the [Task.input](http://hl7.org/fhir/R4/task.html) parameter of the ``helloDic`` [Task](http://hl7.org/fhir/R4/task.html) to send it to the ``highmedorg_helloCos`` process via a [Task.input](http://hl7.org/fhir/R4/task.html) parameter in the ``helloCos`` Task. Override the ``getAdditionalInputParameters`` to configure a [Task.input](http://hl7.org/fhir/R4/task.html) parameter to be send. -2. Modify the ``highmedorg_helloCos`` process to use a [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) to trigger the process in file ``hello-hrp.bpmn``. Figure out the values for the ``instantiatesUri``, ``profile`` and ``messageName`` input parameters of the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. -3. Modify the ``highmedorg_helloDic`` process: - - Change the [Message End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-end-event) to an [Intermediate Message Throw Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) - - Add an [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/) after the throw event - - Configure two cases for the [Event Based Gateway](https://docs.camunda.org/manual/7.17/reference/bpmn20/gateways/event-based-gateway/): - 1. An [Intermediate Message Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/message-events/#message-intermediate-catching-event) to catch the ``goodbyDic`` message from the ``highmedorg_helloHrp`` process. - 2. An [Intermediate Timer Catch Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) to end the process if no message is sent by the ``highmedorg_helloHrp`` process after two minutes. Make sure both cases finish with a process [End Event](https://docs.camunda.org/manual/7.17/reference/bpmn20/events/none-events/). -4. Modify the process in file ``hello-hrp.bpmn`` and set the process definition key and version. Figure out the appropriate values based on the [AcitvityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) in file ``hello-hrp.xml``. -5. Add the process in file ``hello-hrp.bpmn`` to the ``TutorialProcessPluginDefinition`` and configure the FHIR resources needed for the three processes. -6. Add the ``HelloCos``, ``HelloHrpMessage`` , ``HelloHrp`` and ``GoodbyeDicMessage`` classes as spring beans. - -### Solution Verification ---- -#### Maven Build and Automated Tests - -Execute a maven build of the ``dsf-process-tutorial`` parent module via: -``` -mvn clean install -Pexercise-5 -``` -Verify that the build was successful and no test failures occurred. - -#### Process Execution and Manual Tests - -To verify the ``highmedorg_helloDic``, ``highmedorg_helloCos`` and ``highmedorg_helloHrp`` processes can be executed successfully, we need to deploy them into DSF instances and execute the ``highmedorg_helloDic`` process. The maven ``install`` build is configured to create a process jar file with all necessary resources and copy the jar to the appropriate locations of the docker test setup. - -1. Start the DSF FHIR server for the ``Test_DIC`` organization in a console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-fhir -``` -Verify the DSF FHIR server started successfully. - -2. Start the DSF BPE server for the ``Test_DIC`` organization in a second console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up dic-bpe -``` -Verify the DSF BPE server started successfully and deployed the ``highmedorg_helloDic`` process. - -3. Start the DSF FHIR server for the ``Test_COS`` organization in a third console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-fhir -``` -Verify the DSF FHIR server started successfully. - -4. Start the DSF BPE server for the ``Test_COS`` organization in a fourth console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up cos-bpe -``` -Verify the DSF BPE server started successfully and deployed the ``highmedorg_helloDic`` process. - -5. Start the DSF FHIR server for the ``Test_HRP`` organization in a fifth at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up hrp-fhir -``` -Verify the DSF FHIR server started successfully. You can access the webservice of the DSF FHIR server at https://hrp/fhir. -The DSF FHIR server uses a server certificate that was generated during the first maven build. To authenticate yourself to the server you can use the client certificate located at ``.../dsf-process-tutorial/test-data-generator/cert/Webbrowser_Test_User/Webbrowser_Test_User_certificate.p12`` (Password: password). - -6. Start the DSF BPE server for the ``Test_HRP`` organization in a sixth console at location ``.../dsf-process-tutorial/test-setup``: -``` -docker-compose up hrp-bpe -``` -Verify the DSF BPE server started successfully and deployed the ``highmedorg_helloHrp`` process. The DSF BPE server should print a message that the process was deployed. The DSF FHIR server should now have a new [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource. Go to https://hrp/fhir/ActivityDefinition to check if the expected resource was created by the BPE while deploying the process. The returned FHIR [Bundle](http://hl7.org/fhir/R4/bundle.html) should contain a three [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resources. Also, go to https://hrp/fhir/StructureDefinition?url=http://highmed.org/fhir/StructureDefinition/task-hello-hrp to check if the expected [Task](http://hl7.org/fhir/R4/task.html) profile was created. - -7. Start the ``highmedorg_helloDic`` process by posting a specific FHIR [Task](http://hl7.org/fhir/R4/task.html) resource to the DSF FHIR server of the ``Test_DIC`` organization: Execute therefore the ``main`` method of the ``org.highmed.dsf.process.tutorial.TutorialExampleStarter`` class to create the [Task](http://hl7.org/fhir/R4/task.html) resource needed to start the ``highmedorg_helloDic`` process. - -Verify that the FHIR [Task](http://hl7.org/fhir/R4/task.html) resource was created at the DSF FHIR server and the ``highmedorg_helloDic`` process was executed by the DSF BPE server of the ``Test_DIC`` organization. The DSF BPE server of the ``Test_DIC`` organization should print a message showing that a [Task](http://hl7.org/fhir/R4/task.html) resource to start the ``highmedorg_helloCos`` process was sent to the ``Test_COS`` organization. -Verify that a FHIR [Task](http://hl7.org/fhir/R4/task.html) resource was created at the DSF FHIR server of the ``Test_COS`` organization and the ``highmedorg_helloCos`` process was executed by the DSF BPE server of the ``Test_COS`` organization. The DSF BPE server of the ``Test_COS`` organization should print a message showing that a [Task](http://hl7.org/fhir/R4/task.html) resource to start the ``highmedorg_helloHrp`` process was send to the ``Test_HRP`` organization. - -Based on the value of the Task.input parameter you send, the ``highmedorg_helloHrp`` process will either send a ``goodbyDic`` message to the ``Test_DIC`` organization or finish without sending a message. - -To trigger the ``goodbyDic`` message, use ``send-response`` as the ``http://highmed.org/fhir/CodeSystem/tutorial#tutorial-input`` input parameter. - -Verify that the ``highmedorg_helloDic`` process either finishes with the arrival of the ``goodbyDic`` message or after waiting for two minutes. - - ---- - [Prerequisites](/oldstable/tutorial/prerequisites.md) | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | Exercise 5 \ No newline at end of file diff --git a/docs/src/oldstable/tutorial/prerequisites.md b/docs/src/oldstable/tutorial/prerequisites.md deleted file mode 100644 index c82ef2447..000000000 --- a/docs/src/oldstable/tutorial/prerequisites.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Prerequisites -icon: slides ---- - -In order to be able to solve the exercises described in this tutorial a software development environment with git, Java 11, Maven 3.8, Docker, docker-compose, a Java IDE like Eclipse or IntelliJ, a BPMN Editor like the Camunda Modeler a and minimum 16GB of RAM is needed. - -### git ---- -[git](https://git-scm.com/) is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. - -- An installation guide for Linux, Mac and Windows can be found here: [installation guide](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) -- The most basic git CLI commands are described here: [commands](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository) - -### Java 11 ---- -Processes for the DSF are written using the [Java](https://www.java.com/de/) programming language in version 11. Various open source releases of the Java Developer Kit (JDK) 11 exist, you are free in your choice. - -### Maven 3.8 ---- -When implementing DSF processes, we use Maven 3.8 to manage the software project's build, reporting and documentation workflow. - -- An installation guide for Maven 3.8 can be found here: [installation guide](https://maven.apache.org/install.html) -- The most important maven commands are described here: [commands](https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html) - -### GitHub Packages - -In order to download DSF packages from the GitHub Package Registry using Maven you need a personal GitHub access token with scope `read:packages`{.read:packages}. This [GitHub documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) shows you how to generate one. - -After that, add the following `server`{.server} configuration to your local `.m2/settings.xml`{.m2/settings.xml}. Replace `USERNAME`{.USERNAME} with your GitHub username and `TOKEN`{.TOKEN} with the previously generated personal GitHub access token. The token needs at least the `read:packages`{.read:packages} scope. - -```xml -<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 - http://maven.apache.org/xsd/settings-1.0.0.xsd"> - - ... - - <servers> - <server> - <id>github</id> - <username>USERNAME</username> - <password>TOKEN</password> - </server> - </servers> -</settings> -``` - -### Docker and docker-compose ---- -To be able to test the implemented processes, we use a test-setup based on Docker and docker-compose. This allows us to simulate multiple organizations with different roles and run the processes across "organizational boundaries". - -- An installation guide for Docker and docker-compose can be found here: [installation guide](https://docs.docker.com/get-docker/) -- The most important Docker commands are described here: [Docker commands](https://docs.docker.com/engine/reference/run/) -- An overview of docker-compose commands are described here: [docker-compose commands](https://docs.docker.com/compose/reference/) - -#### Host entries for test-setup - -The following entries are required in the `hosts` file of your computer so that the FHIR servers of the simulated organizations can be accessed in your web browser. On Linux and Mac this file is located at `/etc/hosts`. On Windows you can find it at `C:\Windows\System32\drivers\etc\hosts` - -``` -127.0.0.1 dic -127.0.0.1 cos -127.0.0.1 hrp -``` - -### Java IDE ---- - -For the development of the processes we recommend the use of an IDE, e.g. Eclipse or IntelliJ: - -- An installation guide for Eclipse can be found here: [Eclipse installation guide](https://wiki.eclipse.org/Eclipse/Installation) -- An installation guide for IntelliJ can be found here: [IntelliJ installation guide](https://www.jetbrains.com/help/idea/installation-guide.html) - -### BPMN Editor ---- - -To simplify modeling of BPMN processes, we recommend a graphical editor, e.g. the Camunda Modeler: - -- An installation guide for the Camunda Modeler can be found here: [installation guide](https://camunda.com/de/download/modeler/) - -### Hardware ---- - -The minimum hardware requirements to run all simulated organizations as part of the Docker test-setup is 16 GB of RAM. - ---- - Prerequisites | [Exercise 1](/oldstable/tutorial/exercise1-simpleProcess.md) | [Exercise 1.1](/oldstable/tutorial/exercise11-processDebugging.md) | [Exercise 2](/oldstable/tutorial/exercise2-inputParameters.md) | [Exercise 3](/oldstable/tutorial/exercise3-messageEvents.md) | [Exercise 4](/oldstable/tutorial/exercise4-exclusiveGateways.md) | [Exercise 5](/oldstable/tutorial/exercise5-eventBasedGateways.md) \ No newline at end of file diff --git a/docs/src/operations/get-started.md b/docs/src/operations/get-started.md new file mode 100644 index 000000000..0f6ef9c59 --- /dev/null +++ b/docs/src/operations/get-started.md @@ -0,0 +1 @@ +weiterleitung auf v1 \ No newline at end of file diff --git a/docs/src/operations/process-plugin-deployment.md b/docs/src/operations/process-plugin-deployment.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/v1.0.0/develop/README.md b/docs/src/operations/v1/v1.0.0/develop/README.md similarity index 100% rename from docs/src/v1.0.0/develop/README.md rename to docs/src/operations/v1/v1.0.0/develop/README.md diff --git a/docs/src/v1.0.0/develop/create.md b/docs/src/operations/v1/v1.0.0/develop/create.md similarity index 100% rename from docs/src/v1.0.0/develop/create.md rename to docs/src/operations/v1/v1.0.0/develop/create.md diff --git a/docs/src/v1.0.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.0.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.0.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.0.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.0.0/dsf-for-dev.md b/docs/src/operations/v1/v1.0.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.0.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.0.0/dsf-for-dev.md diff --git a/docs/src/v1.0.0/index.md b/docs/src/operations/v1/v1.0.0/index.md similarity index 100% rename from docs/src/v1.0.0/index.md rename to docs/src/operations/v1/v1.0.0/index.md diff --git a/docs/src/v1.0.0/maintain/README.md b/docs/src/operations/v1/v1.0.0/maintain/README.md similarity index 100% rename from docs/src/v1.0.0/maintain/README.md rename to docs/src/operations/v1/v1.0.0/maintain/README.md diff --git a/docs/src/v1.0.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.0.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.0.0/maintain/configuration/README.md b/docs/src/operations/v1/v1.0.0/maintain/configuration/README.md similarity index 100% rename from docs/src/v1.0.0/maintain/configuration/README.md rename to docs/src/operations/v1/v1.0.0/maintain/configuration/README.md diff --git a/docs/src/v1.0.0/maintain/configuration/bpe.md b/docs/src/operations/v1/v1.0.0/maintain/configuration/bpe.md similarity index 100% rename from docs/src/v1.0.0/maintain/configuration/bpe.md rename to docs/src/operations/v1/v1.0.0/maintain/configuration/bpe.md diff --git a/docs/src/v1.0.0/maintain/configuration/common.md b/docs/src/operations/v1/v1.0.0/maintain/configuration/common.md similarity index 100% rename from docs/src/v1.0.0/maintain/configuration/common.md rename to docs/src/operations/v1/v1.0.0/maintain/configuration/common.md diff --git a/docs/src/v1.0.0/maintain/configuration/fhir.md b/docs/src/operations/v1/v1.0.0/maintain/configuration/fhir.md similarity index 100% rename from docs/src/v1.0.0/maintain/configuration/fhir.md rename to docs/src/operations/v1/v1.0.0/maintain/configuration/fhir.md diff --git a/docs/src/v1.0.0/maintain/configuration/reverseproxy.md b/docs/src/operations/v1/v1.0.0/maintain/configuration/reverseproxy.md similarity index 100% rename from docs/src/v1.0.0/maintain/configuration/reverseproxy.md rename to docs/src/operations/v1/v1.0.0/maintain/configuration/reverseproxy.md diff --git a/docs/src/v1.0.0/maintain/install.md b/docs/src/operations/v1/v1.0.0/maintain/install.md similarity index 100% rename from docs/src/v1.0.0/maintain/install.md rename to docs/src/operations/v1/v1.0.0/maintain/install.md diff --git a/docs/src/v1.0.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.0.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.0.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.0.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.0.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.0.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.0.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.0.0/process-plugins-advanced.md diff --git a/docs/src/v1.1.0/develop/README.md b/docs/src/operations/v1/v1.1.0/develop/README.md similarity index 100% rename from docs/src/v1.1.0/develop/README.md rename to docs/src/operations/v1/v1.1.0/develop/README.md diff --git a/docs/src/v1.1.0/develop/create.md b/docs/src/operations/v1/v1.1.0/develop/create.md similarity index 100% rename from docs/src/v1.1.0/develop/create.md rename to docs/src/operations/v1/v1.1.0/develop/create.md diff --git a/docs/src/v1.1.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.1.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.1.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.1.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.1.0/dsf-for-dev.md b/docs/src/operations/v1/v1.1.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.1.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.1.0/dsf-for-dev.md diff --git a/docs/src/v1.1.0/index.md b/docs/src/operations/v1/v1.1.0/index.md similarity index 100% rename from docs/src/v1.1.0/index.md rename to docs/src/operations/v1/v1.1.0/index.md diff --git a/docs/src/v1.1.0/maintain/README.md b/docs/src/operations/v1/v1.1.0/maintain/README.md similarity index 100% rename from docs/src/v1.1.0/maintain/README.md rename to docs/src/operations/v1/v1.1.0/maintain/README.md diff --git a/docs/src/v1.1.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.1.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.1.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.1.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.1.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.1.0/maintain/bpe/README.md diff --git a/docs/src/v1.1.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.1.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.1.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.1.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.1.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.1.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.1.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.1.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.1.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.1.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir/README.md diff --git a/docs/src/v1.1.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.1.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.1.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.1.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.1.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.1.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.1.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.1.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.1.0/maintain/install.md b/docs/src/operations/v1/v1.1.0/maintain/install.md similarity index 100% rename from docs/src/v1.1.0/maintain/install.md rename to docs/src/operations/v1/v1.1.0/maintain/install.md diff --git a/docs/src/v1.1.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.1.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.1.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.1.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.1.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.1.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.1.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.1.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.1.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.1.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.1.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.1.0/process-plugins-advanced.md diff --git a/docs/src/v1.2.0/develop/README.md b/docs/src/operations/v1/v1.2.0/develop/README.md similarity index 100% rename from docs/src/v1.2.0/develop/README.md rename to docs/src/operations/v1/v1.2.0/develop/README.md diff --git a/docs/src/v1.2.0/develop/create.md b/docs/src/operations/v1/v1.2.0/develop/create.md similarity index 100% rename from docs/src/v1.2.0/develop/create.md rename to docs/src/operations/v1/v1.2.0/develop/create.md diff --git a/docs/src/v1.2.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.2.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.2.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.2.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.2.0/dsf-for-dev.md b/docs/src/operations/v1/v1.2.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.2.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.2.0/dsf-for-dev.md diff --git a/docs/src/v1.2.0/index.md b/docs/src/operations/v1/v1.2.0/index.md similarity index 100% rename from docs/src/v1.2.0/index.md rename to docs/src/operations/v1/v1.2.0/index.md diff --git a/docs/src/v1.2.0/maintain/README.md b/docs/src/operations/v1/v1.2.0/maintain/README.md similarity index 100% rename from docs/src/v1.2.0/maintain/README.md rename to docs/src/operations/v1/v1.2.0/maintain/README.md diff --git a/docs/src/v1.2.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.2.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.2.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.2.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.2.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.2.0/maintain/bpe/README.md diff --git a/docs/src/v1.2.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.2.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.2.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.2.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.2.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.2.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.2.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.2.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.2.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.2.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir/README.md diff --git a/docs/src/v1.2.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.2.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.2.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.2.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.2.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.2.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.2.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.2.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.2.0/maintain/install.md b/docs/src/operations/v1/v1.2.0/maintain/install.md similarity index 100% rename from docs/src/v1.2.0/maintain/install.md rename to docs/src/operations/v1/v1.2.0/maintain/install.md diff --git a/docs/src/v1.2.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.2.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.2.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.2.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.2.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.2.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.2.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.2.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.2.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.2.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.2.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.2.0/process-plugins-advanced.md diff --git a/docs/src/v1.3.0/develop/README.md b/docs/src/operations/v1/v1.3.0/develop/README.md similarity index 100% rename from docs/src/v1.3.0/develop/README.md rename to docs/src/operations/v1/v1.3.0/develop/README.md diff --git a/docs/src/v1.3.0/develop/create.md b/docs/src/operations/v1/v1.3.0/develop/create.md similarity index 100% rename from docs/src/v1.3.0/develop/create.md rename to docs/src/operations/v1/v1.3.0/develop/create.md diff --git a/docs/src/v1.3.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.3.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.3.0/dsf-for-dev.md b/docs/src/operations/v1/v1.3.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.3.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.3.0/dsf-for-dev.md diff --git a/docs/src/v1.3.0/index.md b/docs/src/operations/v1/v1.3.0/index.md similarity index 100% rename from docs/src/v1.3.0/index.md rename to docs/src/operations/v1/v1.3.0/index.md diff --git a/docs/src/v1.3.0/maintain/README.md b/docs/src/operations/v1/v1.3.0/maintain/README.md similarity index 100% rename from docs/src/v1.3.0/maintain/README.md rename to docs/src/operations/v1/v1.3.0/maintain/README.md diff --git a/docs/src/v1.3.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.3.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.3.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.3.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.3.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.3.0/maintain/bpe/README.md diff --git a/docs/src/v1.3.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.3.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.3.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.3.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.3.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.3.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.3.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.3.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.3.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.3.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir/README.md diff --git a/docs/src/v1.3.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.3.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.3.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.3.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.3.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.3.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.3.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.3.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.3.0/maintain/install-plugins.md b/docs/src/operations/v1/v1.3.0/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.3.0/maintain/install-plugins.md rename to docs/src/operations/v1/v1.3.0/maintain/install-plugins.md diff --git a/docs/src/v1.3.0/maintain/install.md b/docs/src/operations/v1/v1.3.0/maintain/install.md similarity index 100% rename from docs/src/v1.3.0/maintain/install.md rename to docs/src/operations/v1/v1.3.0/maintain/install.md diff --git a/docs/src/v1.3.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.3.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.3.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.3.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.3.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.3.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.3.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.3.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.3.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.3.0/process-plugins-advanced.md diff --git a/docs/src/v1.3.1/develop/README.md b/docs/src/operations/v1/v1.3.1/develop/README.md similarity index 100% rename from docs/src/v1.3.1/develop/README.md rename to docs/src/operations/v1/v1.3.1/develop/README.md diff --git a/docs/src/v1.3.1/develop/create.md b/docs/src/operations/v1/v1.3.1/develop/create.md similarity index 100% rename from docs/src/v1.3.1/develop/create.md rename to docs/src/operations/v1/v1.3.1/develop/create.md diff --git a/docs/src/v1.3.1/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.3.1/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.1/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.1/develop/upgrade-from-0.md diff --git a/docs/src/v1.3.1/dsf-for-dev.md b/docs/src/operations/v1/v1.3.1/dsf-for-dev.md similarity index 100% rename from docs/src/v1.3.1/dsf-for-dev.md rename to docs/src/operations/v1/v1.3.1/dsf-for-dev.md diff --git a/docs/src/v1.3.1/index.md b/docs/src/operations/v1/v1.3.1/index.md similarity index 100% rename from docs/src/v1.3.1/index.md rename to docs/src/operations/v1/v1.3.1/index.md diff --git a/docs/src/v1.3.1/maintain/README.md b/docs/src/operations/v1/v1.3.1/maintain/README.md similarity index 100% rename from docs/src/v1.3.1/maintain/README.md rename to docs/src/operations/v1/v1.3.1/maintain/README.md diff --git a/docs/src/v1.3.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.3.1/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md diff --git a/docs/src/v1.3.1/maintain/bpe/README.md b/docs/src/operations/v1/v1.3.1/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.3.1/maintain/bpe/README.md rename to docs/src/operations/v1/v1.3.1/maintain/bpe/README.md diff --git a/docs/src/v1.3.1/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.3.1/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.3.1/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.3.1/maintain/bpe/configuration.md diff --git a/docs/src/v1.3.1/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.3.1/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.3.1/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.3.1/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.3.1/maintain/fhir/README.md b/docs/src/operations/v1/v1.3.1/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir/README.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir/README.md diff --git a/docs/src/v1.3.1/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.3.1/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir/access-control.md diff --git a/docs/src/v1.3.1/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.3.1/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir/configuration.md diff --git a/docs/src/v1.3.1/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.3.1/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.3.1/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.3.1/maintain/fhir/oidc.md diff --git a/docs/src/v1.3.1/maintain/install-plugins.md b/docs/src/operations/v1/v1.3.1/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.3.1/maintain/install-plugins.md rename to docs/src/operations/v1/v1.3.1/maintain/install-plugins.md diff --git a/docs/src/v1.3.1/maintain/install.md b/docs/src/operations/v1/v1.3.1/maintain/install.md similarity index 100% rename from docs/src/v1.3.1/maintain/install.md rename to docs/src/operations/v1/v1.3.1/maintain/install.md diff --git a/docs/src/v1.3.1/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.3.1/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.1/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.1/maintain/upgrade-from-0.md diff --git a/docs/src/v1.3.1/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.3.1/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.3.1/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.3.1/maintain/upgrade-from-1.md diff --git a/docs/src/v1.3.1/process-plugins-advanced.md b/docs/src/operations/v1/v1.3.1/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.3.1/process-plugins-advanced.md rename to docs/src/operations/v1/v1.3.1/process-plugins-advanced.md diff --git a/docs/src/v1.3.2/develop/README.md b/docs/src/operations/v1/v1.3.2/develop/README.md similarity index 100% rename from docs/src/v1.3.2/develop/README.md rename to docs/src/operations/v1/v1.3.2/develop/README.md diff --git a/docs/src/v1.3.2/develop/create.md b/docs/src/operations/v1/v1.3.2/develop/create.md similarity index 100% rename from docs/src/v1.3.2/develop/create.md rename to docs/src/operations/v1/v1.3.2/develop/create.md diff --git a/docs/src/v1.3.2/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.3.2/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.2/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.2/develop/upgrade-from-0.md diff --git a/docs/src/v1.3.2/dsf-for-dev.md b/docs/src/operations/v1/v1.3.2/dsf-for-dev.md similarity index 100% rename from docs/src/v1.3.2/dsf-for-dev.md rename to docs/src/operations/v1/v1.3.2/dsf-for-dev.md diff --git a/docs/src/v1.3.2/index.md b/docs/src/operations/v1/v1.3.2/index.md similarity index 100% rename from docs/src/v1.3.2/index.md rename to docs/src/operations/v1/v1.3.2/index.md diff --git a/docs/src/v1.3.2/maintain/README.md b/docs/src/operations/v1/v1.3.2/maintain/README.md similarity index 100% rename from docs/src/v1.3.2/maintain/README.md rename to docs/src/operations/v1/v1.3.2/maintain/README.md diff --git a/docs/src/v1.3.2/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.3.2/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md diff --git a/docs/src/v1.3.2/maintain/bpe/README.md b/docs/src/operations/v1/v1.3.2/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.3.2/maintain/bpe/README.md rename to docs/src/operations/v1/v1.3.2/maintain/bpe/README.md diff --git a/docs/src/v1.3.2/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.3.2/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.3.2/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.3.2/maintain/bpe/configuration.md diff --git a/docs/src/v1.3.2/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.3.2/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.3.2/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.3.2/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.3.2/maintain/fhir/README.md b/docs/src/operations/v1/v1.3.2/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir/README.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir/README.md diff --git a/docs/src/v1.3.2/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.3.2/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir/access-control.md diff --git a/docs/src/v1.3.2/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.3.2/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir/configuration.md diff --git a/docs/src/v1.3.2/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.3.2/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.3.2/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.3.2/maintain/fhir/oidc.md diff --git a/docs/src/v1.3.2/maintain/install-plugins.md b/docs/src/operations/v1/v1.3.2/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.3.2/maintain/install-plugins.md rename to docs/src/operations/v1/v1.3.2/maintain/install-plugins.md diff --git a/docs/src/v1.3.2/maintain/install.md b/docs/src/operations/v1/v1.3.2/maintain/install.md similarity index 100% rename from docs/src/v1.3.2/maintain/install.md rename to docs/src/operations/v1/v1.3.2/maintain/install.md diff --git a/docs/src/v1.3.2/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.3.2/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.3.2/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.3.2/maintain/upgrade-from-0.md diff --git a/docs/src/v1.3.2/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.3.2/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.3.2/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.3.2/maintain/upgrade-from-1.md diff --git a/docs/src/v1.3.2/process-plugins-advanced.md b/docs/src/operations/v1/v1.3.2/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.3.2/process-plugins-advanced.md rename to docs/src/operations/v1/v1.3.2/process-plugins-advanced.md diff --git a/docs/src/v1.4.0/contribute/code.md b/docs/src/operations/v1/v1.4.0/contribute/code.md similarity index 100% rename from docs/src/v1.4.0/contribute/code.md rename to docs/src/operations/v1/v1.4.0/contribute/code.md diff --git a/docs/src/v1.4.0/contribute/documentation.md b/docs/src/operations/v1/v1.4.0/contribute/documentation.md similarity index 100% rename from docs/src/v1.4.0/contribute/documentation.md rename to docs/src/operations/v1/v1.4.0/contribute/documentation.md diff --git a/docs/src/v1.5.0/contribute/readme.md b/docs/src/operations/v1/v1.4.0/contribute/readme.md similarity index 100% rename from docs/src/v1.5.0/contribute/readme.md rename to docs/src/operations/v1/v1.4.0/contribute/readme.md diff --git a/docs/src/v1.4.0/develop/README.md b/docs/src/operations/v1/v1.4.0/develop/README.md similarity index 100% rename from docs/src/v1.4.0/develop/README.md rename to docs/src/operations/v1/v1.4.0/develop/README.md diff --git a/docs/src/v1.4.0/develop/create.md b/docs/src/operations/v1/v1.4.0/develop/create.md similarity index 100% rename from docs/src/v1.4.0/develop/create.md rename to docs/src/operations/v1/v1.4.0/develop/create.md diff --git a/docs/src/v1.4.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.4.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.4.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.4.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.4.0/dsf-for-dev.md b/docs/src/operations/v1/v1.4.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.4.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.4.0/dsf-for-dev.md diff --git a/docs/src/v1.4.0/index.md b/docs/src/operations/v1/v1.4.0/index.md similarity index 100% rename from docs/src/v1.4.0/index.md rename to docs/src/operations/v1/v1.4.0/index.md diff --git a/docs/src/v1.4.0/maintain/README.md b/docs/src/operations/v1/v1.4.0/maintain/README.md similarity index 100% rename from docs/src/v1.4.0/maintain/README.md rename to docs/src/operations/v1/v1.4.0/maintain/README.md diff --git a/docs/src/v1.4.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.4.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.4.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.4.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.4.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.4.0/maintain/bpe/README.md diff --git a/docs/src/v1.4.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.4.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.4.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.4.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.4.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.4.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.4.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.4.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.4.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.4.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir/README.md diff --git a/docs/src/v1.4.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.4.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.4.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.4.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.4.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.4.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.4.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.4.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.4.0/maintain/install-plugins.md b/docs/src/operations/v1/v1.4.0/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.4.0/maintain/install-plugins.md rename to docs/src/operations/v1/v1.4.0/maintain/install-plugins.md diff --git a/docs/src/v1.4.0/maintain/install.md b/docs/src/operations/v1/v1.4.0/maintain/install.md similarity index 100% rename from docs/src/v1.4.0/maintain/install.md rename to docs/src/operations/v1/v1.4.0/maintain/install.md diff --git a/docs/src/v1.4.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.4.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.4.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.4.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.4.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.4.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.4.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.4.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.4.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.4.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.4.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.4.0/process-plugins-advanced.md diff --git a/docs/src/v1.5.0/contribute/code.md b/docs/src/operations/v1/v1.5.0/contribute/code.md similarity index 100% rename from docs/src/v1.5.0/contribute/code.md rename to docs/src/operations/v1/v1.5.0/contribute/code.md diff --git a/docs/src/v1.5.0/contribute/documentation.md b/docs/src/operations/v1/v1.5.0/contribute/documentation.md similarity index 100% rename from docs/src/v1.5.0/contribute/documentation.md rename to docs/src/operations/v1/v1.5.0/contribute/documentation.md diff --git a/docs/src/v1.5.1/contribute/readme.md b/docs/src/operations/v1/v1.5.0/contribute/readme.md similarity index 100% rename from docs/src/v1.5.1/contribute/readme.md rename to docs/src/operations/v1/v1.5.0/contribute/readme.md diff --git a/docs/src/v1.5.0/develop/README.md b/docs/src/operations/v1/v1.5.0/develop/README.md similarity index 100% rename from docs/src/v1.5.0/develop/README.md rename to docs/src/operations/v1/v1.5.0/develop/README.md diff --git a/docs/src/v1.5.0/develop/create.md b/docs/src/operations/v1/v1.5.0/develop/create.md similarity index 100% rename from docs/src/v1.5.0/develop/create.md rename to docs/src/operations/v1/v1.5.0/develop/create.md diff --git a/docs/src/v1.5.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.5.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.5.0/dsf-for-dev.md b/docs/src/operations/v1/v1.5.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.5.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.5.0/dsf-for-dev.md diff --git a/docs/src/v1.5.0/index.md b/docs/src/operations/v1/v1.5.0/index.md similarity index 100% rename from docs/src/v1.5.0/index.md rename to docs/src/operations/v1/v1.5.0/index.md diff --git a/docs/src/v1.5.0/maintain/README.md b/docs/src/operations/v1/v1.5.0/maintain/README.md similarity index 100% rename from docs/src/v1.5.0/maintain/README.md rename to docs/src/operations/v1/v1.5.0/maintain/README.md diff --git a/docs/src/v1.5.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.5.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.5.0/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.0/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.5.0/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.0/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.5.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe/README.md diff --git a/docs/src/v1.5.0/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.5.0/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe/access-control.md diff --git a/docs/src/v1.5.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.5.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.5.0/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.5.0/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.5.0/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.5.0/maintain/bpe/oidc.md diff --git a/docs/src/v1.5.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.5.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.5.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir/README.md diff --git a/docs/src/v1.5.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.5.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.5.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.5.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.5.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.5.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.5.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.5.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.5.0/maintain/install-plugins.md b/docs/src/operations/v1/v1.5.0/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.5.0/maintain/install-plugins.md rename to docs/src/operations/v1/v1.5.0/maintain/install-plugins.md diff --git a/docs/src/v1.5.0/maintain/install.md b/docs/src/operations/v1/v1.5.0/maintain/install.md similarity index 100% rename from docs/src/v1.5.0/maintain/install.md rename to docs/src/operations/v1/v1.5.0/maintain/install.md diff --git a/docs/src/v1.5.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.5.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.5.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.5.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.5.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.5.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.5.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.5.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.5.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.5.0/process-plugins-advanced.md diff --git a/docs/src/v1.5.1/contribute/code.md b/docs/src/operations/v1/v1.5.1/contribute/code.md similarity index 100% rename from docs/src/v1.5.1/contribute/code.md rename to docs/src/operations/v1/v1.5.1/contribute/code.md diff --git a/docs/src/v1.5.1/contribute/documentation.md b/docs/src/operations/v1/v1.5.1/contribute/documentation.md similarity index 100% rename from docs/src/v1.5.1/contribute/documentation.md rename to docs/src/operations/v1/v1.5.1/contribute/documentation.md diff --git a/docs/src/v1.5.2/contribute/readme.md b/docs/src/operations/v1/v1.5.1/contribute/readme.md similarity index 100% rename from docs/src/v1.5.2/contribute/readme.md rename to docs/src/operations/v1/v1.5.1/contribute/readme.md diff --git a/docs/src/v1.5.1/develop/README.md b/docs/src/operations/v1/v1.5.1/develop/README.md similarity index 100% rename from docs/src/v1.5.1/develop/README.md rename to docs/src/operations/v1/v1.5.1/develop/README.md diff --git a/docs/src/v1.5.1/develop/create.md b/docs/src/operations/v1/v1.5.1/develop/create.md similarity index 100% rename from docs/src/v1.5.1/develop/create.md rename to docs/src/operations/v1/v1.5.1/develop/create.md diff --git a/docs/src/v1.5.1/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.5.1/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.1/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.1/develop/upgrade-from-0.md diff --git a/docs/src/v1.5.1/dsf-for-dev.md b/docs/src/operations/v1/v1.5.1/dsf-for-dev.md similarity index 100% rename from docs/src/v1.5.1/dsf-for-dev.md rename to docs/src/operations/v1/v1.5.1/dsf-for-dev.md diff --git a/docs/src/v1.5.1/index.md b/docs/src/operations/v1/v1.5.1/index.md similarity index 100% rename from docs/src/v1.5.1/index.md rename to docs/src/operations/v1/v1.5.1/index.md diff --git a/docs/src/v1.5.1/maintain/README.md b/docs/src/operations/v1/v1.5.1/maintain/README.md similarity index 100% rename from docs/src/v1.5.1/maintain/README.md rename to docs/src/operations/v1/v1.5.1/maintain/README.md diff --git a/docs/src/v1.5.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.5.1/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md diff --git a/docs/src/v1.5.1/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.1/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.5.1/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.1/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.1/maintain/bpe/README.md b/docs/src/operations/v1/v1.5.1/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe/README.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe/README.md diff --git a/docs/src/v1.5.1/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.5.1/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe/access-control.md diff --git a/docs/src/v1.5.1/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.5.1/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe/configuration.md diff --git a/docs/src/v1.5.1/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.5.1/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.5.1/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.5.1/maintain/bpe/oidc.md diff --git a/docs/src/v1.5.1/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.1/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.5.1/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.1/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.1/maintain/fhir/README.md b/docs/src/operations/v1/v1.5.1/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir/README.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir/README.md diff --git a/docs/src/v1.5.1/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.5.1/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir/access-control.md diff --git a/docs/src/v1.5.1/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.5.1/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir/configuration.md diff --git a/docs/src/v1.5.1/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.5.1/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.5.1/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.5.1/maintain/fhir/oidc.md diff --git a/docs/src/v1.5.1/maintain/install-plugins.md b/docs/src/operations/v1/v1.5.1/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.5.1/maintain/install-plugins.md rename to docs/src/operations/v1/v1.5.1/maintain/install-plugins.md diff --git a/docs/src/v1.5.1/maintain/install.md b/docs/src/operations/v1/v1.5.1/maintain/install.md similarity index 100% rename from docs/src/v1.5.1/maintain/install.md rename to docs/src/operations/v1/v1.5.1/maintain/install.md diff --git a/docs/src/v1.5.1/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.5.1/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.1/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.1/maintain/upgrade-from-0.md diff --git a/docs/src/v1.5.1/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.5.1/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.5.1/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.5.1/maintain/upgrade-from-1.md diff --git a/docs/src/v1.5.1/process-plugins-advanced.md b/docs/src/operations/v1/v1.5.1/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.5.1/process-plugins-advanced.md rename to docs/src/operations/v1/v1.5.1/process-plugins-advanced.md diff --git a/docs/src/v1.5.2/contribute/code.md b/docs/src/operations/v1/v1.5.2/contribute/code.md similarity index 100% rename from docs/src/v1.5.2/contribute/code.md rename to docs/src/operations/v1/v1.5.2/contribute/code.md diff --git a/docs/src/v1.5.2/contribute/documentation.md b/docs/src/operations/v1/v1.5.2/contribute/documentation.md similarity index 100% rename from docs/src/v1.5.2/contribute/documentation.md rename to docs/src/operations/v1/v1.5.2/contribute/documentation.md diff --git a/docs/src/v1.6.0/contribute/readme.md b/docs/src/operations/v1/v1.5.2/contribute/readme.md similarity index 100% rename from docs/src/v1.6.0/contribute/readme.md rename to docs/src/operations/v1/v1.5.2/contribute/readme.md diff --git a/docs/src/v1.5.2/develop/README.md b/docs/src/operations/v1/v1.5.2/develop/README.md similarity index 100% rename from docs/src/v1.5.2/develop/README.md rename to docs/src/operations/v1/v1.5.2/develop/README.md diff --git a/docs/src/v1.5.2/develop/create.md b/docs/src/operations/v1/v1.5.2/develop/create.md similarity index 100% rename from docs/src/v1.5.2/develop/create.md rename to docs/src/operations/v1/v1.5.2/develop/create.md diff --git a/docs/src/v1.5.2/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.5.2/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.2/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.2/develop/upgrade-from-0.md diff --git a/docs/src/v1.5.2/dsf-for-dev.md b/docs/src/operations/v1/v1.5.2/dsf-for-dev.md similarity index 100% rename from docs/src/v1.5.2/dsf-for-dev.md rename to docs/src/operations/v1/v1.5.2/dsf-for-dev.md diff --git a/docs/src/v1.5.2/index.md b/docs/src/operations/v1/v1.5.2/index.md similarity index 100% rename from docs/src/v1.5.2/index.md rename to docs/src/operations/v1/v1.5.2/index.md diff --git a/docs/src/v1.5.2/maintain/README.md b/docs/src/operations/v1/v1.5.2/maintain/README.md similarity index 100% rename from docs/src/v1.5.2/maintain/README.md rename to docs/src/operations/v1/v1.5.2/maintain/README.md diff --git a/docs/src/v1.5.2/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.5.2/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md diff --git a/docs/src/v1.5.2/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.2/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.5.2/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.2/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.2/maintain/bpe/README.md b/docs/src/operations/v1/v1.5.2/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe/README.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe/README.md diff --git a/docs/src/v1.5.2/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.5.2/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe/access-control.md diff --git a/docs/src/v1.5.2/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.5.2/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe/configuration.md diff --git a/docs/src/v1.5.2/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.5.2/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.5.2/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.5.2/maintain/bpe/oidc.md diff --git a/docs/src/v1.5.2/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.5.2/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.5.2/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.5.2/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.5.2/maintain/fhir/README.md b/docs/src/operations/v1/v1.5.2/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir/README.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir/README.md diff --git a/docs/src/v1.5.2/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.5.2/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir/access-control.md diff --git a/docs/src/v1.5.2/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.5.2/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir/configuration.md diff --git a/docs/src/v1.5.2/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.5.2/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.5.2/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.5.2/maintain/fhir/oidc.md diff --git a/docs/src/v1.5.2/maintain/install-plugins.md b/docs/src/operations/v1/v1.5.2/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.5.2/maintain/install-plugins.md rename to docs/src/operations/v1/v1.5.2/maintain/install-plugins.md diff --git a/docs/src/v1.5.2/maintain/install.md b/docs/src/operations/v1/v1.5.2/maintain/install.md similarity index 100% rename from docs/src/v1.5.2/maintain/install.md rename to docs/src/operations/v1/v1.5.2/maintain/install.md diff --git a/docs/src/v1.5.2/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.5.2/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.5.2/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.5.2/maintain/upgrade-from-0.md diff --git a/docs/src/v1.5.2/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.5.2/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.5.2/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.5.2/maintain/upgrade-from-1.md diff --git a/docs/src/v1.5.2/process-plugins-advanced.md b/docs/src/operations/v1/v1.5.2/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.5.2/process-plugins-advanced.md rename to docs/src/operations/v1/v1.5.2/process-plugins-advanced.md diff --git a/docs/src/v1.6.0/contribute/code.md b/docs/src/operations/v1/v1.6.0/contribute/code.md similarity index 100% rename from docs/src/v1.6.0/contribute/code.md rename to docs/src/operations/v1/v1.6.0/contribute/code.md diff --git a/docs/src/v1.6.0/contribute/documentation.md b/docs/src/operations/v1/v1.6.0/contribute/documentation.md similarity index 100% rename from docs/src/v1.6.0/contribute/documentation.md rename to docs/src/operations/v1/v1.6.0/contribute/documentation.md diff --git a/docs/src/v1.7.0/contribute/readme.md b/docs/src/operations/v1/v1.6.0/contribute/readme.md similarity index 100% rename from docs/src/v1.7.0/contribute/readme.md rename to docs/src/operations/v1/v1.6.0/contribute/readme.md diff --git a/docs/src/v1.6.0/develop/README.md b/docs/src/operations/v1/v1.6.0/develop/README.md similarity index 100% rename from docs/src/v1.6.0/develop/README.md rename to docs/src/operations/v1/v1.6.0/develop/README.md diff --git a/docs/src/v1.6.0/develop/create.md b/docs/src/operations/v1/v1.6.0/develop/create.md similarity index 100% rename from docs/src/v1.6.0/develop/create.md rename to docs/src/operations/v1/v1.6.0/develop/create.md diff --git a/docs/src/v1.6.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.6.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.6.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.6.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.6.0/dsf-for-dev.md b/docs/src/operations/v1/v1.6.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.6.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.6.0/dsf-for-dev.md diff --git a/docs/src/v1.6.0/index.md b/docs/src/operations/v1/v1.6.0/index.md similarity index 100% rename from docs/src/v1.6.0/index.md rename to docs/src/operations/v1/v1.6.0/index.md diff --git a/docs/src/v1.6.0/maintain/README.md b/docs/src/operations/v1/v1.6.0/maintain/README.md similarity index 100% rename from docs/src/v1.6.0/maintain/README.md rename to docs/src/operations/v1/v1.6.0/maintain/README.md diff --git a/docs/src/v1.6.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.6.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.6.0/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.6.0/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.6.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.6.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe/README.md diff --git a/docs/src/v1.6.0/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.6.0/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe/access-control.md diff --git a/docs/src/v1.6.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.6.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.6.0/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.6.0/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.6.0/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.6.0/maintain/bpe/oidc.md diff --git a/docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.6.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.6.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.6.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.6.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir/README.md diff --git a/docs/src/v1.6.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.6.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.6.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.6.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.6.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.6.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.6.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.6.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.6.0/maintain/install-plugins.md b/docs/src/operations/v1/v1.6.0/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.6.0/maintain/install-plugins.md rename to docs/src/operations/v1/v1.6.0/maintain/install-plugins.md diff --git a/docs/src/v1.6.0/maintain/install.md b/docs/src/operations/v1/v1.6.0/maintain/install.md similarity index 100% rename from docs/src/v1.6.0/maintain/install.md rename to docs/src/operations/v1/v1.6.0/maintain/install.md diff --git a/docs/src/v1.6.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.6.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.6.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.6.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.6.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.6.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.6.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.6.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.6.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.6.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.6.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.6.0/process-plugins-advanced.md diff --git a/docs/src/v1.7.0/contribute/code.md b/docs/src/operations/v1/v1.7.0/contribute/code.md similarity index 100% rename from docs/src/v1.7.0/contribute/code.md rename to docs/src/operations/v1/v1.7.0/contribute/code.md diff --git a/docs/src/v1.7.0/contribute/documentation.md b/docs/src/operations/v1/v1.7.0/contribute/documentation.md similarity index 100% rename from docs/src/v1.7.0/contribute/documentation.md rename to docs/src/operations/v1/v1.7.0/contribute/documentation.md diff --git a/docs/src/v1.7.1/contribute/readme.md b/docs/src/operations/v1/v1.7.0/contribute/readme.md similarity index 100% rename from docs/src/v1.7.1/contribute/readme.md rename to docs/src/operations/v1/v1.7.0/contribute/readme.md diff --git a/docs/src/v1.7.0/develop/README.md b/docs/src/operations/v1/v1.7.0/develop/README.md similarity index 100% rename from docs/src/v1.7.0/develop/README.md rename to docs/src/operations/v1/v1.7.0/develop/README.md diff --git a/docs/src/v1.7.0/develop/create.md b/docs/src/operations/v1/v1.7.0/develop/create.md similarity index 100% rename from docs/src/v1.7.0/develop/create.md rename to docs/src/operations/v1/v1.7.0/develop/create.md diff --git a/docs/src/v1.7.0/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.7.0/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.7.0/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.7.0/develop/upgrade-from-0.md diff --git a/docs/src/v1.7.0/dsf-for-dev.md b/docs/src/operations/v1/v1.7.0/dsf-for-dev.md similarity index 100% rename from docs/src/v1.7.0/dsf-for-dev.md rename to docs/src/operations/v1/v1.7.0/dsf-for-dev.md diff --git a/docs/src/v1.7.0/index.md b/docs/src/operations/v1/v1.7.0/index.md similarity index 100% rename from docs/src/v1.7.0/index.md rename to docs/src/operations/v1/v1.7.0/index.md diff --git a/docs/src/v1.7.0/maintain/README.md b/docs/src/operations/v1/v1.7.0/maintain/README.md similarity index 100% rename from docs/src/v1.7.0/maintain/README.md rename to docs/src/operations/v1/v1.7.0/maintain/README.md diff --git a/docs/src/v1.7.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.7.0/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md diff --git a/docs/src/v1.7.0/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.7.0/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.7.0/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.7.0/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.7.0/maintain/bpe/README.md b/docs/src/operations/v1/v1.7.0/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe/README.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe/README.md diff --git a/docs/src/v1.7.0/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.7.0/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe/access-control.md diff --git a/docs/src/v1.7.0/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.7.0/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe/configuration.md diff --git a/docs/src/v1.7.0/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.7.0/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.7.0/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.7.0/maintain/bpe/oidc.md diff --git a/docs/src/v1.7.0/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.7.0/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.7.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.7.0/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.7.0/maintain/fhir/README.md b/docs/src/operations/v1/v1.7.0/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir/README.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir/README.md diff --git a/docs/src/v1.7.0/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.7.0/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir/access-control.md diff --git a/docs/src/v1.7.0/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.7.0/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir/configuration.md diff --git a/docs/src/v1.7.0/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.7.0/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.7.0/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.7.0/maintain/fhir/oidc.md diff --git a/docs/src/v1.7.0/maintain/install-plugins.md b/docs/src/operations/v1/v1.7.0/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.7.0/maintain/install-plugins.md rename to docs/src/operations/v1/v1.7.0/maintain/install-plugins.md diff --git a/docs/src/v1.7.0/maintain/install.md b/docs/src/operations/v1/v1.7.0/maintain/install.md similarity index 100% rename from docs/src/v1.7.0/maintain/install.md rename to docs/src/operations/v1/v1.7.0/maintain/install.md diff --git a/docs/src/v1.7.0/maintain/passwords-secrets.md b/docs/src/operations/v1/v1.7.0/maintain/passwords-secrets.md similarity index 100% rename from docs/src/v1.7.0/maintain/passwords-secrets.md rename to docs/src/operations/v1/v1.7.0/maintain/passwords-secrets.md diff --git a/docs/src/v1.7.0/maintain/root-certificates.md b/docs/src/operations/v1/v1.7.0/maintain/root-certificates.md similarity index 100% rename from docs/src/v1.7.0/maintain/root-certificates.md rename to docs/src/operations/v1/v1.7.0/maintain/root-certificates.md diff --git a/docs/src/v1.7.0/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.7.0/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.7.0/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.7.0/maintain/upgrade-from-0.md diff --git a/docs/src/v1.7.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.7.0/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.7.0/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.7.0/maintain/upgrade-from-1.md diff --git a/docs/src/v1.7.0/process-plugins-advanced.md b/docs/src/operations/v1/v1.7.0/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.7.0/process-plugins-advanced.md rename to docs/src/operations/v1/v1.7.0/process-plugins-advanced.md diff --git a/docs/src/v1.7.1/develop/README.md b/docs/src/operations/v1/v1.7.1/develop/README.md similarity index 100% rename from docs/src/v1.7.1/develop/README.md rename to docs/src/operations/v1/v1.7.1/develop/README.md diff --git a/docs/src/v1.7.1/develop/create.md b/docs/src/operations/v1/v1.7.1/develop/create.md similarity index 100% rename from docs/src/v1.7.1/develop/create.md rename to docs/src/operations/v1/v1.7.1/develop/create.md diff --git a/docs/src/v1.7.1/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md similarity index 100% rename from docs/src/v1.7.1/develop/upgrade-from-0.md rename to docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md diff --git a/docs/src/v1.7.1/dsf-for-dev.md b/docs/src/operations/v1/v1.7.1/dsf-for-dev.md similarity index 100% rename from docs/src/v1.7.1/dsf-for-dev.md rename to docs/src/operations/v1/v1.7.1/dsf-for-dev.md diff --git a/docs/src/v1.7.1/index.md b/docs/src/operations/v1/v1.7.1/index.md similarity index 100% rename from docs/src/v1.7.1/index.md rename to docs/src/operations/v1/v1.7.1/index.md diff --git a/docs/src/v1.7.1/maintain/README.md b/docs/src/operations/v1/v1.7.1/maintain/README.md similarity index 100% rename from docs/src/v1.7.1/maintain/README.md rename to docs/src/operations/v1/v1.7.1/maintain/README.md diff --git a/docs/src/v1.7.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md similarity index 100% rename from docs/src/v1.7.1/maintain/allowList-mgm.md rename to docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md diff --git a/docs/src/v1.7.1/maintain/bpe-reverse-proxy/README.md b/docs/src/operations/v1/v1.7.1/maintain/bpe-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe-reverse-proxy/README.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe-reverse-proxy/README.md diff --git a/docs/src/v1.7.1/maintain/bpe-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.7.1/maintain/bpe-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe-reverse-proxy/configuration.md diff --git a/docs/src/v1.7.1/maintain/bpe/README.md b/docs/src/operations/v1/v1.7.1/maintain/bpe/README.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe/README.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe/README.md diff --git a/docs/src/v1.7.1/maintain/bpe/access-control.md b/docs/src/operations/v1/v1.7.1/maintain/bpe/access-control.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe/access-control.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe/access-control.md diff --git a/docs/src/v1.7.1/maintain/bpe/configuration.md b/docs/src/operations/v1/v1.7.1/maintain/bpe/configuration.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe/configuration.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe/configuration.md diff --git a/docs/src/v1.7.1/maintain/bpe/oidc.md b/docs/src/operations/v1/v1.7.1/maintain/bpe/oidc.md similarity index 100% rename from docs/src/v1.7.1/maintain/bpe/oidc.md rename to docs/src/operations/v1/v1.7.1/maintain/bpe/oidc.md diff --git a/docs/src/v1.7.1/maintain/fhir-reverse-proxy/README.md b/docs/src/operations/v1/v1.7.1/maintain/fhir-reverse-proxy/README.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir-reverse-proxy/README.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir-reverse-proxy/README.md diff --git a/docs/src/v1.7.1/maintain/fhir-reverse-proxy/configuration.md b/docs/src/operations/v1/v1.7.1/maintain/fhir-reverse-proxy/configuration.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir-reverse-proxy/configuration.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir-reverse-proxy/configuration.md diff --git a/docs/src/v1.7.1/maintain/fhir/README.md b/docs/src/operations/v1/v1.7.1/maintain/fhir/README.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir/README.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir/README.md diff --git a/docs/src/v1.7.1/maintain/fhir/access-control.md b/docs/src/operations/v1/v1.7.1/maintain/fhir/access-control.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir/access-control.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir/access-control.md diff --git a/docs/src/v1.7.1/maintain/fhir/configuration.md b/docs/src/operations/v1/v1.7.1/maintain/fhir/configuration.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir/configuration.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir/configuration.md diff --git a/docs/src/v1.7.1/maintain/fhir/oidc.md b/docs/src/operations/v1/v1.7.1/maintain/fhir/oidc.md similarity index 100% rename from docs/src/v1.7.1/maintain/fhir/oidc.md rename to docs/src/operations/v1/v1.7.1/maintain/fhir/oidc.md diff --git a/docs/src/v1.7.1/maintain/install-plugins.md b/docs/src/operations/v1/v1.7.1/maintain/install-plugins.md similarity index 100% rename from docs/src/v1.7.1/maintain/install-plugins.md rename to docs/src/operations/v1/v1.7.1/maintain/install-plugins.md diff --git a/docs/src/v1.7.1/maintain/install.md b/docs/src/operations/v1/v1.7.1/maintain/install.md similarity index 100% rename from docs/src/v1.7.1/maintain/install.md rename to docs/src/operations/v1/v1.7.1/maintain/install.md diff --git a/docs/src/v1.7.1/maintain/passwords-secrets.md b/docs/src/operations/v1/v1.7.1/maintain/passwords-secrets.md similarity index 100% rename from docs/src/v1.7.1/maintain/passwords-secrets.md rename to docs/src/operations/v1/v1.7.1/maintain/passwords-secrets.md diff --git a/docs/src/v1.7.1/maintain/root-certificates.md b/docs/src/operations/v1/v1.7.1/maintain/root-certificates.md similarity index 100% rename from docs/src/v1.7.1/maintain/root-certificates.md rename to docs/src/operations/v1/v1.7.1/maintain/root-certificates.md diff --git a/docs/src/v1.7.1/maintain/upgrade-from-0.md b/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-0.md similarity index 100% rename from docs/src/v1.7.1/maintain/upgrade-from-0.md rename to docs/src/operations/v1/v1.7.1/maintain/upgrade-from-0.md diff --git a/docs/src/v1.7.1/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md similarity index 100% rename from docs/src/v1.7.1/maintain/upgrade-from-1.md rename to docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md diff --git a/docs/src/v1.7.1/process-plugins-advanced.md b/docs/src/operations/v1/v1.7.1/process-plugins-advanced.md similarity index 100% rename from docs/src/v1.7.1/process-plugins-advanced.md rename to docs/src/operations/v1/v1.7.1/process-plugins-advanced.md diff --git a/docs/src/operations/v2/get-started.md b/docs/src/operations/v2/get-started.md new file mode 100644 index 000000000..6faf8b011 --- /dev/null +++ b/docs/src/operations/v2/get-started.md @@ -0,0 +1 @@ +verlinkung auf stabel/latest \ No newline at end of file diff --git a/docs/src/posts/2025-05-15-my-first-post.md b/docs/src/posts/2025-05-15-my-first-post.md new file mode 100644 index 000000000..d3ebe3a3c --- /dev/null +++ b/docs/src/posts/2025-05-15-my-first-post.md @@ -0,0 +1,44 @@ +--- +title: "Spring School 2025" +date: 2025-05-15 +type: "news" +excerpt: "" +tags: + - VuePress + - Blog +--- + +# Recap of the DSF Spring School 2025 +Over three days, 20 committed members of the DSF community gathered at Heilbronn University for the DSF Spring School 2025. + +![Spring School Participants](/photos/news/springschool.jpg) +*Participants of the DSF Spring School 2025 at the Tech Campus Heilbronn (Friday, April 4, 2025)* + + +**Day 1 – Wednesday, April 2, 2025** + +On the first day of the DSF Spring School, participants received a concise introduction to the DSF. The presentation covered the core components of the DSF, all developments made so far, as well as the existing process plugins. + +During an introductory round, participants had the opportunity to get to know each other better. Among them were domain experts, DSF power users, and process plugin developers, who worked in small groups on various DSF-related topics and exchanged ideas within the community. Some participants learned about process plugin development through a guided tutorial, others worked on various tools and process plugins as part of the hackathon, and still others developed concepts for applying the DSF to new use cases. + +Participants also had repeated opportunities to take part in focused working sessions, where topics such as monitoring, process plugins, use cases, and more were discussed and further developed to deepen understanding. The first day concluded with a group dinner at Pier 58. + +![HandsonSessionl Participants](/photos/news/letzterTag1.png) +*Hands-on session with DSF Community* + +**Day 2 – Thursday, April 3, 2025** + +The second day of the DSF Spring School delved even deeper into the topic of process plugins and DSF APIv2. The focus was on more advanced topics such as consent and pseudonymization, networks within networks, handling large image and data sets, as well as the extensibility and interchangeability of plugins. These in-depth insights enabled participants to expand on the knowledge they had already gained and explore new perspectives on process plugins. + +The afternoon and evening of the second day were dedicated to the theme of “Community Exchange.” +The program continued with a series of engaging community talks. Dieter spoke about the further development of the feasibility process plugin to enable “networks within networks.” Mathias shared insights on how to implement a process plugin so that it can be used across different contexts and projects. Reto provided an exciting look into dev and test setups for process plugin development. + +These community talks marked the beginning of the more relaxed part of the "Hackend." Over delicious pizza, refreshing drinks, and plenty of fun, participants had lots of opportunities for networking, exchanging ideas, and casual coding sessions. The Spring School not only helped participants expand their individual expertise but also strengthened the sense of community within the DSF network! + + +**Day 3 – Friday, April 4, 2025** + +The last day was all about the final sprint of the hackathon.The groups continued working intensively on their plugins and projects. There was also a dedicated session on secure deployment and build reproducibility, allowlist management, and handling certificates. To wrap things up, all participants came together for a group photo and a brief recap of the past three days. A heartfelt thank you goes out to all participants for their dedication and creative contributions, which made the DSF Spring School 2025 a truly great experience! + +![FinalDay](/photos/news/letzterTag2.png) +*Final push at the DSF: Participants continue to develop their concepts, plugins, and more!* diff --git a/docs/src/posts/2025-05-16-fhir.md b/docs/src/posts/2025-05-16-fhir.md new file mode 100644 index 000000000..463b767e0 --- /dev/null +++ b/docs/src/posts/2025-05-16-fhir.md @@ -0,0 +1,30 @@ +--- +title: "FHIR DevDays 2025" +date: 2025-05-16 +type: "news" +excerpt: "Our DSF team will be at FHIR DevDays 2025 from June 3rd to 6th in Amsterdam! DevDays is the world’s leading FHIR event in the field of digital health. Join us at the event for engaging community talks by Maximilian Kurscheidt and Hauke Hund. We’ll be discussing the International Patient Summary Challenge 2025, as well as how we can foster research through Real-World Data Sharing and Process Orchestration using FHIR and BPMN. We look forward to seeing you there! If you'd like to connect with us during the event, feel free to arrange a meeting beforehand by emailing us at <strong>📧 dsf-gecko@hs-heilbronn.de</strong>." +img: "![FHIR DevDays2025](/photos/news/Devdays-world.png)" +tags: + - FHIR + - Blog +--- +# FHIR DevDays 2025 +The DSF Team will be attending **FHIR DevDays 2025** from **June 3rd to 6th** in **Amsterdam**! The DevDays is the world’s leading event focused on HL7® FHIR® (Fast Healthcare Interoperability Resources). It’s dedicated to helping participants build expertise and accelerate the global implementation of FHIR standards. We’re excited to be speaking at the event and sharing insights from our work! + +![FHIR DevDays2025](/photos/news/Devdays-world.png) + +**On Tuesday, June 3rd, from 4:10 PM to 4:30 PM**, +Maximilian Kurscheidt will give a Community Talk on *“The International Patient Summary Challenge 2025”*, an event that facilitated the international student exchange between Heilbronn University and Universidad de Chile. This talk will provide insights into the key lessons learned from the endeavor and its impact on cross-border care. + +**On Friday, June 6th, from 9:05 AM to 9:25 AM**, +Hauke Hund will present on *“Fostering Research through Real-World Data Sharing and Process Orchestration with FHIR and BPMN”*. This talk will focus on the lessons learned from the implementation, rollout, and maintenance of our Data Sharing Framework (DSF). + +Further information about the Community Talks can be found [here](https://www.devdays.com/program-2025/). +If you have any questions or would like to connect with us during the FHIR DevDays, feel free to reach out to us via email **📧 [dsf-gecko@hs-heilbronn.de ](mailto:dsf-gecko@hs-heilbronn.de)** + +--- +Our Team at the FHIR DevDays2025: +* **Hauke Hund** +* **Maximilian Kurscheidt** +* **Simon Schweizer** +* **Jan Böhringer** \ No newline at end of file diff --git a/docs/src/process-development/api-v1/concept.md b/docs/src/process-development/api-v1/concept.md new file mode 100644 index 000000000..97f969164 --- /dev/null +++ b/docs/src/process-development/api-v1/concept.md @@ -0,0 +1,10 @@ +--- +title: API 1 +icon: code +--- + +## API 1 Description + +::: warning Work in progress + +This site is work in progress, please come back later. diff --git a/docs/src/process-development/api-v1/tooling/empty-process-plugin.md b/docs/src/process-development/api-v1/tooling/empty-process-plugin.md new file mode 100644 index 000000000..98c9cdada --- /dev/null +++ b/docs/src/process-development/api-v1/tooling/empty-process-plugin.md @@ -0,0 +1,6 @@ +--- +title: empty Process Plugin +icon: share +--- + +## empty Process Plugin \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/ide.md b/docs/src/process-development/api-v1/tooling/ide.md new file mode 100644 index 000000000..32ee03461 --- /dev/null +++ b/docs/src/process-development/api-v1/tooling/ide.md @@ -0,0 +1,6 @@ +--- +title: DSF IDE +icon: share +--- + +## DSF IDE \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/maven.md b/docs/src/process-development/api-v1/tooling/maven.md new file mode 100644 index 000000000..ca4fe93f3 --- /dev/null +++ b/docs/src/process-development/api-v1/tooling/maven.md @@ -0,0 +1,6 @@ +--- +title: Maven Central and Ressources +icon: share +--- + +## Maven Central and Ressources \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/pipeline-testing.md b/docs/src/process-development/api-v1/tooling/pipeline-testing.md new file mode 100644 index 000000000..8d2e61235 --- /dev/null +++ b/docs/src/process-development/api-v1/tooling/pipeline-testing.md @@ -0,0 +1,10 @@ +--- +title: Pipeline Testing +icon: share +--- + +## Pipeline Testing + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/validator.md b/docs/src/process-development/api-v1/tooling/validator.md new file mode 100644 index 000000000..a8e3b2c2c --- /dev/null +++ b/docs/src/process-development/api-v1/tooling/validator.md @@ -0,0 +1,11 @@ +--- +title: DSF Validator +icon: share +--- + +## DSF Validator +::: warning Work in progress + +This site is work in progress, please come back later. + +## CLI and Maven Plugin \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tutorials.md b/docs/src/process-development/api-v1/tutorials.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/process-development/api-v2/README.md b/docs/src/process-development/api-v2/README.md new file mode 100644 index 000000000..cf8b8ccaa --- /dev/null +++ b/docs/src/process-development/api-v2/README.md @@ -0,0 +1,8 @@ +--- +title: API 2 +icon: code +--- +## Overview +- [About API2](description) +- [Implementation Guide](implementation) +- [Migration Guide](migration) \ No newline at end of file diff --git a/docs/src/process-development/api-v2/description.md b/docs/src/process-development/api-v2/description.md new file mode 100644 index 000000000..55cbab213 --- /dev/null +++ b/docs/src/process-development/api-v2/description.md @@ -0,0 +1,11 @@ +--- +title: Description +icon: share +--- + +## API 2 Description + +::: warning Work in progress + +This site is work in progress, please come back later. + diff --git a/docs/src/process-development/api-v2/implementation.md b/docs/src/process-development/api-v2/implementation.md new file mode 100644 index 000000000..a82a86d62 --- /dev/null +++ b/docs/src/process-development/api-v2/implementation.md @@ -0,0 +1,13 @@ +--- +title: Implementation Guide +icon: share +--- + +## Implementation Guide + +::: warning Work in progress + +This site is work in progress, please come back later. + + +## FHIR \ No newline at end of file diff --git a/docs/src/process-development/api-v2/migration.md b/docs/src/process-development/api-v2/migration.md new file mode 100644 index 000000000..748d00e09 --- /dev/null +++ b/docs/src/process-development/api-v2/migration.md @@ -0,0 +1,13 @@ +--- +title: Migration Guide +icon: share +--- + +## Migration Guide API 1 to API 2 + +::: warning Work in progress + +This site is work in progress, please come back later. + + +## Process Plugin Development Cycle \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tooling/empty-process-plugin.md b/docs/src/process-development/api-v2/tooling/empty-process-plugin.md new file mode 100644 index 000000000..98c9cdada --- /dev/null +++ b/docs/src/process-development/api-v2/tooling/empty-process-plugin.md @@ -0,0 +1,6 @@ +--- +title: empty Process Plugin +icon: share +--- + +## empty Process Plugin \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tooling/ide.md b/docs/src/process-development/api-v2/tooling/ide.md new file mode 100644 index 000000000..32ee03461 --- /dev/null +++ b/docs/src/process-development/api-v2/tooling/ide.md @@ -0,0 +1,6 @@ +--- +title: DSF IDE +icon: share +--- + +## DSF IDE \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tooling/maven.md b/docs/src/process-development/api-v2/tooling/maven.md new file mode 100644 index 000000000..ca4fe93f3 --- /dev/null +++ b/docs/src/process-development/api-v2/tooling/maven.md @@ -0,0 +1,6 @@ +--- +title: Maven Central and Ressources +icon: share +--- + +## Maven Central and Ressources \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tooling/pipeline-testing.md b/docs/src/process-development/api-v2/tooling/pipeline-testing.md new file mode 100644 index 000000000..8d2e61235 --- /dev/null +++ b/docs/src/process-development/api-v2/tooling/pipeline-testing.md @@ -0,0 +1,10 @@ +--- +title: Pipeline Testing +icon: share +--- + +## Pipeline Testing + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tooling/validator.md b/docs/src/process-development/api-v2/tooling/validator.md new file mode 100644 index 000000000..a8e3b2c2c --- /dev/null +++ b/docs/src/process-development/api-v2/tooling/validator.md @@ -0,0 +1,11 @@ +--- +title: DSF Validator +icon: share +--- + +## DSF Validator +::: warning Work in progress + +This site is work in progress, please come back later. + +## CLI and Maven Plugin \ No newline at end of file diff --git a/docs/src/process-development/how-to/start-project.md b/docs/src/process-development/how-to/start-project.md new file mode 100644 index 000000000..95946ac0f --- /dev/null +++ b/docs/src/process-development/how-to/start-project.md @@ -0,0 +1,12 @@ +--- +title: How to start new Project +icon: edit +--- + +## How to start a new Project + +::: warning Work in progress + +This site is work in progress, please come back later. + +## Process Plugin Development Cycle \ No newline at end of file diff --git a/docs/src/process-development/process-plugin/best-practise.md b/docs/src/process-development/process-plugin/best-practise.md new file mode 100644 index 000000000..444d5192b --- /dev/null +++ b/docs/src/process-development/process-plugin/best-practise.md @@ -0,0 +1,10 @@ +--- +title: Best Practices +icon: share +--- + +## Best Practices + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/process-plugin/create.md b/docs/src/process-development/process-plugin/create.md new file mode 100644 index 000000000..40b34511e --- /dev/null +++ b/docs/src/process-development/process-plugin/create.md @@ -0,0 +1,10 @@ +--- +title: Create a new Process Plugin +icon: share +--- + +## Create a new Process Plugin + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/process-plugin/testing.md b/docs/src/process-development/process-plugin/testing.md new file mode 100644 index 000000000..821b41347 --- /dev/null +++ b/docs/src/process-development/process-plugin/testing.md @@ -0,0 +1,12 @@ +--- +title: Process Plugin Testing +icon: share +--- + +## Testing + +::: warning Work in progress + +This site is work in progress, please come back later. + +Versionsabhängig \ No newline at end of file diff --git a/docs/src/process-development/publishing/publish-on-dsfhub.md b/docs/src/process-development/publishing/publish-on-dsfhub.md new file mode 100644 index 000000000..d3c414a63 --- /dev/null +++ b/docs/src/process-development/publishing/publish-on-dsfhub.md @@ -0,0 +1,8 @@ +--- +title: Publishing on DSF Hub +icon: share +--- + +## How to publish a project on DSF hub + +hub verlinken als neuer Tab \ No newline at end of file diff --git a/src/.vuepress/.cache/deps/@vue_devtools-api.js b/src/.vuepress/.cache/deps/@vue_devtools-api.js new file mode 100644 index 000000000..5892f3038 --- /dev/null +++ b/src/.vuepress/.cache/deps/@vue_devtools-api.js @@ -0,0 +1,12 @@ +import { + isPerformanceSupported, + now, + setupDevtoolsPlugin +} from "./chunk-UKCZNIRO.js"; +import "./chunk-V6TY7KAL.js"; +export { + isPerformanceSupported, + now, + setupDevtoolsPlugin +}; +//# sourceMappingURL=@vue_devtools-api.js.map diff --git a/src/.vuepress/.cache/deps/@vue_devtools-api.js.map b/src/.vuepress/.cache/deps/@vue_devtools-api.js.map new file mode 100644 index 000000000..98652118b --- /dev/null +++ b/src/.vuepress/.cache/deps/@vue_devtools-api.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/src/.vuepress/.cache/deps/@vuepress_shared.js b/src/.vuepress/.cache/deps/@vuepress_shared.js new file mode 100644 index 000000000..4a69dffcd --- /dev/null +++ b/src/.vuepress/.cache/deps/@vuepress_shared.js @@ -0,0 +1,138 @@ +import "./chunk-V6TY7KAL.js"; + +// node_modules/@vuepress/shared/dist/index.js +var isLinkWithProtocol = (link) => /^[a-z][a-z0-9+.-]*:/.test(link) || link.startsWith("//"); +var markdownLinkRegexp = /.md((\?|#).*)?$/; +var isLinkExternal = (link, base = "/") => isLinkWithProtocol(link) || // absolute link that does not start with `base` and does not end with `.md` +link.startsWith("/") && !link.startsWith(base) && !markdownLinkRegexp.test(link); +var isLinkHttp = (link) => /^(https?:)?\/\//.test(link); +var inferRoutePath = (path) => { + if (!path || path.endsWith("/")) return path; + let routePath = path.replace(/(^|\/)README.md$/i, "$1index.html"); + if (routePath.endsWith(".md")) { + routePath = routePath.substring(0, routePath.length - 3) + ".html"; + } else if (!routePath.endsWith(".html")) { + routePath = routePath + ".html"; + } + if (routePath.endsWith("/index.html")) { + routePath = routePath.substring(0, routePath.length - 10); + } + return routePath; +}; +var FAKE_HOST = "http://."; +var normalizeRoutePath = (pathname, current) => { + if (!pathname.startsWith("/") && current) { + const loc = current.slice(0, current.lastIndexOf("/")); + return inferRoutePath(new URL(`${loc}/${pathname}`, FAKE_HOST).pathname); + } + return inferRoutePath(pathname); +}; +var resolveLocalePath = (locales, routePath) => { + const localePaths = Object.keys(locales).sort((a, b) => { + const levelDelta = b.split("/").length - a.split("/").length; + if (levelDelta !== 0) { + return levelDelta; + } + return b.length - a.length; + }); + for (const localePath of localePaths) { + if (routePath.startsWith(localePath)) { + return localePath; + } + } + return "/"; +}; +var resolveRoutePathFromUrl = (url, base = "/") => { + const pathname = url.replace(/^(?:https?:)?\/\/[^/]*/, ""); + return pathname.startsWith(base) ? `/${pathname.slice(base.length)}` : pathname; +}; +var SPLIT_CHAR_REGEXP = /(#|\?)/; +var splitPath = (path) => { + const [pathname, ...hashAndQueries] = path.split(SPLIT_CHAR_REGEXP); + return { + pathname, + hashAndQueries: hashAndQueries.join("") + }; +}; +var TAGS_ALLOWED = ["link", "meta", "script", "style", "noscript", "template"]; +var TAGS_UNIQUE = ["title", "base"]; +var resolveHeadIdentifier = ([tag, attrs, content]) => { + if (TAGS_UNIQUE.includes(tag)) { + return tag; + } + if (!TAGS_ALLOWED.includes(tag)) { + return null; + } + if (tag === "meta" && attrs.name) { + return `${tag}.${attrs.name}`; + } + if (tag === "template" && attrs.id) { + return `${tag}.${attrs.id}`; + } + return JSON.stringify([ + tag, + Object.entries(attrs).map(([key, value]) => { + if (typeof value === "boolean") { + return value ? [key, ""] : null; + } + return [key, value]; + }).filter((item) => item != null).sort(([keyA], [keyB]) => keyA.localeCompare(keyB)), + content + ]); +}; +var dedupeHead = (head) => { + const identifierSet = /* @__PURE__ */ new Set(); + const result = []; + head.forEach((item) => { + const identifier = resolveHeadIdentifier(item); + if (identifier && !identifierSet.has(identifier)) { + identifierSet.add(identifier); + result.push(item); + } + }); + return result; +}; +var ensureLeadingSlash = (str) => str[0] === "/" ? str : `/${str}`; +var ensureEndingSlash = (str) => str[str.length - 1] === "/" || str.endsWith(".html") ? str : `${str}/`; +var formatDateString = (str, defaultDateString = "") => { + const dateMatch = str.match(/\b(\d{4})-(\d{1,2})-(\d{1,2})\b/); + if (dateMatch === null) { + return defaultDateString; + } + const [, yearStr, monthStr, dayStr] = dateMatch; + return [yearStr, monthStr.padStart(2, "0"), dayStr.padStart(2, "0")].join("-"); +}; +var omit = (obj, ...keys) => { + const result = { ...obj }; + for (const key of keys) { + delete result[key]; + } + return result; +}; +var removeEndingSlash = (str) => str[str.length - 1] === "/" ? str.slice(0, -1) : str; +var removeLeadingSlash = (str) => str[0] === "/" ? str.slice(1) : str; +var isFunction = (val) => typeof val === "function"; +var isPlainObject = (val) => Object.prototype.toString.call(val) === "[object Object]"; +var isString = (val) => typeof val === "string"; +export { + dedupeHead, + ensureEndingSlash, + ensureLeadingSlash, + formatDateString, + inferRoutePath, + isFunction, + isLinkExternal, + isLinkHttp, + isLinkWithProtocol, + isPlainObject, + isString, + normalizeRoutePath, + omit, + removeEndingSlash, + removeLeadingSlash, + resolveHeadIdentifier, + resolveLocalePath, + resolveRoutePathFromUrl, + splitPath +}; +//# sourceMappingURL=@vuepress_shared.js.map diff --git a/src/.vuepress/.cache/deps/@vuepress_shared.js.map b/src/.vuepress/.cache/deps/@vuepress_shared.js.map new file mode 100644 index 000000000..a5a24ef20 --- /dev/null +++ b/src/.vuepress/.cache/deps/@vuepress_shared.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/@vuepress/shared/dist/index.js"], + "sourcesContent": ["// src/utils/links/isLinkWithProtocol.ts\nvar isLinkWithProtocol = (link) => /^[a-z][a-z0-9+.-]*:/.test(link) || link.startsWith(\"//\");\n\n// src/utils/links/isLinkExternal.ts\nvar markdownLinkRegexp = /.md((\\?|#).*)?$/;\nvar isLinkExternal = (link, base = \"/\") => isLinkWithProtocol(link) || // absolute link that does not start with `base` and does not end with `.md`\nlink.startsWith(\"/\") && !link.startsWith(base) && !markdownLinkRegexp.test(link);\n\n// src/utils/links/isLinkHttp.ts\nvar isLinkHttp = (link) => /^(https?:)?\\/\\//.test(link);\n\n// src/utils/routes/inferRoutePath.ts\nvar inferRoutePath = (path) => {\n if (!path || path.endsWith(\"/\")) return path;\n let routePath = path.replace(/(^|\\/)README.md$/i, \"$1index.html\");\n if (routePath.endsWith(\".md\")) {\n routePath = routePath.substring(0, routePath.length - 3) + \".html\";\n } else if (!routePath.endsWith(\".html\")) {\n routePath = routePath + \".html\";\n }\n if (routePath.endsWith(\"/index.html\")) {\n routePath = routePath.substring(0, routePath.length - 10);\n }\n return routePath;\n};\n\n// src/utils/routes/normalizeRoutePath.ts\nvar FAKE_HOST = \"http://.\";\nvar normalizeRoutePath = (pathname, current) => {\n if (!pathname.startsWith(\"/\") && current) {\n const loc = current.slice(0, current.lastIndexOf(\"/\"));\n return inferRoutePath(new URL(`${loc}/${pathname}`, FAKE_HOST).pathname);\n }\n return inferRoutePath(pathname);\n};\n\n// src/utils/routes/resolveLocalePath.ts\nvar resolveLocalePath = (locales, routePath) => {\n const localePaths = Object.keys(locales).sort((a, b) => {\n const levelDelta = b.split(\"/\").length - a.split(\"/\").length;\n if (levelDelta !== 0) {\n return levelDelta;\n }\n return b.length - a.length;\n });\n for (const localePath of localePaths) {\n if (routePath.startsWith(localePath)) {\n return localePath;\n }\n }\n return \"/\";\n};\n\n// src/utils/routes/resolveRoutePathFromUrl.ts\nvar resolveRoutePathFromUrl = (url, base = \"/\") => {\n const pathname = url.replace(/^(?:https?:)?\\/\\/[^/]*/, \"\");\n return pathname.startsWith(base) ? `/${pathname.slice(base.length)}` : pathname;\n};\n\n// src/utils/routes/splitPath.ts\nvar SPLIT_CHAR_REGEXP = /(#|\\?)/;\nvar splitPath = (path) => {\n const [pathname, ...hashAndQueries] = path.split(SPLIT_CHAR_REGEXP);\n return {\n pathname,\n hashAndQueries: hashAndQueries.join(\"\")\n };\n};\n\n// src/utils/resolveHeadIdentifier.ts\nvar TAGS_ALLOWED = [\"link\", \"meta\", \"script\", \"style\", \"noscript\", \"template\"];\nvar TAGS_UNIQUE = [\"title\", \"base\"];\nvar resolveHeadIdentifier = ([tag, attrs, content]) => {\n if (TAGS_UNIQUE.includes(tag)) {\n return tag;\n }\n if (!TAGS_ALLOWED.includes(tag)) {\n return null;\n }\n if (tag === \"meta\" && attrs.name) {\n return `${tag}.${attrs.name}`;\n }\n if (tag === \"template\" && attrs.id) {\n return `${tag}.${attrs.id}`;\n }\n return JSON.stringify([\n tag,\n Object.entries(attrs).map(([key, value]) => {\n if (typeof value === \"boolean\") {\n return value ? [key, \"\"] : null;\n }\n return [key, value];\n }).filter((item) => item != null).sort(([keyA], [keyB]) => keyA.localeCompare(keyB)),\n content\n ]);\n};\n\n// src/utils/dedupeHead.ts\nvar dedupeHead = (head) => {\n const identifierSet = /* @__PURE__ */ new Set();\n const result = [];\n head.forEach((item) => {\n const identifier = resolveHeadIdentifier(item);\n if (identifier && !identifierSet.has(identifier)) {\n identifierSet.add(identifier);\n result.push(item);\n }\n });\n return result;\n};\n\n// src/utils/ensureLeadingSlash.ts\nvar ensureLeadingSlash = (str) => str[0] === \"/\" ? str : `/${str}`;\n\n// src/utils/ensureEndingSlash.ts\nvar ensureEndingSlash = (str) => str[str.length - 1] === \"/\" || str.endsWith(\".html\") ? str : `${str}/`;\n\n// src/utils/formatDateString.ts\nvar formatDateString = (str, defaultDateString = \"\") => {\n const dateMatch = str.match(/\\b(\\d{4})-(\\d{1,2})-(\\d{1,2})\\b/);\n if (dateMatch === null) {\n return defaultDateString;\n }\n const [, yearStr, monthStr, dayStr] = dateMatch;\n return [yearStr, monthStr.padStart(2, \"0\"), dayStr.padStart(2, \"0\")].join(\"-\");\n};\n\n// src/utils/omit.ts\nvar omit = (obj, ...keys) => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\n// src/utils/removeEndingSlash.ts\nvar removeEndingSlash = (str) => str[str.length - 1] === \"/\" ? str.slice(0, -1) : str;\n\n// src/utils/removeLeadingSlash.ts\nvar removeLeadingSlash = (str) => str[0] === \"/\" ? str.slice(1) : str;\n\n// src/utils/typeGuards.ts\nvar isFunction = (val) => typeof val === \"function\";\nvar isPlainObject = (val) => Object.prototype.toString.call(val) === \"[object Object]\";\nvar isString = (val) => typeof val === \"string\";\nexport {\n dedupeHead,\n ensureEndingSlash,\n ensureLeadingSlash,\n formatDateString,\n inferRoutePath,\n isFunction,\n isLinkExternal,\n isLinkHttp,\n isLinkWithProtocol,\n isPlainObject,\n isString,\n normalizeRoutePath,\n omit,\n removeEndingSlash,\n removeLeadingSlash,\n resolveHeadIdentifier,\n resolveLocalePath,\n resolveRoutePathFromUrl,\n splitPath\n};\n"], + "mappings": "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", + "names": [] +} diff --git a/src/.vuepress/.cache/deps/@vueuse_core.js b/src/.vuepress/.cache/deps/@vueuse_core.js new file mode 100644 index 000000000..3e5bd5a9e --- /dev/null +++ b/src/.vuepress/.cache/deps/@vueuse_core.js @@ -0,0 +1,9189 @@ +import { + Fragment, + TransitionGroup, + computed, + customRef, + defineComponent, + effectScope, + getCurrentInstance, + getCurrentScope, + h, + inject, + isReactive, + isReadonly, + isRef, + markRaw, + nextTick, + onBeforeMount, + onBeforeUnmount, + onBeforeUpdate, + onMounted, + onScopeDispose, + onUnmounted, + onUpdated, + provide, + reactive, + readonly, + ref, + shallowReactive, + shallowRef, + toRef, + toRefs, + unref, + version, + watch, + watchEffect +} from "./chunk-PAUCAATC.js"; +import "./chunk-V6TY7KAL.js"; + +// node_modules/@vueuse/shared/node_modules/vue-demi/lib/index.mjs +var isVue2 = false; +var isVue3 = true; +function set(target, key, val) { + if (Array.isArray(target)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val; + } + target[key] = val; + return val; +} + +// node_modules/@vueuse/shared/index.mjs +function computedEager(fn, options) { + var _a; + const result = shallowRef(); + watchEffect(() => { + result.value = fn(); + }, { + ...options, + flush: (_a = options == null ? void 0 : options.flush) != null ? _a : "sync" + }); + return readonly(result); +} +function computedWithControl(source, fn) { + let v = void 0; + let track; + let trigger; + const dirty = ref(true); + const update = () => { + dirty.value = true; + trigger(); + }; + watch(source, update, { flush: "sync" }); + const get2 = typeof fn === "function" ? fn : fn.get; + const set4 = typeof fn === "function" ? void 0 : fn.set; + const result = customRef((_track, _trigger) => { + track = _track; + trigger = _trigger; + return { + get() { + if (dirty.value) { + v = get2(); + dirty.value = false; + } + track(); + return v; + }, + set(v2) { + set4 == null ? void 0 : set4(v2); + } + }; + }); + if (Object.isExtensible(result)) + result.trigger = update; + return result; +} +function tryOnScopeDispose(fn) { + if (getCurrentScope()) { + onScopeDispose(fn); + return true; + } + return false; +} +function createEventHook() { + const fns = /* @__PURE__ */ new Set(); + const off = (fn) => { + fns.delete(fn); + }; + const on = (fn) => { + fns.add(fn); + const offFn = () => off(fn); + tryOnScopeDispose(offFn); + return { + off: offFn + }; + }; + const trigger = (...args) => { + return Promise.all(Array.from(fns).map((fn) => fn(...args))); + }; + return { + on, + off, + trigger + }; +} +function createGlobalState(stateFactory) { + let initialized = false; + let state; + const scope = effectScope(true); + return (...args) => { + if (!initialized) { + state = scope.run(() => stateFactory(...args)); + initialized = true; + } + return state; + }; +} +var localProvidedStateMap = /* @__PURE__ */ new WeakMap(); +var provideLocal = (key, value) => { + var _a; + const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy; + if (instance == null) + throw new Error("provideLocal must be called in setup"); + if (!localProvidedStateMap.has(instance)) + localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null)); + const localProvidedState = localProvidedStateMap.get(instance); + localProvidedState[key] = value; + provide(key, value); +}; +var injectLocal = (...args) => { + var _a; + const key = args[0]; + const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy; + if (instance == null) + throw new Error("injectLocal must be called in setup"); + if (localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance)) + return localProvidedStateMap.get(instance)[key]; + return inject(...args); +}; +function createInjectionState(composable, options) { + const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || "InjectionState"); + const defaultValue = options == null ? void 0 : options.defaultValue; + const useProvidingState = (...args) => { + const state = composable(...args); + provideLocal(key, state); + return state; + }; + const useInjectedState = () => injectLocal(key, defaultValue); + return [useProvidingState, useInjectedState]; +} +function createSharedComposable(composable) { + let subscribers = 0; + let state; + let scope; + const dispose = () => { + subscribers -= 1; + if (scope && subscribers <= 0) { + scope.stop(); + state = void 0; + scope = void 0; + } + }; + return (...args) => { + subscribers += 1; + if (!state) { + scope = effectScope(true); + state = scope.run(() => composable(...args)); + } + tryOnScopeDispose(dispose); + return state; + }; +} +function extendRef(ref2, extend, { enumerable = false, unwrap = true } = {}) { + if (!isVue3 && !version.startsWith("2.7.")) { + if (true) + throw new Error("[VueUse] extendRef only works in Vue 2.7 or above."); + return; + } + for (const [key, value] of Object.entries(extend)) { + if (key === "value") + continue; + if (isRef(value) && unwrap) { + Object.defineProperty(ref2, key, { + get() { + return value.value; + }, + set(v) { + value.value = v; + }, + enumerable + }); + } else { + Object.defineProperty(ref2, key, { value, enumerable }); + } + } + return ref2; +} +function get(obj, key) { + if (key == null) + return unref(obj); + return unref(obj)[key]; +} +function isDefined(v) { + return unref(v) != null; +} +function makeDestructurable(obj, arr) { + if (typeof Symbol !== "undefined") { + const clone = { ...obj }; + Object.defineProperty(clone, Symbol.iterator, { + enumerable: false, + value() { + let index = 0; + return { + next: () => ({ + value: arr[index++], + done: index > arr.length + }) + }; + } + }); + return clone; + } else { + return Object.assign([...arr], obj); + } +} +function toValue(r) { + return typeof r === "function" ? r() : unref(r); +} +var resolveUnref = toValue; +function reactify(fn, options) { + const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue; + return function(...args) { + return computed(() => fn.apply(this, args.map((i) => unrefFn(i)))); + }; +} +function reactifyObject(obj, optionsOrKeys = {}) { + let keys2 = []; + let options; + if (Array.isArray(optionsOrKeys)) { + keys2 = optionsOrKeys; + } else { + options = optionsOrKeys; + const { includeOwnProperties = true } = optionsOrKeys; + keys2.push(...Object.keys(obj)); + if (includeOwnProperties) + keys2.push(...Object.getOwnPropertyNames(obj)); + } + return Object.fromEntries( + keys2.map((key) => { + const value = obj[key]; + return [ + key, + typeof value === "function" ? reactify(value.bind(obj), options) : value + ]; + }) + ); +} +function toReactive(objectRef) { + if (!isRef(objectRef)) + return reactive(objectRef); + const proxy = new Proxy({}, { + get(_, p, receiver) { + return unref(Reflect.get(objectRef.value, p, receiver)); + }, + set(_, p, value) { + if (isRef(objectRef.value[p]) && !isRef(value)) + objectRef.value[p].value = value; + else + objectRef.value[p] = value; + return true; + }, + deleteProperty(_, p) { + return Reflect.deleteProperty(objectRef.value, p); + }, + has(_, p) { + return Reflect.has(objectRef.value, p); + }, + ownKeys() { + return Object.keys(objectRef.value); + }, + getOwnPropertyDescriptor() { + return { + enumerable: true, + configurable: true + }; + } + }); + return reactive(proxy); +} +function reactiveComputed(fn) { + return toReactive(computed(fn)); +} +function reactiveOmit(obj, ...keys2) { + const flatKeys = keys2.flat(); + const predicate = flatKeys[0]; + return reactiveComputed(() => typeof predicate === "function" ? Object.fromEntries(Object.entries(toRefs(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs(obj)).filter((e) => !flatKeys.includes(e[0])))); +} +var isClient = typeof window !== "undefined" && typeof document !== "undefined"; +var isWorker = typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope; +var isDef = (val) => typeof val !== "undefined"; +var notNullish = (val) => val != null; +var assert = (condition, ...infos) => { + if (!condition) + console.warn(...infos); +}; +var toString = Object.prototype.toString; +var isObject = (val) => toString.call(val) === "[object Object]"; +var now = () => Date.now(); +var timestamp = () => +Date.now(); +var clamp = (n, min, max) => Math.min(max, Math.max(min, n)); +var noop = () => { +}; +var rand = (min, max) => { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +}; +var hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key); +var isIOS = getIsIOS(); +function getIsIOS() { + var _a, _b; + return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent)); +} +function createFilterWrapper(filter, fn) { + function wrapper(...args) { + return new Promise((resolve, reject) => { + Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject); + }); + } + return wrapper; +} +var bypassFilter = (invoke2) => { + return invoke2(); +}; +function debounceFilter(ms, options = {}) { + let timer; + let maxTimer; + let lastRejector = noop; + const _clearTimeout = (timer2) => { + clearTimeout(timer2); + lastRejector(); + lastRejector = noop; + }; + const filter = (invoke2) => { + const duration = toValue(ms); + const maxDuration = toValue(options.maxWait); + if (timer) + _clearTimeout(timer); + if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) { + if (maxTimer) { + _clearTimeout(maxTimer); + maxTimer = null; + } + return Promise.resolve(invoke2()); + } + return new Promise((resolve, reject) => { + lastRejector = options.rejectOnCancel ? reject : resolve; + if (maxDuration && !maxTimer) { + maxTimer = setTimeout(() => { + if (timer) + _clearTimeout(timer); + maxTimer = null; + resolve(invoke2()); + }, maxDuration); + } + timer = setTimeout(() => { + if (maxTimer) + _clearTimeout(maxTimer); + maxTimer = null; + resolve(invoke2()); + }, duration); + }); + }; + return filter; +} +function throttleFilter(...args) { + let lastExec = 0; + let timer; + let isLeading = true; + let lastRejector = noop; + let lastValue; + let ms; + let trailing; + let leading; + let rejectOnCancel; + if (!isRef(args[0]) && typeof args[0] === "object") + ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]); + else + [ms, trailing = true, leading = true, rejectOnCancel = false] = args; + const clear = () => { + if (timer) { + clearTimeout(timer); + timer = void 0; + lastRejector(); + lastRejector = noop; + } + }; + const filter = (_invoke) => { + const duration = toValue(ms); + const elapsed = Date.now() - lastExec; + const invoke2 = () => { + return lastValue = _invoke(); + }; + clear(); + if (duration <= 0) { + lastExec = Date.now(); + return invoke2(); + } + if (elapsed > duration && (leading || !isLeading)) { + lastExec = Date.now(); + invoke2(); + } else if (trailing) { + lastValue = new Promise((resolve, reject) => { + lastRejector = rejectOnCancel ? reject : resolve; + timer = setTimeout(() => { + lastExec = Date.now(); + isLeading = true; + resolve(invoke2()); + clear(); + }, Math.max(0, duration - elapsed)); + }); + } + if (!leading && !timer) + timer = setTimeout(() => isLeading = true, duration); + isLeading = false; + return lastValue; + }; + return filter; +} +function pausableFilter(extendFilter = bypassFilter) { + const isActive = ref(true); + function pause() { + isActive.value = false; + } + function resume() { + isActive.value = true; + } + const eventFilter = (...args) => { + if (isActive.value) + extendFilter(...args); + }; + return { isActive: readonly(isActive), pause, resume, eventFilter }; +} +var directiveHooks = { + mounted: isVue3 ? "mounted" : "inserted", + updated: isVue3 ? "updated" : "componentUpdated", + unmounted: isVue3 ? "unmounted" : "unbind" +}; +function cacheStringFunction(fn) { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +} +var hyphenateRE = /\B([A-Z])/g; +var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase()); +var camelizeRE = /-(\w)/g; +var camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +function promiseTimeout(ms, throwOnTimeout = false, reason = "Timeout") { + return new Promise((resolve, reject) => { + if (throwOnTimeout) + setTimeout(() => reject(reason), ms); + else + setTimeout(resolve, ms); + }); +} +function identity(arg) { + return arg; +} +function createSingletonPromise(fn) { + let _promise; + function wrapper() { + if (!_promise) + _promise = fn(); + return _promise; + } + wrapper.reset = async () => { + const _prev = _promise; + _promise = void 0; + if (_prev) + await _prev; + }; + return wrapper; +} +function invoke(fn) { + return fn(); +} +function containsProp(obj, ...props) { + return props.some((k) => k in obj); +} +function increaseWithUnit(target, delta) { + var _a; + if (typeof target === "number") + return target + delta; + const value = ((_a = target.match(/^-?\d+\.?\d*/)) == null ? void 0 : _a[0]) || ""; + const unit = target.slice(value.length); + const result = Number.parseFloat(value) + delta; + if (Number.isNaN(result)) + return target; + return result + unit; +} +function objectPick(obj, keys2, omitUndefined = false) { + return keys2.reduce((n, k) => { + if (k in obj) { + if (!omitUndefined || obj[k] !== void 0) + n[k] = obj[k]; + } + return n; + }, {}); +} +function objectOmit(obj, keys2, omitUndefined = false) { + return Object.fromEntries(Object.entries(obj).filter(([key, value]) => { + return (!omitUndefined || value !== void 0) && !keys2.includes(key); + })); +} +function objectEntries(obj) { + return Object.entries(obj); +} +function getLifeCycleTarget(target) { + return target || getCurrentInstance(); +} +function toRef2(...args) { + if (args.length !== 1) + return toRef(...args); + const r = args[0]; + return typeof r === "function" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r); +} +var resolveRef = toRef2; +function reactivePick(obj, ...keys2) { + const flatKeys = keys2.flat(); + const predicate = flatKeys[0]; + return reactiveComputed(() => typeof predicate === "function" ? Object.fromEntries(Object.entries(toRefs(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef2(obj, k)]))); +} +function refAutoReset(defaultValue, afterMs = 1e4) { + return customRef((track, trigger) => { + let value = toValue(defaultValue); + let timer; + const resetAfter = () => setTimeout(() => { + value = toValue(defaultValue); + trigger(); + }, toValue(afterMs)); + tryOnScopeDispose(() => { + clearTimeout(timer); + }); + return { + get() { + track(); + return value; + }, + set(newValue) { + value = newValue; + trigger(); + clearTimeout(timer); + timer = resetAfter(); + } + }; + }); +} +function useDebounceFn(fn, ms = 200, options = {}) { + return createFilterWrapper( + debounceFilter(ms, options), + fn + ); +} +function refDebounced(value, ms = 200, options = {}) { + const debounced = ref(value.value); + const updater = useDebounceFn(() => { + debounced.value = value.value; + }, ms, options); + watch(value, () => updater()); + return debounced; +} +function refDefault(source, defaultValue) { + return computed({ + get() { + var _a; + return (_a = source.value) != null ? _a : defaultValue; + }, + set(value) { + source.value = value; + } + }); +} +function useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) { + return createFilterWrapper( + throttleFilter(ms, trailing, leading, rejectOnCancel), + fn + ); +} +function refThrottled(value, delay = 200, trailing = true, leading = true) { + if (delay <= 0) + return value; + const throttled = ref(value.value); + const updater = useThrottleFn(() => { + throttled.value = value.value; + }, delay, trailing, leading); + watch(value, () => updater()); + return throttled; +} +function refWithControl(initial, options = {}) { + let source = initial; + let track; + let trigger; + const ref2 = customRef((_track, _trigger) => { + track = _track; + trigger = _trigger; + return { + get() { + return get2(); + }, + set(v) { + set4(v); + } + }; + }); + function get2(tracking = true) { + if (tracking) + track(); + return source; + } + function set4(value, triggering = true) { + var _a, _b; + if (value === source) + return; + const old = source; + if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false) + return; + source = value; + (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old); + if (triggering) + trigger(); + } + const untrackedGet = () => get2(false); + const silentSet = (v) => set4(v, false); + const peek = () => get2(false); + const lay = (v) => set4(v, false); + return extendRef( + ref2, + { + get: get2, + set: set4, + untrackedGet, + silentSet, + peek, + lay + }, + { enumerable: true } + ); +} +var controlledRef = refWithControl; +function set2(...args) { + if (args.length === 2) { + const [ref2, value] = args; + ref2.value = value; + } + if (args.length === 3) { + if (isVue2) { + set(...args); + } else { + const [target, key, value] = args; + target[key] = value; + } + } +} +function watchWithFilter(source, cb, options = {}) { + const { + eventFilter = bypassFilter, + ...watchOptions + } = options; + return watch( + source, + createFilterWrapper( + eventFilter, + cb + ), + watchOptions + ); +} +function watchPausable(source, cb, options = {}) { + const { + eventFilter: filter, + ...watchOptions + } = options; + const { eventFilter, pause, resume, isActive } = pausableFilter(filter); + const stop = watchWithFilter( + source, + cb, + { + ...watchOptions, + eventFilter + } + ); + return { stop, pause, resume, isActive }; +} +function syncRef(left, right, ...[options]) { + const { + flush = "sync", + deep = false, + immediate = true, + direction = "both", + transform = {} + } = options || {}; + const watchers = []; + const transformLTR = "ltr" in transform && transform.ltr || ((v) => v); + const transformRTL = "rtl" in transform && transform.rtl || ((v) => v); + if (direction === "both" || direction === "ltr") { + watchers.push(watchPausable( + left, + (newValue) => { + watchers.forEach((w) => w.pause()); + right.value = transformLTR(newValue); + watchers.forEach((w) => w.resume()); + }, + { flush, deep, immediate } + )); + } + if (direction === "both" || direction === "rtl") { + watchers.push(watchPausable( + right, + (newValue) => { + watchers.forEach((w) => w.pause()); + left.value = transformRTL(newValue); + watchers.forEach((w) => w.resume()); + }, + { flush, deep, immediate } + )); + } + const stop = () => { + watchers.forEach((w) => w.stop()); + }; + return stop; +} +function syncRefs(source, targets, options = {}) { + const { + flush = "sync", + deep = false, + immediate = true + } = options; + if (!Array.isArray(targets)) + targets = [targets]; + return watch( + source, + (newValue) => targets.forEach((target) => target.value = newValue), + { flush, deep, immediate } + ); +} +function toRefs2(objectRef, options = {}) { + if (!isRef(objectRef)) + return toRefs(objectRef); + const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {}; + for (const key in objectRef.value) { + result[key] = customRef(() => ({ + get() { + return objectRef.value[key]; + }, + set(v) { + var _a; + const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true; + if (replaceRef) { + if (Array.isArray(objectRef.value)) { + const copy = [...objectRef.value]; + copy[key] = v; + objectRef.value = copy; + } else { + const newObject = { ...objectRef.value, [key]: v }; + Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value)); + objectRef.value = newObject; + } + } else { + objectRef.value[key] = v; + } + } + })); + } + return result; +} +function tryOnBeforeMount(fn, sync = true, target) { + const instance = getLifeCycleTarget(target); + if (instance) + onBeforeMount(fn, target); + else if (sync) + fn(); + else + nextTick(fn); +} +function tryOnBeforeUnmount(fn, target) { + const instance = getLifeCycleTarget(target); + if (instance) + onBeforeUnmount(fn, target); +} +function tryOnMounted(fn, sync = true, target) { + const instance = getLifeCycleTarget(); + if (instance) + onMounted(fn, target); + else if (sync) + fn(); + else + nextTick(fn); +} +function tryOnUnmounted(fn, target) { + const instance = getLifeCycleTarget(target); + if (instance) + onUnmounted(fn, target); +} +function createUntil(r, isNot = false) { + function toMatch(condition, { flush = "sync", deep = false, timeout, throwOnTimeout } = {}) { + let stop = null; + const watcher = new Promise((resolve) => { + stop = watch( + r, + (v) => { + if (condition(v) !== isNot) { + stop == null ? void 0 : stop(); + resolve(v); + } + }, + { + flush, + deep, + immediate: true + } + ); + }); + const promises = [watcher]; + if (timeout != null) { + promises.push( + promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop()) + ); + } + return Promise.race(promises); + } + function toBe(value, options) { + if (!isRef(value)) + return toMatch((v) => v === value, options); + const { flush = "sync", deep = false, timeout, throwOnTimeout } = options != null ? options : {}; + let stop = null; + const watcher = new Promise((resolve) => { + stop = watch( + [r, value], + ([v1, v2]) => { + if (isNot !== (v1 === v2)) { + stop == null ? void 0 : stop(); + resolve(v1); + } + }, + { + flush, + deep, + immediate: true + } + ); + }); + const promises = [watcher]; + if (timeout != null) { + promises.push( + promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => { + stop == null ? void 0 : stop(); + return toValue(r); + }) + ); + } + return Promise.race(promises); + } + function toBeTruthy(options) { + return toMatch((v) => Boolean(v), options); + } + function toBeNull(options) { + return toBe(null, options); + } + function toBeUndefined(options) { + return toBe(void 0, options); + } + function toBeNaN(options) { + return toMatch(Number.isNaN, options); + } + function toContains(value, options) { + return toMatch((v) => { + const array = Array.from(v); + return array.includes(value) || array.includes(toValue(value)); + }, options); + } + function changed(options) { + return changedTimes(1, options); + } + function changedTimes(n = 1, options) { + let count = -1; + return toMatch(() => { + count += 1; + return count >= n; + }, options); + } + if (Array.isArray(toValue(r))) { + const instance = { + toMatch, + toContains, + changed, + changedTimes, + get not() { + return createUntil(r, !isNot); + } + }; + return instance; + } else { + const instance = { + toMatch, + toBe, + toBeTruthy, + toBeNull, + toBeNaN, + toBeUndefined, + changed, + changedTimes, + get not() { + return createUntil(r, !isNot); + } + }; + return instance; + } +} +function until(r) { + return createUntil(r); +} +function defaultComparator(value, othVal) { + return value === othVal; +} +function useArrayDifference(...args) { + var _a; + const list = args[0]; + const values = args[1]; + let compareFn = (_a = args[2]) != null ? _a : defaultComparator; + if (typeof compareFn === "string") { + const key = compareFn; + compareFn = (value, othVal) => value[key] === othVal[key]; + } + return computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1)); +} +function useArrayEvery(list, fn) { + return computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array))); +} +function useArrayFilter(list, fn) { + return computed(() => toValue(list).map((i) => toValue(i)).filter(fn)); +} +function useArrayFind(list, fn) { + return computed(() => toValue( + toValue(list).find((element, index, array) => fn(toValue(element), index, array)) + )); +} +function useArrayFindIndex(list, fn) { + return computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array))); +} +function findLast(arr, cb) { + let index = arr.length; + while (index-- > 0) { + if (cb(arr[index], index, arr)) + return arr[index]; + } + return void 0; +} +function useArrayFindLast(list, fn) { + return computed(() => toValue( + !Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array)) + )); +} +function isArrayIncludesOptions(obj) { + return isObject(obj) && containsProp(obj, "formIndex", "comparator"); +} +function useArrayIncludes(...args) { + var _a; + const list = args[0]; + const value = args[1]; + let comparator = args[2]; + let formIndex = 0; + if (isArrayIncludesOptions(comparator)) { + formIndex = (_a = comparator.fromIndex) != null ? _a : 0; + comparator = comparator.comparator; + } + if (typeof comparator === "string") { + const key = comparator; + comparator = (element, value2) => element[key] === toValue(value2); + } + comparator = comparator != null ? comparator : (element, value2) => element === toValue(value2); + return computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator( + toValue(element), + toValue(value), + index, + toValue(array) + ))); +} +function useArrayJoin(list, separator) { + return computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator))); +} +function useArrayMap(list, fn) { + return computed(() => toValue(list).map((i) => toValue(i)).map(fn)); +} +function useArrayReduce(list, reducer, ...args) { + const reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index); + return computed(() => { + const resolved = toValue(list); + return args.length ? resolved.reduce(reduceCallback, toValue(args[0])) : resolved.reduce(reduceCallback); + }); +} +function useArraySome(list, fn) { + return computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array))); +} +function uniq(array) { + return Array.from(new Set(array)); +} +function uniqueElementsBy(array, fn) { + return array.reduce((acc, v) => { + if (!acc.some((x) => fn(v, x, array))) + acc.push(v); + return acc; + }, []); +} +function useArrayUnique(list, compareFn) { + return computed(() => { + const resolvedList = toValue(list).map((element) => toValue(element)); + return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList); + }); +} +function useCounter(initialValue = 0, options = {}) { + let _initialValue = unref(initialValue); + const count = ref(initialValue); + const { + max = Number.POSITIVE_INFINITY, + min = Number.NEGATIVE_INFINITY + } = options; + const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min); + const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max); + const get2 = () => count.value; + const set4 = (val) => count.value = Math.max(min, Math.min(max, val)); + const reset = (val = _initialValue) => { + _initialValue = val; + return set4(val); + }; + return { count, inc, dec, get: get2, set: set4, reset }; +} +var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[T\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/i; +var REGEX_FORMAT = /[YMDHhms]o|\[([^\]]+)\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g; +function defaultMeridiem(hours, minutes, isLowercase, hasPeriod) { + let m = hours < 12 ? "AM" : "PM"; + if (hasPeriod) + m = m.split("").reduce((acc, curr) => acc += `${curr}.`, ""); + return isLowercase ? m.toLowerCase() : m; +} +function formatOrdinal(num) { + const suffixes = ["th", "st", "nd", "rd"]; + const v = num % 100; + return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]); +} +function formatDate(date, formatStr, options = {}) { + var _a; + const years = date.getFullYear(); + const month = date.getMonth(); + const days = date.getDate(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const seconds = date.getSeconds(); + const milliseconds = date.getMilliseconds(); + const day = date.getDay(); + const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem; + const matches = { + Yo: () => formatOrdinal(years), + YY: () => String(years).slice(-2), + YYYY: () => years, + M: () => month + 1, + Mo: () => formatOrdinal(month + 1), + MM: () => `${month + 1}`.padStart(2, "0"), + MMM: () => date.toLocaleDateString(options.locales, { month: "short" }), + MMMM: () => date.toLocaleDateString(options.locales, { month: "long" }), + D: () => String(days), + Do: () => formatOrdinal(days), + DD: () => `${days}`.padStart(2, "0"), + H: () => String(hours), + Ho: () => formatOrdinal(hours), + HH: () => `${hours}`.padStart(2, "0"), + h: () => `${hours % 12 || 12}`.padStart(1, "0"), + ho: () => formatOrdinal(hours % 12 || 12), + hh: () => `${hours % 12 || 12}`.padStart(2, "0"), + m: () => String(minutes), + mo: () => formatOrdinal(minutes), + mm: () => `${minutes}`.padStart(2, "0"), + s: () => String(seconds), + so: () => formatOrdinal(seconds), + ss: () => `${seconds}`.padStart(2, "0"), + SSS: () => `${milliseconds}`.padStart(3, "0"), + d: () => day, + dd: () => date.toLocaleDateString(options.locales, { weekday: "narrow" }), + ddd: () => date.toLocaleDateString(options.locales, { weekday: "short" }), + dddd: () => date.toLocaleDateString(options.locales, { weekday: "long" }), + A: () => meridiem(hours, minutes), + AA: () => meridiem(hours, minutes, false, true), + a: () => meridiem(hours, minutes, true), + aa: () => meridiem(hours, minutes, true, true) + }; + return formatStr.replace(REGEX_FORMAT, (match, $1) => { + var _a2, _b; + return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match; + }); +} +function normalizeDate(date) { + if (date === null) + return new Date(Number.NaN); + if (date === void 0) + return /* @__PURE__ */ new Date(); + if (date instanceof Date) + return new Date(date); + if (typeof date === "string" && !/Z$/i.test(date)) { + const d = date.match(REGEX_PARSE); + if (d) { + const m = d[2] - 1 || 0; + const ms = (d[7] || "0").substring(0, 3); + return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms); + } + } + return new Date(date); +} +function useDateFormat(date, formatStr = "HH:mm:ss", options = {}) { + return computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options)); +} +function useIntervalFn(cb, interval = 1e3, options = {}) { + const { + immediate = true, + immediateCallback = false + } = options; + let timer = null; + const isActive = ref(false); + function clean() { + if (timer) { + clearInterval(timer); + timer = null; + } + } + function pause() { + isActive.value = false; + clean(); + } + function resume() { + const intervalValue = toValue(interval); + if (intervalValue <= 0) + return; + isActive.value = true; + if (immediateCallback) + cb(); + clean(); + timer = setInterval(cb, intervalValue); + } + if (immediate && isClient) + resume(); + if (isRef(interval) || typeof interval === "function") { + const stopWatch = watch(interval, () => { + if (isActive.value && isClient) + resume(); + }); + tryOnScopeDispose(stopWatch); + } + tryOnScopeDispose(pause); + return { + isActive, + pause, + resume + }; +} +function useInterval(interval = 1e3, options = {}) { + const { + controls: exposeControls = false, + immediate = true, + callback + } = options; + const counter = ref(0); + const update = () => counter.value += 1; + const reset = () => { + counter.value = 0; + }; + const controls = useIntervalFn( + callback ? () => { + update(); + callback(counter.value); + } : update, + interval, + { immediate } + ); + if (exposeControls) { + return { + counter, + reset, + ...controls + }; + } else { + return counter; + } +} +function useLastChanged(source, options = {}) { + var _a; + const ms = ref((_a = options.initialValue) != null ? _a : null); + watch( + source, + () => ms.value = timestamp(), + options + ); + return ms; +} +function useTimeoutFn(cb, interval, options = {}) { + const { + immediate = true + } = options; + const isPending = ref(false); + let timer = null; + function clear() { + if (timer) { + clearTimeout(timer); + timer = null; + } + } + function stop() { + isPending.value = false; + clear(); + } + function start(...args) { + clear(); + isPending.value = true; + timer = setTimeout(() => { + isPending.value = false; + timer = null; + cb(...args); + }, toValue(interval)); + } + if (immediate) { + isPending.value = true; + if (isClient) + start(); + } + tryOnScopeDispose(stop); + return { + isPending: readonly(isPending), + start, + stop + }; +} +function useTimeout(interval = 1e3, options = {}) { + const { + controls: exposeControls = false, + callback + } = options; + const controls = useTimeoutFn( + callback != null ? callback : noop, + interval, + options + ); + const ready = computed(() => !controls.isPending.value); + if (exposeControls) { + return { + ready, + ...controls + }; + } else { + return ready; + } +} +function useToNumber(value, options = {}) { + const { + method = "parseFloat", + radix, + nanToZero + } = options; + return computed(() => { + let resolved = toValue(value); + if (typeof resolved === "string") + resolved = Number[method](resolved, radix); + if (nanToZero && Number.isNaN(resolved)) + resolved = 0; + return resolved; + }); +} +function useToString(value) { + return computed(() => `${toValue(value)}`); +} +function useToggle(initialValue = false, options = {}) { + const { + truthyValue = true, + falsyValue = false + } = options; + const valueIsRef = isRef(initialValue); + const _value = ref(initialValue); + function toggle(value) { + if (arguments.length) { + _value.value = value; + return _value.value; + } else { + const truthy = toValue(truthyValue); + _value.value = _value.value === truthy ? toValue(falsyValue) : truthy; + return _value.value; + } + } + if (valueIsRef) + return toggle; + else + return [_value, toggle]; +} +function watchArray(source, cb, options) { + let oldList = (options == null ? void 0 : options.immediate) ? [] : [...source instanceof Function ? source() : Array.isArray(source) ? source : toValue(source)]; + return watch(source, (newList, _, onCleanup) => { + const oldListRemains = Array.from({ length: oldList.length }); + const added = []; + for (const obj of newList) { + let found = false; + for (let i = 0; i < oldList.length; i++) { + if (!oldListRemains[i] && obj === oldList[i]) { + oldListRemains[i] = true; + found = true; + break; + } + } + if (!found) + added.push(obj); + } + const removed = oldList.filter((_2, i) => !oldListRemains[i]); + cb(newList, oldList, added, removed, onCleanup); + oldList = [...newList]; + }, options); +} +function watchAtMost(source, cb, options) { + const { + count, + ...watchOptions + } = options; + const current = ref(0); + const stop = watchWithFilter( + source, + (...args) => { + current.value += 1; + if (current.value >= toValue(count)) + nextTick(() => stop()); + cb(...args); + }, + watchOptions + ); + return { count: current, stop }; +} +function watchDebounced(source, cb, options = {}) { + const { + debounce = 0, + maxWait = void 0, + ...watchOptions + } = options; + return watchWithFilter( + source, + cb, + { + ...watchOptions, + eventFilter: debounceFilter(debounce, { maxWait }) + } + ); +} +function watchDeep(source, cb, options) { + return watch( + source, + cb, + { + ...options, + deep: true + } + ); +} +function watchIgnorable(source, cb, options = {}) { + const { + eventFilter = bypassFilter, + ...watchOptions + } = options; + const filteredCb = createFilterWrapper( + eventFilter, + cb + ); + let ignoreUpdates; + let ignorePrevAsyncUpdates; + let stop; + if (watchOptions.flush === "sync") { + const ignore = ref(false); + ignorePrevAsyncUpdates = () => { + }; + ignoreUpdates = (updater) => { + ignore.value = true; + updater(); + ignore.value = false; + }; + stop = watch( + source, + (...args) => { + if (!ignore.value) + filteredCb(...args); + }, + watchOptions + ); + } else { + const disposables = []; + const ignoreCounter = ref(0); + const syncCounter = ref(0); + ignorePrevAsyncUpdates = () => { + ignoreCounter.value = syncCounter.value; + }; + disposables.push( + watch( + source, + () => { + syncCounter.value++; + }, + { ...watchOptions, flush: "sync" } + ) + ); + ignoreUpdates = (updater) => { + const syncCounterPrev = syncCounter.value; + updater(); + ignoreCounter.value += syncCounter.value - syncCounterPrev; + }; + disposables.push( + watch( + source, + (...args) => { + const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value; + ignoreCounter.value = 0; + syncCounter.value = 0; + if (ignore) + return; + filteredCb(...args); + }, + watchOptions + ) + ); + stop = () => { + disposables.forEach((fn) => fn()); + }; + } + return { stop, ignoreUpdates, ignorePrevAsyncUpdates }; +} +function watchImmediate(source, cb, options) { + return watch( + source, + cb, + { + ...options, + immediate: true + } + ); +} +function watchOnce(source, cb, options) { + const stop = watch(source, (...args) => { + nextTick(() => stop()); + return cb(...args); + }, options); + return stop; +} +function watchThrottled(source, cb, options = {}) { + const { + throttle = 0, + trailing = true, + leading = true, + ...watchOptions + } = options; + return watchWithFilter( + source, + cb, + { + ...watchOptions, + eventFilter: throttleFilter(throttle, trailing, leading) + } + ); +} +function watchTriggerable(source, cb, options = {}) { + let cleanupFn; + function onEffect() { + if (!cleanupFn) + return; + const fn = cleanupFn; + cleanupFn = void 0; + fn(); + } + function onCleanup(callback) { + cleanupFn = callback; + } + const _cb = (value, oldValue) => { + onEffect(); + return cb(value, oldValue, onCleanup); + }; + const res = watchIgnorable(source, _cb, options); + const { ignoreUpdates } = res; + const trigger = () => { + let res2; + ignoreUpdates(() => { + res2 = _cb(getWatchSources(source), getOldValue(source)); + }); + return res2; + }; + return { + ...res, + trigger + }; +} +function getWatchSources(sources) { + if (isReactive(sources)) + return sources; + if (Array.isArray(sources)) + return sources.map((item) => toValue(item)); + return toValue(sources); +} +function getOldValue(source) { + return Array.isArray(source) ? source.map(() => void 0) : void 0; +} +function whenever(source, cb, options) { + const stop = watch( + source, + (v, ov, onInvalidate) => { + if (v) { + if (options == null ? void 0 : options.once) + nextTick(() => stop()); + cb(v, ov, onInvalidate); + } + }, + { + ...options, + once: false + } + ); + return stop; +} + +// node_modules/@vueuse/core/node_modules/vue-demi/lib/index.mjs +var isVue22 = false; +var isVue32 = true; +function set3(target, key, val) { + if (Array.isArray(target)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val; + } + target[key] = val; + return val; +} +function del(target, key) { + if (Array.isArray(target)) { + target.splice(key, 1); + return; + } + delete target[key]; +} + +// node_modules/@vueuse/core/index.mjs +function computedAsync(evaluationCallback, initialState, optionsOrRef) { + let options; + if (isRef(optionsOrRef)) { + options = { + evaluating: optionsOrRef + }; + } else { + options = optionsOrRef || {}; + } + const { + lazy = false, + evaluating = void 0, + shallow = true, + onError = noop + } = options; + const started = ref(!lazy); + const current = shallow ? shallowRef(initialState) : ref(initialState); + let counter = 0; + watchEffect(async (onInvalidate) => { + if (!started.value) + return; + counter++; + const counterAtBeginning = counter; + let hasFinished = false; + if (evaluating) { + Promise.resolve().then(() => { + evaluating.value = true; + }); + } + try { + const result = await evaluationCallback((cancelCallback) => { + onInvalidate(() => { + if (evaluating) + evaluating.value = false; + if (!hasFinished) + cancelCallback(); + }); + }); + if (counterAtBeginning === counter) + current.value = result; + } catch (e) { + onError(e); + } finally { + if (evaluating && counterAtBeginning === counter) + evaluating.value = false; + hasFinished = true; + } + }); + if (lazy) { + return computed(() => { + started.value = true; + return current.value; + }); + } else { + return current; + } +} +function computedInject(key, options, defaultSource, treatDefaultAsFactory) { + let source = inject(key); + if (defaultSource) + source = inject(key, defaultSource); + if (treatDefaultAsFactory) + source = inject(key, defaultSource, treatDefaultAsFactory); + if (typeof options === "function") { + return computed((ctx) => options(source, ctx)); + } else { + return computed({ + get: (ctx) => options.get(source, ctx), + set: options.set + }); + } +} +function createReusableTemplate(options = {}) { + if (!isVue32 && !version.startsWith("2.7.")) { + if (true) + throw new Error("[VueUse] createReusableTemplate only works in Vue 2.7 or above."); + return; + } + const { + inheritAttrs = true + } = options; + const render = shallowRef(); + const define = defineComponent({ + setup(_, { slots }) { + return () => { + render.value = slots.default; + }; + } + }); + const reuse = defineComponent({ + inheritAttrs, + setup(_, { attrs, slots }) { + return () => { + var _a; + if (!render.value && true) + throw new Error("[VueUse] Failed to find the definition of reusable template"); + const vnode = (_a = render.value) == null ? void 0 : _a.call(render, { ...keysToCamelKebabCase(attrs), $slots: slots }); + return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode; + }; + } + }); + return makeDestructurable( + { define, reuse }, + [define, reuse] + ); +} +function keysToCamelKebabCase(obj) { + const newObj = {}; + for (const key in obj) + newObj[camelize(key)] = obj[key]; + return newObj; +} +function createTemplatePromise(options = {}) { + if (!isVue32) { + if (true) + throw new Error("[VueUse] createTemplatePromise only works in Vue 3 or above."); + return; + } + let index = 0; + const instances = ref([]); + function create(...args) { + const props = shallowReactive({ + key: index++, + args, + promise: void 0, + resolve: () => { + }, + reject: () => { + }, + isResolving: false, + options + }); + instances.value.push(props); + props.promise = new Promise((_resolve, _reject) => { + props.resolve = (v) => { + props.isResolving = true; + return _resolve(v); + }; + props.reject = _reject; + }).finally(() => { + props.promise = void 0; + const index2 = instances.value.indexOf(props); + if (index2 !== -1) + instances.value.splice(index2, 1); + }); + return props.promise; + } + function start(...args) { + if (options.singleton && instances.value.length > 0) + return instances.value[0].promise; + return create(...args); + } + const component = defineComponent((_, { slots }) => { + const renderList = () => instances.value.map((props) => { + var _a; + return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props)); + }); + if (options.transition) + return () => h(TransitionGroup, options.transition, renderList); + return renderList; + }); + component.start = start; + return component; +} +function createUnrefFn(fn) { + return function(...args) { + return fn.apply(this, args.map((i) => toValue(i))); + }; +} +function unrefElement(elRef) { + var _a; + const plain = toValue(elRef); + return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain; +} +var defaultWindow = isClient ? window : void 0; +var defaultDocument = isClient ? window.document : void 0; +var defaultNavigator = isClient ? window.navigator : void 0; +var defaultLocation = isClient ? window.location : void 0; +function useEventListener(...args) { + let target; + let events2; + let listeners; + let options; + if (typeof args[0] === "string" || Array.isArray(args[0])) { + [events2, listeners, options] = args; + target = defaultWindow; + } else { + [target, events2, listeners, options] = args; + } + if (!target) + return noop; + if (!Array.isArray(events2)) + events2 = [events2]; + if (!Array.isArray(listeners)) + listeners = [listeners]; + const cleanups = []; + const cleanup = () => { + cleanups.forEach((fn) => fn()); + cleanups.length = 0; + }; + const register = (el, event, listener, options2) => { + el.addEventListener(event, listener, options2); + return () => el.removeEventListener(event, listener, options2); + }; + const stopWatch = watch( + () => [unrefElement(target), toValue(options)], + ([el, options2]) => { + cleanup(); + if (!el) + return; + const optionsClone = isObject(options2) ? { ...options2 } : options2; + cleanups.push( + ...events2.flatMap((event) => { + return listeners.map((listener) => register(el, event, listener, optionsClone)); + }) + ); + }, + { immediate: true, flush: "post" } + ); + const stop = () => { + stopWatch(); + cleanup(); + }; + tryOnScopeDispose(stop); + return stop; +} +var _iOSWorkaround = false; +function onClickOutside(target, handler, options = {}) { + const { window: window2 = defaultWindow, ignore = [], capture = true, detectIframe = false } = options; + if (!window2) + return noop; + if (isIOS && !_iOSWorkaround) { + _iOSWorkaround = true; + Array.from(window2.document.body.children).forEach((el) => el.addEventListener("click", noop)); + window2.document.documentElement.addEventListener("click", noop); + } + let shouldListen = true; + const shouldIgnore = (event) => { + return ignore.some((target2) => { + if (typeof target2 === "string") { + return Array.from(window2.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el)); + } else { + const el = unrefElement(target2); + return el && (event.target === el || event.composedPath().includes(el)); + } + }); + }; + const listener = (event) => { + const el = unrefElement(target); + if (!el || el === event.target || event.composedPath().includes(el)) + return; + if (event.detail === 0) + shouldListen = !shouldIgnore(event); + if (!shouldListen) { + shouldListen = true; + return; + } + handler(event); + }; + const cleanup = [ + useEventListener(window2, "click", listener, { passive: true, capture }), + useEventListener(window2, "pointerdown", (e) => { + const el = unrefElement(target); + shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el)); + }, { passive: true }), + detectIframe && useEventListener(window2, "blur", (event) => { + setTimeout(() => { + var _a; + const el = unrefElement(target); + if (((_a = window2.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window2.document.activeElement))) { + handler(event); + } + }, 0); + }) + ].filter(Boolean); + const stop = () => cleanup.forEach((fn) => fn()); + return stop; +} +function createKeyPredicate(keyFilter) { + if (typeof keyFilter === "function") + return keyFilter; + else if (typeof keyFilter === "string") + return (event) => event.key === keyFilter; + else if (Array.isArray(keyFilter)) + return (event) => keyFilter.includes(event.key); + return () => true; +} +function onKeyStroke(...args) { + let key; + let handler; + let options = {}; + if (args.length === 3) { + key = args[0]; + handler = args[1]; + options = args[2]; + } else if (args.length === 2) { + if (typeof args[1] === "object") { + key = true; + handler = args[0]; + options = args[1]; + } else { + key = args[0]; + handler = args[1]; + } + } else { + key = true; + handler = args[0]; + } + const { + target = defaultWindow, + eventName = "keydown", + passive = false, + dedupe = false + } = options; + const predicate = createKeyPredicate(key); + const listener = (e) => { + if (e.repeat && toValue(dedupe)) + return; + if (predicate(e)) + handler(e); + }; + return useEventListener(target, eventName, listener, passive); +} +function onKeyDown(key, handler, options = {}) { + return onKeyStroke(key, handler, { ...options, eventName: "keydown" }); +} +function onKeyPressed(key, handler, options = {}) { + return onKeyStroke(key, handler, { ...options, eventName: "keypress" }); +} +function onKeyUp(key, handler, options = {}) { + return onKeyStroke(key, handler, { ...options, eventName: "keyup" }); +} +var DEFAULT_DELAY = 500; +var DEFAULT_THRESHOLD = 10; +function onLongPress(target, handler, options) { + var _a, _b; + const elementRef = computed(() => unrefElement(target)); + let timeout; + let posStart; + let startTimestamp; + let hasLongPressed = false; + function clear() { + if (timeout) { + clearTimeout(timeout); + timeout = void 0; + } + posStart = void 0; + startTimestamp = void 0; + hasLongPressed = false; + } + function onRelease(ev) { + var _a2, _b2, _c; + const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed]; + clear(); + if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp) + return; + if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) + return; + if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) + ev.preventDefault(); + if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) + ev.stopPropagation(); + const dx = ev.x - _posStart.x; + const dy = ev.y - _posStart.y; + const distance = Math.sqrt(dx * dx + dy * dy); + options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed); + } + function onDown(ev) { + var _a2, _b2, _c, _d; + if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) + return; + clear(); + if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) + ev.preventDefault(); + if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) + ev.stopPropagation(); + posStart = { + x: ev.x, + y: ev.y + }; + startTimestamp = ev.timeStamp; + timeout = setTimeout( + () => { + hasLongPressed = true; + handler(ev); + }, + (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY + ); + } + function onMove(ev) { + var _a2, _b2, _c, _d; + if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) + return; + if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false) + return; + if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) + ev.preventDefault(); + if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) + ev.stopPropagation(); + const dx = ev.x - posStart.x; + const dy = ev.y - posStart.y; + const distance = Math.sqrt(dx * dx + dy * dy); + if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD)) + clear(); + } + const listenerOptions = { + capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture, + once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once + }; + const cleanup = [ + useEventListener(elementRef, "pointerdown", onDown, listenerOptions), + useEventListener(elementRef, "pointermove", onMove, listenerOptions), + useEventListener(elementRef, ["pointerup", "pointerleave"], onRelease, listenerOptions) + ]; + const stop = () => cleanup.forEach((fn) => fn()); + return stop; +} +function isFocusedElementEditable() { + const { activeElement, body } = document; + if (!activeElement) + return false; + if (activeElement === body) + return false; + switch (activeElement.tagName) { + case "INPUT": + case "TEXTAREA": + return true; + } + return activeElement.hasAttribute("contenteditable"); +} +function isTypedCharValid({ + keyCode, + metaKey, + ctrlKey, + altKey +}) { + if (metaKey || ctrlKey || altKey) + return false; + if (keyCode >= 48 && keyCode <= 57) + return true; + if (keyCode >= 65 && keyCode <= 90) + return true; + if (keyCode >= 97 && keyCode <= 122) + return true; + return false; +} +function onStartTyping(callback, options = {}) { + const { document: document2 = defaultDocument } = options; + const keydown = (event) => { + !isFocusedElementEditable() && isTypedCharValid(event) && callback(event); + }; + if (document2) + useEventListener(document2, "keydown", keydown, { passive: true }); +} +function templateRef(key, initialValue = null) { + const instance = getCurrentInstance(); + let _trigger = () => { + }; + const element = customRef((track, trigger) => { + _trigger = trigger; + return { + get() { + var _a, _b; + track(); + return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue; + }, + set() { + } + }; + }); + tryOnMounted(_trigger); + onUpdated(_trigger); + return element; +} +function useMounted() { + const isMounted = ref(false); + const instance = getCurrentInstance(); + if (instance) { + onMounted(() => { + isMounted.value = true; + }, isVue22 ? void 0 : instance); + } + return isMounted; +} +function useSupported(callback) { + const isMounted = useMounted(); + return computed(() => { + isMounted.value; + return Boolean(callback()); + }); +} +function useMutationObserver(target, callback, options = {}) { + const { window: window2 = defaultWindow, ...mutationOptions } = options; + let observer; + const isSupported = useSupported(() => window2 && "MutationObserver" in window2); + const cleanup = () => { + if (observer) { + observer.disconnect(); + observer = void 0; + } + }; + const targets = computed(() => { + const value = toValue(target); + const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish); + return new Set(items); + }); + const stopWatch = watch( + () => targets.value, + (targets2) => { + cleanup(); + if (isSupported.value && targets2.size) { + observer = new MutationObserver(callback); + targets2.forEach((el) => observer.observe(el, mutationOptions)); + } + }, + { immediate: true, flush: "post" } + ); + const takeRecords = () => { + return observer == null ? void 0 : observer.takeRecords(); + }; + const stop = () => { + cleanup(); + stopWatch(); + }; + tryOnScopeDispose(stop); + return { + isSupported, + stop, + takeRecords + }; +} +function useActiveElement(options = {}) { + var _a; + const { + window: window2 = defaultWindow, + deep = true, + triggerOnRemoval = false + } = options; + const document2 = (_a = options.document) != null ? _a : window2 == null ? void 0 : window2.document; + const getDeepActiveElement = () => { + var _a2; + let element = document2 == null ? void 0 : document2.activeElement; + if (deep) { + while (element == null ? void 0 : element.shadowRoot) + element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement; + } + return element; + }; + const activeElement = ref(); + const trigger = () => { + activeElement.value = getDeepActiveElement(); + }; + if (window2) { + useEventListener(window2, "blur", (event) => { + if (event.relatedTarget !== null) + return; + trigger(); + }, true); + useEventListener(window2, "focus", trigger, true); + } + if (triggerOnRemoval) { + useMutationObserver(document2, (mutations) => { + mutations.filter((m) => m.removedNodes.length).map((n) => Array.from(n.removedNodes)).flat().forEach((node) => { + if (node === activeElement.value) + trigger(); + }); + }, { + childList: true, + subtree: true + }); + } + trigger(); + return activeElement; +} +function useRafFn(fn, options = {}) { + const { + immediate = true, + fpsLimit = void 0, + window: window2 = defaultWindow + } = options; + const isActive = ref(false); + const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null; + let previousFrameTimestamp = 0; + let rafId = null; + function loop(timestamp2) { + if (!isActive.value || !window2) + return; + if (!previousFrameTimestamp) + previousFrameTimestamp = timestamp2; + const delta = timestamp2 - previousFrameTimestamp; + if (intervalLimit && delta < intervalLimit) { + rafId = window2.requestAnimationFrame(loop); + return; + } + previousFrameTimestamp = timestamp2; + fn({ delta, timestamp: timestamp2 }); + rafId = window2.requestAnimationFrame(loop); + } + function resume() { + if (!isActive.value && window2) { + isActive.value = true; + previousFrameTimestamp = 0; + rafId = window2.requestAnimationFrame(loop); + } + } + function pause() { + isActive.value = false; + if (rafId != null && window2) { + window2.cancelAnimationFrame(rafId); + rafId = null; + } + } + if (immediate) + resume(); + tryOnScopeDispose(pause); + return { + isActive: readonly(isActive), + pause, + resume + }; +} +function useAnimate(target, keyframes, options) { + let config; + let animateOptions; + if (isObject(options)) { + config = options; + animateOptions = objectOmit(options, ["window", "immediate", "commitStyles", "persist", "onReady", "onError"]); + } else { + config = { duration: options }; + animateOptions = options; + } + const { + window: window2 = defaultWindow, + immediate = true, + commitStyles, + persist, + playbackRate: _playbackRate = 1, + onReady, + onError = (e) => { + console.error(e); + } + } = config; + const isSupported = useSupported(() => window2 && HTMLElement && "animate" in HTMLElement.prototype); + const animate = shallowRef(void 0); + const store = shallowReactive({ + startTime: null, + currentTime: null, + timeline: null, + playbackRate: _playbackRate, + pending: false, + playState: immediate ? "idle" : "paused", + replaceState: "active" + }); + const pending = computed(() => store.pending); + const playState = computed(() => store.playState); + const replaceState = computed(() => store.replaceState); + const startTime = computed({ + get() { + return store.startTime; + }, + set(value) { + store.startTime = value; + if (animate.value) + animate.value.startTime = value; + } + }); + const currentTime = computed({ + get() { + return store.currentTime; + }, + set(value) { + store.currentTime = value; + if (animate.value) { + animate.value.currentTime = value; + syncResume(); + } + } + }); + const timeline = computed({ + get() { + return store.timeline; + }, + set(value) { + store.timeline = value; + if (animate.value) + animate.value.timeline = value; + } + }); + const playbackRate = computed({ + get() { + return store.playbackRate; + }, + set(value) { + store.playbackRate = value; + if (animate.value) + animate.value.playbackRate = value; + } + }); + const play = () => { + if (animate.value) { + try { + animate.value.play(); + syncResume(); + } catch (e) { + syncPause(); + onError(e); + } + } else { + update(); + } + }; + const pause = () => { + var _a; + try { + (_a = animate.value) == null ? void 0 : _a.pause(); + syncPause(); + } catch (e) { + onError(e); + } + }; + const reverse = () => { + var _a; + !animate.value && update(); + try { + (_a = animate.value) == null ? void 0 : _a.reverse(); + syncResume(); + } catch (e) { + syncPause(); + onError(e); + } + }; + const finish = () => { + var _a; + try { + (_a = animate.value) == null ? void 0 : _a.finish(); + syncPause(); + } catch (e) { + onError(e); + } + }; + const cancel = () => { + var _a; + try { + (_a = animate.value) == null ? void 0 : _a.cancel(); + syncPause(); + } catch (e) { + onError(e); + } + }; + watch(() => unrefElement(target), (el) => { + el && update(); + }); + watch(() => keyframes, (value) => { + !animate.value && update(); + if (!unrefElement(target) && animate.value) { + animate.value.effect = new KeyframeEffect( + unrefElement(target), + toValue(value), + animateOptions + ); + } + }, { deep: true }); + tryOnMounted(() => { + nextTick(() => update(true)); + }); + tryOnScopeDispose(cancel); + function update(init) { + const el = unrefElement(target); + if (!isSupported.value || !el) + return; + if (!animate.value) + animate.value = el.animate(toValue(keyframes), animateOptions); + if (persist) + animate.value.persist(); + if (_playbackRate !== 1) + animate.value.playbackRate = _playbackRate; + if (init && !immediate) + animate.value.pause(); + else + syncResume(); + onReady == null ? void 0 : onReady(animate.value); + } + useEventListener(animate, ["cancel", "finish", "remove"], syncPause); + useEventListener(animate, "finish", () => { + var _a; + if (commitStyles) + (_a = animate.value) == null ? void 0 : _a.commitStyles(); + }); + const { resume: resumeRef, pause: pauseRef } = useRafFn(() => { + if (!animate.value) + return; + store.pending = animate.value.pending; + store.playState = animate.value.playState; + store.replaceState = animate.value.replaceState; + store.startTime = animate.value.startTime; + store.currentTime = animate.value.currentTime; + store.timeline = animate.value.timeline; + store.playbackRate = animate.value.playbackRate; + }, { immediate: false }); + function syncResume() { + if (isSupported.value) + resumeRef(); + } + function syncPause() { + if (isSupported.value && window2) + window2.requestAnimationFrame(pauseRef); + } + return { + isSupported, + animate, + // actions + play, + pause, + reverse, + finish, + cancel, + // state + pending, + playState, + replaceState, + startTime, + currentTime, + timeline, + playbackRate + }; +} +function useAsyncQueue(tasks, options) { + const { + interrupt = true, + onError = noop, + onFinished = noop, + signal + } = options || {}; + const promiseState = { + aborted: "aborted", + fulfilled: "fulfilled", + pending: "pending", + rejected: "rejected" + }; + const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null })); + const result = reactive(initialResult); + const activeIndex = ref(-1); + if (!tasks || tasks.length === 0) { + onFinished(); + return { + activeIndex, + result + }; + } + function updateResult(state, res) { + activeIndex.value++; + result[activeIndex.value].data = res; + result[activeIndex.value].state = state; + } + tasks.reduce((prev, curr) => { + return prev.then((prevRes) => { + var _a; + if (signal == null ? void 0 : signal.aborted) { + updateResult(promiseState.aborted, new Error("aborted")); + return; + } + if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) { + onFinished(); + return; + } + const done = curr(prevRes).then((currentRes) => { + updateResult(promiseState.fulfilled, currentRes); + activeIndex.value === tasks.length - 1 && onFinished(); + return currentRes; + }); + if (!signal) + return done; + return Promise.race([done, whenAborted(signal)]); + }).catch((e) => { + if (signal == null ? void 0 : signal.aborted) { + updateResult(promiseState.aborted, e); + return e; + } + updateResult(promiseState.rejected, e); + onError(); + return e; + }); + }, Promise.resolve()); + return { + activeIndex, + result + }; +} +function whenAborted(signal) { + return new Promise((resolve, reject) => { + const error = new Error("aborted"); + if (signal.aborted) + reject(error); + else + signal.addEventListener("abort", () => reject(error), { once: true }); + }); +} +function useAsyncState(promise, initialState, options) { + const { + immediate = true, + delay = 0, + onError = noop, + onSuccess = noop, + resetOnExecute = true, + shallow = true, + throwError + } = options != null ? options : {}; + const state = shallow ? shallowRef(initialState) : ref(initialState); + const isReady = ref(false); + const isLoading = ref(false); + const error = shallowRef(void 0); + async function execute(delay2 = 0, ...args) { + if (resetOnExecute) + state.value = initialState; + error.value = void 0; + isReady.value = false; + isLoading.value = true; + if (delay2 > 0) + await promiseTimeout(delay2); + const _promise = typeof promise === "function" ? promise(...args) : promise; + try { + const data = await _promise; + state.value = data; + isReady.value = true; + onSuccess(data); + } catch (e) { + error.value = e; + onError(e); + if (throwError) + throw e; + } finally { + isLoading.value = false; + } + return state.value; + } + if (immediate) + execute(delay); + const shell = { + state, + isReady, + isLoading, + error, + execute + }; + function waitUntilIsLoaded() { + return new Promise((resolve, reject) => { + until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject); + }); + } + return { + ...shell, + then(onFulfilled, onRejected) { + return waitUntilIsLoaded().then(onFulfilled, onRejected); + } + }; +} +var defaults = { + array: (v) => JSON.stringify(v), + object: (v) => JSON.stringify(v), + set: (v) => JSON.stringify(Array.from(v)), + map: (v) => JSON.stringify(Object.fromEntries(v)), + null: () => "" +}; +function getDefaultSerialization(target) { + if (!target) + return defaults.null; + if (target instanceof Map) + return defaults.map; + else if (target instanceof Set) + return defaults.set; + else if (Array.isArray(target)) + return defaults.array; + else + return defaults.object; +} +function useBase64(target, options) { + const base64 = ref(""); + const promise = ref(); + function execute() { + if (!isClient) + return; + promise.value = new Promise((resolve, reject) => { + try { + const _target = toValue(target); + if (_target == null) { + resolve(""); + } else if (typeof _target === "string") { + resolve(blobToBase64(new Blob([_target], { type: "text/plain" }))); + } else if (_target instanceof Blob) { + resolve(blobToBase64(_target)); + } else if (_target instanceof ArrayBuffer) { + resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target)))); + } else if (_target instanceof HTMLCanvasElement) { + resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality)); + } else if (_target instanceof HTMLImageElement) { + const img = _target.cloneNode(false); + img.crossOrigin = "Anonymous"; + imgLoaded(img).then(() => { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + canvas.width = img.width; + canvas.height = img.height; + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality)); + }).catch(reject); + } else if (typeof _target === "object") { + const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target); + const serialized = _serializeFn(_target); + return resolve(blobToBase64(new Blob([serialized], { type: "application/json" }))); + } else { + reject(new Error("target is unsupported types")); + } + } catch (error) { + reject(error); + } + }); + promise.value.then((res) => base64.value = res); + return promise.value; + } + if (isRef(target) || typeof target === "function") + watch(target, execute, { immediate: true }); + else + execute(); + return { + base64, + promise, + execute + }; +} +function imgLoaded(img) { + return new Promise((resolve, reject) => { + if (!img.complete) { + img.onload = () => { + resolve(); + }; + img.onerror = reject; + } else { + resolve(); + } + }); +} +function blobToBase64(blob) { + return new Promise((resolve, reject) => { + const fr = new FileReader(); + fr.onload = (e) => { + resolve(e.target.result); + }; + fr.onerror = reject; + fr.readAsDataURL(blob); + }); +} +function useBattery(options = {}) { + const { navigator = defaultNavigator } = options; + const events2 = ["chargingchange", "chargingtimechange", "dischargingtimechange", "levelchange"]; + const isSupported = useSupported(() => navigator && "getBattery" in navigator && typeof navigator.getBattery === "function"); + const charging = ref(false); + const chargingTime = ref(0); + const dischargingTime = ref(0); + const level = ref(1); + let battery; + function updateBatteryInfo() { + charging.value = this.charging; + chargingTime.value = this.chargingTime || 0; + dischargingTime.value = this.dischargingTime || 0; + level.value = this.level; + } + if (isSupported.value) { + navigator.getBattery().then((_battery) => { + battery = _battery; + updateBatteryInfo.call(battery); + useEventListener(battery, events2, updateBatteryInfo, { passive: true }); + }); + } + return { + isSupported, + charging, + chargingTime, + dischargingTime, + level + }; +} +function useBluetooth(options) { + let { + acceptAllDevices = false + } = options || {}; + const { + filters = void 0, + optionalServices = void 0, + navigator = defaultNavigator + } = options || {}; + const isSupported = useSupported(() => navigator && "bluetooth" in navigator); + const device = shallowRef(void 0); + const error = shallowRef(null); + watch(device, () => { + connectToBluetoothGATTServer(); + }); + async function requestDevice() { + if (!isSupported.value) + return; + error.value = null; + if (filters && filters.length > 0) + acceptAllDevices = false; + try { + device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({ + acceptAllDevices, + filters, + optionalServices + })); + } catch (err) { + error.value = err; + } + } + const server = ref(); + const isConnected = computed(() => { + var _a; + return ((_a = server.value) == null ? void 0 : _a.connected) || false; + }); + async function connectToBluetoothGATTServer() { + error.value = null; + if (device.value && device.value.gatt) { + device.value.addEventListener("gattserverdisconnected", () => { + }); + try { + server.value = await device.value.gatt.connect(); + } catch (err) { + error.value = err; + } + } + } + tryOnMounted(() => { + var _a; + if (device.value) + (_a = device.value.gatt) == null ? void 0 : _a.connect(); + }); + tryOnScopeDispose(() => { + var _a; + if (device.value) + (_a = device.value.gatt) == null ? void 0 : _a.disconnect(); + }); + return { + isSupported, + isConnected, + // Device: + device, + requestDevice, + // Server: + server, + // Errors: + error + }; +} +function useMediaQuery(query, options = {}) { + const { window: window2 = defaultWindow } = options; + const isSupported = useSupported(() => window2 && "matchMedia" in window2 && typeof window2.matchMedia === "function"); + let mediaQuery; + const matches = ref(false); + const handler = (event) => { + matches.value = event.matches; + }; + const cleanup = () => { + if (!mediaQuery) + return; + if ("removeEventListener" in mediaQuery) + mediaQuery.removeEventListener("change", handler); + else + mediaQuery.removeListener(handler); + }; + const stopWatch = watchEffect(() => { + if (!isSupported.value) + return; + cleanup(); + mediaQuery = window2.matchMedia(toValue(query)); + if ("addEventListener" in mediaQuery) + mediaQuery.addEventListener("change", handler); + else + mediaQuery.addListener(handler); + matches.value = mediaQuery.matches; + }); + tryOnScopeDispose(() => { + stopWatch(); + cleanup(); + mediaQuery = void 0; + }); + return matches; +} +var breakpointsTailwind = { + "sm": 640, + "md": 768, + "lg": 1024, + "xl": 1280, + "2xl": 1536 +}; +var breakpointsBootstrapV5 = { + xs: 0, + sm: 576, + md: 768, + lg: 992, + xl: 1200, + xxl: 1400 +}; +var breakpointsVuetifyV2 = { + xs: 0, + sm: 600, + md: 960, + lg: 1264, + xl: 1904 +}; +var breakpointsVuetifyV3 = { + xs: 0, + sm: 600, + md: 960, + lg: 1280, + xl: 1920, + xxl: 2560 +}; +var breakpointsVuetify = breakpointsVuetifyV2; +var breakpointsAntDesign = { + xs: 480, + sm: 576, + md: 768, + lg: 992, + xl: 1200, + xxl: 1600 +}; +var breakpointsQuasar = { + xs: 0, + sm: 600, + md: 1024, + lg: 1440, + xl: 1920 +}; +var breakpointsSematic = { + mobileS: 320, + mobileM: 375, + mobileL: 425, + tablet: 768, + laptop: 1024, + laptopL: 1440, + desktop4K: 2560 +}; +var breakpointsMasterCss = { + "3xs": 360, + "2xs": 480, + "xs": 600, + "sm": 768, + "md": 1024, + "lg": 1280, + "xl": 1440, + "2xl": 1600, + "3xl": 1920, + "4xl": 2560 +}; +var breakpointsPrimeFlex = { + sm: 576, + md: 768, + lg: 992, + xl: 1200 +}; +function useBreakpoints(breakpoints, options = {}) { + function getValue2(k, delta) { + let v = toValue(breakpoints[toValue(k)]); + if (delta != null) + v = increaseWithUnit(v, delta); + if (typeof v === "number") + v = `${v}px`; + return v; + } + const { window: window2 = defaultWindow, strategy = "min-width" } = options; + function match(query) { + if (!window2) + return false; + return window2.matchMedia(query).matches; + } + const greaterOrEqual = (k) => { + return useMediaQuery(() => `(min-width: ${getValue2(k)})`, options); + }; + const smallerOrEqual = (k) => { + return useMediaQuery(() => `(max-width: ${getValue2(k)})`, options); + }; + const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => { + Object.defineProperty(shortcuts, k, { + get: () => strategy === "min-width" ? greaterOrEqual(k) : smallerOrEqual(k), + enumerable: true, + configurable: true + }); + return shortcuts; + }, {}); + function current() { + const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]); + return computed(() => points.filter(([, v]) => v.value).map(([k]) => k)); + } + return Object.assign(shortcutMethods, { + greaterOrEqual, + smallerOrEqual, + greater(k) { + return useMediaQuery(() => `(min-width: ${getValue2(k, 0.1)})`, options); + }, + smaller(k) { + return useMediaQuery(() => `(max-width: ${getValue2(k, -0.1)})`, options); + }, + between(a, b) { + return useMediaQuery(() => `(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`, options); + }, + isGreater(k) { + return match(`(min-width: ${getValue2(k, 0.1)})`); + }, + isGreaterOrEqual(k) { + return match(`(min-width: ${getValue2(k)})`); + }, + isSmaller(k) { + return match(`(max-width: ${getValue2(k, -0.1)})`); + }, + isSmallerOrEqual(k) { + return match(`(max-width: ${getValue2(k)})`); + }, + isInBetween(a, b) { + return match(`(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`); + }, + current, + active() { + const bps = current(); + return computed(() => bps.value.length === 0 ? "" : bps.value.at(-1)); + } + }); +} +function useBroadcastChannel(options) { + const { + name, + window: window2 = defaultWindow + } = options; + const isSupported = useSupported(() => window2 && "BroadcastChannel" in window2); + const isClosed = ref(false); + const channel = ref(); + const data = ref(); + const error = shallowRef(null); + const post = (data2) => { + if (channel.value) + channel.value.postMessage(data2); + }; + const close = () => { + if (channel.value) + channel.value.close(); + isClosed.value = true; + }; + if (isSupported.value) { + tryOnMounted(() => { + error.value = null; + channel.value = new BroadcastChannel(name); + channel.value.addEventListener("message", (e) => { + data.value = e.data; + }, { passive: true }); + channel.value.addEventListener("messageerror", (e) => { + error.value = e; + }, { passive: true }); + channel.value.addEventListener("close", () => { + isClosed.value = true; + }); + }); + } + tryOnScopeDispose(() => { + close(); + }); + return { + isSupported, + channel, + data, + post, + close, + error, + isClosed + }; +} +var WRITABLE_PROPERTIES = [ + "hash", + "host", + "hostname", + "href", + "pathname", + "port", + "protocol", + "search" +]; +function useBrowserLocation(options = {}) { + const { window: window2 = defaultWindow } = options; + const refs = Object.fromEntries( + WRITABLE_PROPERTIES.map((key) => [key, ref()]) + ); + for (const [key, ref2] of objectEntries(refs)) { + watch(ref2, (value) => { + if (!(window2 == null ? void 0 : window2.location) || window2.location[key] === value) + return; + window2.location[key] = value; + }); + } + const buildState = (trigger) => { + var _a; + const { state: state2, length } = (window2 == null ? void 0 : window2.history) || {}; + const { origin } = (window2 == null ? void 0 : window2.location) || {}; + for (const key of WRITABLE_PROPERTIES) + refs[key].value = (_a = window2 == null ? void 0 : window2.location) == null ? void 0 : _a[key]; + return reactive({ + trigger, + state: state2, + length, + origin, + ...refs + }); + }; + const state = ref(buildState("load")); + if (window2) { + useEventListener(window2, "popstate", () => state.value = buildState("popstate"), { passive: true }); + useEventListener(window2, "hashchange", () => state.value = buildState("hashchange"), { passive: true }); + } + return state; +} +function useCached(refValue, comparator = (a, b) => a === b, watchOptions) { + const cachedValue = ref(refValue.value); + watch(() => refValue.value, (value) => { + if (!comparator(value, cachedValue.value)) + cachedValue.value = value; + }, watchOptions); + return cachedValue; +} +function usePermission(permissionDesc, options = {}) { + const { + controls = false, + navigator = defaultNavigator + } = options; + const isSupported = useSupported(() => navigator && "permissions" in navigator); + let permissionStatus; + const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc; + const state = ref(); + const onChange = () => { + if (permissionStatus) + state.value = permissionStatus.state; + }; + const query = createSingletonPromise(async () => { + if (!isSupported.value) + return; + if (!permissionStatus) { + try { + permissionStatus = await navigator.permissions.query(desc); + useEventListener(permissionStatus, "change", onChange); + onChange(); + } catch (e) { + state.value = "prompt"; + } + } + return permissionStatus; + }); + query(); + if (controls) { + return { + state, + isSupported, + query + }; + } else { + return state; + } +} +function useClipboard(options = {}) { + const { + navigator = defaultNavigator, + read = false, + source, + copiedDuring = 1500, + legacy = false + } = options; + const isClipboardApiSupported = useSupported(() => navigator && "clipboard" in navigator); + const permissionRead = usePermission("clipboard-read"); + const permissionWrite = usePermission("clipboard-write"); + const isSupported = computed(() => isClipboardApiSupported.value || legacy); + const text = ref(""); + const copied = ref(false); + const timeout = useTimeoutFn(() => copied.value = false, copiedDuring); + function updateText() { + if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) { + navigator.clipboard.readText().then((value) => { + text.value = value; + }); + } else { + text.value = legacyRead(); + } + } + if (isSupported.value && read) + useEventListener(["copy", "cut"], updateText); + async function copy(value = toValue(source)) { + if (isSupported.value && value != null) { + if (isClipboardApiSupported.value && isAllowed(permissionWrite.value)) + await navigator.clipboard.writeText(value); + else + legacyCopy(value); + text.value = value; + copied.value = true; + timeout.start(); + } + } + function legacyCopy(value) { + const ta = document.createElement("textarea"); + ta.value = value != null ? value : ""; + ta.style.position = "absolute"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + document.execCommand("copy"); + ta.remove(); + } + function legacyRead() { + var _a, _b, _c; + return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : ""; + } + function isAllowed(status) { + return status === "granted" || status === "prompt"; + } + return { + isSupported, + text, + copied, + copy + }; +} +function useClipboardItems(options = {}) { + const { + navigator = defaultNavigator, + read = false, + source, + copiedDuring = 1500 + } = options; + const isSupported = useSupported(() => navigator && "clipboard" in navigator); + const content = ref([]); + const copied = ref(false); + const timeout = useTimeoutFn(() => copied.value = false, copiedDuring); + function updateContent() { + if (isSupported.value) { + navigator.clipboard.read().then((items) => { + content.value = items; + }); + } + } + if (isSupported.value && read) + useEventListener(["copy", "cut"], updateContent); + async function copy(value = toValue(source)) { + if (isSupported.value && value != null) { + await navigator.clipboard.write(value); + content.value = value; + copied.value = true; + timeout.start(); + } + } + return { + isSupported, + content, + copied, + copy + }; +} +function cloneFnJSON(source) { + return JSON.parse(JSON.stringify(source)); +} +function useCloned(source, options = {}) { + const cloned = ref({}); + const { + manual, + clone = cloneFnJSON, + // watch options + deep = true, + immediate = true + } = options; + function sync() { + cloned.value = clone(toValue(source)); + } + if (!manual && (isRef(source) || typeof source === "function")) { + watch(source, sync, { + ...options, + deep, + immediate + }); + } else { + sync(); + } + return { cloned, sync }; +} +var _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; +var globalKey = "__vueuse_ssr_handlers__"; +var handlers = getHandlers(); +function getHandlers() { + if (!(globalKey in _global)) + _global[globalKey] = _global[globalKey] || {}; + return _global[globalKey]; +} +function getSSRHandler(key, fallback) { + return handlers[key] || fallback; +} +function setSSRHandler(key, fn) { + handlers[key] = fn; +} +function guessSerializerType(rawInit) { + return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any"; +} +var StorageSerializers = { + boolean: { + read: (v) => v === "true", + write: (v) => String(v) + }, + object: { + read: (v) => JSON.parse(v), + write: (v) => JSON.stringify(v) + }, + number: { + read: (v) => Number.parseFloat(v), + write: (v) => String(v) + }, + any: { + read: (v) => v, + write: (v) => String(v) + }, + string: { + read: (v) => v, + write: (v) => String(v) + }, + map: { + read: (v) => new Map(JSON.parse(v)), + write: (v) => JSON.stringify(Array.from(v.entries())) + }, + set: { + read: (v) => new Set(JSON.parse(v)), + write: (v) => JSON.stringify(Array.from(v)) + }, + date: { + read: (v) => new Date(v), + write: (v) => v.toISOString() + } +}; +var customStorageEventName = "vueuse-storage"; +function useStorage(key, defaults2, storage, options = {}) { + var _a; + const { + flush = "pre", + deep = true, + listenToStorageChanges = true, + writeDefaults = true, + mergeDefaults = false, + shallow, + window: window2 = defaultWindow, + eventFilter, + onError = (e) => { + console.error(e); + }, + initOnMounted + } = options; + const data = (shallow ? shallowRef : ref)(typeof defaults2 === "function" ? defaults2() : defaults2); + if (!storage) { + try { + storage = getSSRHandler("getDefaultStorage", () => { + var _a2; + return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; + })(); + } catch (e) { + onError(e); + } + } + if (!storage) + return data; + const rawInit = toValue(defaults2); + const type = guessSerializerType(rawInit); + const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; + const { pause: pauseWatch, resume: resumeWatch } = watchPausable( + data, + () => write(data.value), + { flush, deep, eventFilter } + ); + if (window2 && listenToStorageChanges) { + tryOnMounted(() => { + useEventListener(window2, "storage", update); + useEventListener(window2, customStorageEventName, updateFromCustomEvent); + if (initOnMounted) + update(); + }); + } + if (!initOnMounted) + update(); + function dispatchWriteEvent(oldValue, newValue) { + if (window2) { + window2.dispatchEvent(new CustomEvent(customStorageEventName, { + detail: { + key, + oldValue, + newValue, + storageArea: storage + } + })); + } + } + function write(v) { + try { + const oldValue = storage.getItem(key); + if (v == null) { + dispatchWriteEvent(oldValue, null); + storage.removeItem(key); + } else { + const serialized = serializer.write(v); + if (oldValue !== serialized) { + storage.setItem(key, serialized); + dispatchWriteEvent(oldValue, serialized); + } + } + } catch (e) { + onError(e); + } + } + function read(event) { + const rawValue = event ? event.newValue : storage.getItem(key); + if (rawValue == null) { + if (writeDefaults && rawInit != null) + storage.setItem(key, serializer.write(rawInit)); + return rawInit; + } else if (!event && mergeDefaults) { + const value = serializer.read(rawValue); + if (typeof mergeDefaults === "function") + return mergeDefaults(value, rawInit); + else if (type === "object" && !Array.isArray(value)) + return { ...rawInit, ...value }; + return value; + } else if (typeof rawValue !== "string") { + return rawValue; + } else { + return serializer.read(rawValue); + } + } + function update(event) { + if (event && event.storageArea !== storage) + return; + if (event && event.key == null) { + data.value = rawInit; + return; + } + if (event && event.key !== key) + return; + pauseWatch(); + try { + if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value)) + data.value = read(event); + } catch (e) { + onError(e); + } finally { + if (event) + nextTick(resumeWatch); + else + resumeWatch(); + } + } + function updateFromCustomEvent(event) { + update(event.detail); + } + return data; +} +function usePreferredDark(options) { + return useMediaQuery("(prefers-color-scheme: dark)", options); +} +function useColorMode(options = {}) { + const { + selector = "html", + attribute = "class", + initialValue = "auto", + window: window2 = defaultWindow, + storage, + storageKey = "vueuse-color-scheme", + listenToStorageChanges = true, + storageRef, + emitAuto, + disableTransition = true + } = options; + const modes = { + auto: "", + light: "light", + dark: "dark", + ...options.modes || {} + }; + const preferredDark = usePreferredDark({ window: window2 }); + const system = computed(() => preferredDark.value ? "dark" : "light"); + const store = storageRef || (storageKey == null ? toRef2(initialValue) : useStorage(storageKey, initialValue, storage, { window: window2, listenToStorageChanges })); + const state = computed(() => store.value === "auto" ? system.value : store.value); + const updateHTMLAttrs = getSSRHandler( + "updateHTMLAttrs", + (selector2, attribute2, value) => { + const el = typeof selector2 === "string" ? window2 == null ? void 0 : window2.document.querySelector(selector2) : unrefElement(selector2); + if (!el) + return; + let style; + if (disableTransition) { + style = window2.document.createElement("style"); + const styleString = "*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}"; + style.appendChild(document.createTextNode(styleString)); + window2.document.head.appendChild(style); + } + if (attribute2 === "class") { + const current = value.split(/\s/g); + Object.values(modes).flatMap((i) => (i || "").split(/\s/g)).filter(Boolean).forEach((v) => { + if (current.includes(v)) + el.classList.add(v); + else + el.classList.remove(v); + }); + } else { + el.setAttribute(attribute2, value); + } + if (disableTransition) { + window2.getComputedStyle(style).opacity; + document.head.removeChild(style); + } + } + ); + function defaultOnChanged(mode) { + var _a; + updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode); + } + function onChanged(mode) { + if (options.onChanged) + options.onChanged(mode, defaultOnChanged); + else + defaultOnChanged(mode); + } + watch(state, onChanged, { flush: "post", immediate: true }); + tryOnMounted(() => onChanged(state.value)); + const auto = computed({ + get() { + return emitAuto ? store.value : state.value; + }, + set(v) { + store.value = v; + } + }); + try { + return Object.assign(auto, { store, system, state }); + } catch (e) { + return auto; + } +} +function useConfirmDialog(revealed = ref(false)) { + const confirmHook = createEventHook(); + const cancelHook = createEventHook(); + const revealHook = createEventHook(); + let _resolve = noop; + const reveal = (data) => { + revealHook.trigger(data); + revealed.value = true; + return new Promise((resolve) => { + _resolve = resolve; + }); + }; + const confirm = (data) => { + revealed.value = false; + confirmHook.trigger(data); + _resolve({ data, isCanceled: false }); + }; + const cancel = (data) => { + revealed.value = false; + cancelHook.trigger(data); + _resolve({ data, isCanceled: true }); + }; + return { + isRevealed: computed(() => revealed.value), + reveal, + confirm, + cancel, + onReveal: revealHook.on, + onConfirm: confirmHook.on, + onCancel: cancelHook.on + }; +} +function useCssVar(prop, target, options = {}) { + const { window: window2 = defaultWindow, initialValue = "", observe = false } = options; + const variable = ref(initialValue); + const elRef = computed(() => { + var _a; + return unrefElement(target) || ((_a = window2 == null ? void 0 : window2.document) == null ? void 0 : _a.documentElement); + }); + function updateCssVar() { + var _a; + const key = toValue(prop); + const el = toValue(elRef); + if (el && window2) { + const value = (_a = window2.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim(); + variable.value = value || initialValue; + } + } + if (observe) { + useMutationObserver(elRef, updateCssVar, { + attributeFilter: ["style", "class"], + window: window2 + }); + } + watch( + [elRef, () => toValue(prop)], + updateCssVar, + { immediate: true } + ); + watch( + variable, + (val) => { + var _a; + if ((_a = elRef.value) == null ? void 0 : _a.style) + elRef.value.style.setProperty(toValue(prop), val); + } + ); + return variable; +} +function useCurrentElement(rootComponent) { + const vm = getCurrentInstance(); + const currentElement = computedWithControl( + () => null, + () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el + ); + onUpdated(currentElement.trigger); + onMounted(currentElement.trigger); + return currentElement; +} +function useCycleList(list, options) { + const state = shallowRef(getInitialValue()); + const listRef = toRef2(list); + const index = computed({ + get() { + var _a; + const targetList = listRef.value; + let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value); + if (index2 < 0) + index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0; + return index2; + }, + set(v) { + set4(v); + } + }); + function set4(i) { + const targetList = listRef.value; + const length = targetList.length; + const index2 = (i % length + length) % length; + const value = targetList[index2]; + state.value = value; + return value; + } + function shift(delta = 1) { + return set4(index.value + delta); + } + function next(n = 1) { + return shift(n); + } + function prev(n = 1) { + return shift(-n); + } + function getInitialValue() { + var _a, _b; + return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0; + } + watch(listRef, () => set4(index.value)); + return { + state, + index, + next, + prev, + go: set4 + }; +} +function useDark(options = {}) { + const { + valueDark = "dark", + valueLight = "", + window: window2 = defaultWindow + } = options; + const mode = useColorMode({ + ...options, + onChanged: (mode2, defaultHandler) => { + var _a; + if (options.onChanged) + (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === "dark", defaultHandler, mode2); + else + defaultHandler(mode2); + }, + modes: { + dark: valueDark, + light: valueLight + } + }); + const system = computed(() => { + if (mode.system) { + return mode.system.value; + } else { + const preferredDark = usePreferredDark({ window: window2 }); + return preferredDark.value ? "dark" : "light"; + } + }); + const isDark = computed({ + get() { + return mode.value === "dark"; + }, + set(v) { + const modeVal = v ? "dark" : "light"; + if (system.value === modeVal) + mode.value = "auto"; + else + mode.value = modeVal; + } + }); + return isDark; +} +function fnBypass(v) { + return v; +} +function fnSetSource(source, value) { + return source.value = value; +} +function defaultDump(clone) { + return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass; +} +function defaultParse(clone) { + return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass; +} +function useManualRefHistory(source, options = {}) { + const { + clone = false, + dump = defaultDump(clone), + parse = defaultParse(clone), + setSource = fnSetSource + } = options; + function _createHistoryRecord() { + return markRaw({ + snapshot: dump(source.value), + timestamp: timestamp() + }); + } + const last = ref(_createHistoryRecord()); + const undoStack = ref([]); + const redoStack = ref([]); + const _setSource = (record) => { + setSource(source, parse(record.snapshot)); + last.value = record; + }; + const commit = () => { + undoStack.value.unshift(last.value); + last.value = _createHistoryRecord(); + if (options.capacity && undoStack.value.length > options.capacity) + undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY); + if (redoStack.value.length) + redoStack.value.splice(0, redoStack.value.length); + }; + const clear = () => { + undoStack.value.splice(0, undoStack.value.length); + redoStack.value.splice(0, redoStack.value.length); + }; + const undo = () => { + const state = undoStack.value.shift(); + if (state) { + redoStack.value.unshift(last.value); + _setSource(state); + } + }; + const redo = () => { + const state = redoStack.value.shift(); + if (state) { + undoStack.value.unshift(last.value); + _setSource(state); + } + }; + const reset = () => { + _setSource(last.value); + }; + const history = computed(() => [last.value, ...undoStack.value]); + const canUndo = computed(() => undoStack.value.length > 0); + const canRedo = computed(() => redoStack.value.length > 0); + return { + source, + undoStack, + redoStack, + last, + history, + canUndo, + canRedo, + clear, + commit, + reset, + undo, + redo + }; +} +function useRefHistory(source, options = {}) { + const { + deep = false, + flush = "pre", + eventFilter + } = options; + const { + eventFilter: composedFilter, + pause, + resume: resumeTracking, + isActive: isTracking + } = pausableFilter(eventFilter); + const { + ignoreUpdates, + ignorePrevAsyncUpdates, + stop + } = watchIgnorable( + source, + commit, + { deep, flush, eventFilter: composedFilter } + ); + function setSource(source2, value) { + ignorePrevAsyncUpdates(); + ignoreUpdates(() => { + source2.value = value; + }); + } + const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource }); + const { clear, commit: manualCommit } = manualHistory; + function commit() { + ignorePrevAsyncUpdates(); + manualCommit(); + } + function resume(commitNow) { + resumeTracking(); + if (commitNow) + commit(); + } + function batch(fn) { + let canceled = false; + const cancel = () => canceled = true; + ignoreUpdates(() => { + fn(cancel); + }); + if (!canceled) + commit(); + } + function dispose() { + stop(); + clear(); + } + return { + ...manualHistory, + isTracking, + pause, + resume, + commit, + batch, + dispose + }; +} +function useDebouncedRefHistory(source, options = {}) { + const filter = options.debounce ? debounceFilter(options.debounce) : void 0; + const history = useRefHistory(source, { ...options, eventFilter: filter }); + return { + ...history + }; +} +function useDeviceMotion(options = {}) { + const { + window: window2 = defaultWindow, + eventFilter = bypassFilter + } = options; + const acceleration = ref({ x: null, y: null, z: null }); + const rotationRate = ref({ alpha: null, beta: null, gamma: null }); + const interval = ref(0); + const accelerationIncludingGravity = ref({ + x: null, + y: null, + z: null + }); + if (window2) { + const onDeviceMotion = createFilterWrapper( + eventFilter, + (event) => { + acceleration.value = event.acceleration; + accelerationIncludingGravity.value = event.accelerationIncludingGravity; + rotationRate.value = event.rotationRate; + interval.value = event.interval; + } + ); + useEventListener(window2, "devicemotion", onDeviceMotion); + } + return { + acceleration, + accelerationIncludingGravity, + rotationRate, + interval + }; +} +function useDeviceOrientation(options = {}) { + const { window: window2 = defaultWindow } = options; + const isSupported = useSupported(() => window2 && "DeviceOrientationEvent" in window2); + const isAbsolute = ref(false); + const alpha = ref(null); + const beta = ref(null); + const gamma = ref(null); + if (window2 && isSupported.value) { + useEventListener(window2, "deviceorientation", (event) => { + isAbsolute.value = event.absolute; + alpha.value = event.alpha; + beta.value = event.beta; + gamma.value = event.gamma; + }); + } + return { + isSupported, + isAbsolute, + alpha, + beta, + gamma + }; +} +function useDevicePixelRatio(options = {}) { + const { + window: window2 = defaultWindow + } = options; + const pixelRatio = ref(1); + if (window2) { + let observe2 = function() { + pixelRatio.value = window2.devicePixelRatio; + cleanup2(); + media = window2.matchMedia(`(resolution: ${pixelRatio.value}dppx)`); + media.addEventListener("change", observe2, { once: true }); + }, cleanup2 = function() { + media == null ? void 0 : media.removeEventListener("change", observe2); + }; + let media; + observe2(); + tryOnScopeDispose(cleanup2); + } + return { pixelRatio }; +} +function useDevicesList(options = {}) { + const { + navigator = defaultNavigator, + requestPermissions = false, + constraints = { audio: true, video: true }, + onUpdated: onUpdated2 + } = options; + const devices = ref([]); + const videoInputs = computed(() => devices.value.filter((i) => i.kind === "videoinput")); + const audioInputs = computed(() => devices.value.filter((i) => i.kind === "audioinput")); + const audioOutputs = computed(() => devices.value.filter((i) => i.kind === "audiooutput")); + const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices); + const permissionGranted = ref(false); + let stream; + async function update() { + if (!isSupported.value) + return; + devices.value = await navigator.mediaDevices.enumerateDevices(); + onUpdated2 == null ? void 0 : onUpdated2(devices.value); + if (stream) { + stream.getTracks().forEach((t) => t.stop()); + stream = null; + } + } + async function ensurePermissions() { + if (!isSupported.value) + return false; + if (permissionGranted.value) + return true; + const { state, query } = usePermission("camera", { controls: true }); + await query(); + if (state.value !== "granted") { + stream = await navigator.mediaDevices.getUserMedia(constraints); + update(); + permissionGranted.value = true; + } else { + permissionGranted.value = true; + } + return permissionGranted.value; + } + if (isSupported.value) { + if (requestPermissions) + ensurePermissions(); + useEventListener(navigator.mediaDevices, "devicechange", update); + update(); + } + return { + devices, + ensurePermissions, + permissionGranted, + videoInputs, + audioInputs, + audioOutputs, + isSupported + }; +} +function useDisplayMedia(options = {}) { + var _a; + const enabled = ref((_a = options.enabled) != null ? _a : false); + const video = options.video; + const audio = options.audio; + const { navigator = defaultNavigator } = options; + const isSupported = useSupported(() => { + var _a2; + return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia; + }); + const constraint = { audio, video }; + const stream = shallowRef(); + async function _start() { + var _a2; + if (!isSupported.value || stream.value) + return; + stream.value = await navigator.mediaDevices.getDisplayMedia(constraint); + (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.addEventListener("ended", stop)); + return stream.value; + } + async function _stop() { + var _a2; + (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop()); + stream.value = void 0; + } + function stop() { + _stop(); + enabled.value = false; + } + async function start() { + await _start(); + if (stream.value) + enabled.value = true; + return stream.value; + } + watch( + enabled, + (v) => { + if (v) + _start(); + else + _stop(); + }, + { immediate: true } + ); + return { + isSupported, + stream, + start, + stop, + enabled + }; +} +function useDocumentVisibility(options = {}) { + const { document: document2 = defaultDocument } = options; + if (!document2) + return ref("visible"); + const visibility = ref(document2.visibilityState); + useEventListener(document2, "visibilitychange", () => { + visibility.value = document2.visibilityState; + }); + return visibility; +} +function useDraggable(target, options = {}) { + var _a, _b; + const { + pointerTypes, + preventDefault: preventDefault2, + stopPropagation, + exact, + onMove, + onEnd, + onStart, + initialValue, + axis = "both", + draggingElement = defaultWindow, + containerElement, + handle: draggingHandle = target + } = options; + const position = ref( + (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 } + ); + const pressedDelta = ref(); + const filterEvent = (e) => { + if (pointerTypes) + return pointerTypes.includes(e.pointerType); + return true; + }; + const handleEvent = (e) => { + if (toValue(preventDefault2)) + e.preventDefault(); + if (toValue(stopPropagation)) + e.stopPropagation(); + }; + const start = (e) => { + var _a2; + if (e.button !== 0) + return; + if (toValue(options.disabled) || !filterEvent(e)) + return; + if (toValue(exact) && e.target !== toValue(target)) + return; + const container = toValue(containerElement); + const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container); + const targetRect = toValue(target).getBoundingClientRect(); + const pos = { + x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left), + y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top) + }; + if ((onStart == null ? void 0 : onStart(pos, e)) === false) + return; + pressedDelta.value = pos; + handleEvent(e); + }; + const move = (e) => { + if (toValue(options.disabled) || !filterEvent(e)) + return; + if (!pressedDelta.value) + return; + const container = toValue(containerElement); + const targetRect = toValue(target).getBoundingClientRect(); + let { x, y } = position.value; + if (axis === "x" || axis === "both") { + x = e.clientX - pressedDelta.value.x; + if (container) + x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width); + } + if (axis === "y" || axis === "both") { + y = e.clientY - pressedDelta.value.y; + if (container) + y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height); + } + position.value = { + x, + y + }; + onMove == null ? void 0 : onMove(position.value, e); + handleEvent(e); + }; + const end = (e) => { + if (toValue(options.disabled) || !filterEvent(e)) + return; + if (!pressedDelta.value) + return; + pressedDelta.value = void 0; + onEnd == null ? void 0 : onEnd(position.value, e); + handleEvent(e); + }; + if (isClient) { + const config = { capture: (_b = options.capture) != null ? _b : true }; + useEventListener(draggingHandle, "pointerdown", start, config); + useEventListener(draggingElement, "pointermove", move, config); + useEventListener(draggingElement, "pointerup", end, config); + } + return { + ...toRefs2(position), + position, + isDragging: computed(() => !!pressedDelta.value), + style: computed( + () => `left:${position.value.x}px;top:${position.value.y}px;` + ) + }; +} +function useDropZone(target, options = {}) { + const isOverDropZone = ref(false); + const files = shallowRef(null); + let counter = 0; + let isDataTypeIncluded = true; + if (isClient) { + const _options = typeof options === "function" ? { onDrop: options } : options; + const getFiles = (event) => { + var _a, _b; + const list = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []); + return files.value = list.length === 0 ? null : list; + }; + useEventListener(target, "dragenter", (event) => { + var _a, _b; + const types = Array.from(((_a = event == null ? void 0 : event.dataTransfer) == null ? void 0 : _a.items) || []).map((i) => i.kind === "file" ? i.type : null).filter(notNullish); + if (_options.dataTypes && event.dataTransfer) { + const dataTypes = unref(_options.dataTypes); + isDataTypeIncluded = typeof dataTypes === "function" ? dataTypes(types) : dataTypes ? dataTypes.some((item) => types.includes(item)) : true; + if (!isDataTypeIncluded) + return; + } + event.preventDefault(); + counter += 1; + isOverDropZone.value = true; + (_b = _options.onEnter) == null ? void 0 : _b.call(_options, getFiles(event), event); + }); + useEventListener(target, "dragover", (event) => { + var _a; + if (!isDataTypeIncluded) + return; + event.preventDefault(); + (_a = _options.onOver) == null ? void 0 : _a.call(_options, getFiles(event), event); + }); + useEventListener(target, "dragleave", (event) => { + var _a; + if (!isDataTypeIncluded) + return; + event.preventDefault(); + counter -= 1; + if (counter === 0) + isOverDropZone.value = false; + (_a = _options.onLeave) == null ? void 0 : _a.call(_options, getFiles(event), event); + }); + useEventListener(target, "drop", (event) => { + var _a; + event.preventDefault(); + counter = 0; + isOverDropZone.value = false; + (_a = _options.onDrop) == null ? void 0 : _a.call(_options, getFiles(event), event); + }); + } + return { + files, + isOverDropZone + }; +} +function useResizeObserver(target, callback, options = {}) { + const { window: window2 = defaultWindow, ...observerOptions } = options; + let observer; + const isSupported = useSupported(() => window2 && "ResizeObserver" in window2); + const cleanup = () => { + if (observer) { + observer.disconnect(); + observer = void 0; + } + }; + const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]); + const stopWatch = watch( + targets, + (els) => { + cleanup(); + if (isSupported.value && window2) { + observer = new ResizeObserver(callback); + for (const _el of els) + _el && observer.observe(_el, observerOptions); + } + }, + { immediate: true, flush: "post" } + ); + const stop = () => { + cleanup(); + stopWatch(); + }; + tryOnScopeDispose(stop); + return { + isSupported, + stop + }; +} +function useElementBounding(target, options = {}) { + const { + reset = true, + windowResize = true, + windowScroll = true, + immediate = true + } = options; + const height = ref(0); + const bottom = ref(0); + const left = ref(0); + const right = ref(0); + const top = ref(0); + const width = ref(0); + const x = ref(0); + const y = ref(0); + function update() { + const el = unrefElement(target); + if (!el) { + if (reset) { + height.value = 0; + bottom.value = 0; + left.value = 0; + right.value = 0; + top.value = 0; + width.value = 0; + x.value = 0; + y.value = 0; + } + return; + } + const rect = el.getBoundingClientRect(); + height.value = rect.height; + bottom.value = rect.bottom; + left.value = rect.left; + right.value = rect.right; + top.value = rect.top; + width.value = rect.width; + x.value = rect.x; + y.value = rect.y; + } + useResizeObserver(target, update); + watch(() => unrefElement(target), (ele) => !ele && update()); + useMutationObserver(target, update, { + attributeFilter: ["style", "class"] + }); + if (windowScroll) + useEventListener("scroll", update, { capture: true, passive: true }); + if (windowResize) + useEventListener("resize", update, { passive: true }); + tryOnMounted(() => { + if (immediate) + update(); + }); + return { + height, + bottom, + left, + right, + top, + width, + x, + y, + update + }; +} +function useElementByPoint(options) { + const { + x, + y, + document: document2 = defaultDocument, + multiple, + interval = "requestAnimationFrame", + immediate = true + } = options; + const isSupported = useSupported(() => { + if (toValue(multiple)) + return document2 && "elementsFromPoint" in document2; + return document2 && "elementFromPoint" in document2; + }); + const element = ref(null); + const cb = () => { + var _a, _b; + element.value = toValue(multiple) ? (_a = document2 == null ? void 0 : document2.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document2 == null ? void 0 : document2.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null; + }; + const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate }); + return { + isSupported, + element, + ...controls + }; +} +function useElementHover(el, options = {}) { + const { + delayEnter = 0, + delayLeave = 0, + window: window2 = defaultWindow + } = options; + const isHovered = ref(false); + let timer; + const toggle = (entering) => { + const delay = entering ? delayEnter : delayLeave; + if (timer) { + clearTimeout(timer); + timer = void 0; + } + if (delay) + timer = setTimeout(() => isHovered.value = entering, delay); + else + isHovered.value = entering; + }; + if (!window2) + return isHovered; + useEventListener(el, "mouseenter", () => toggle(true), { passive: true }); + useEventListener(el, "mouseleave", () => toggle(false), { passive: true }); + return isHovered; +} +function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) { + const { window: window2 = defaultWindow, box = "content-box" } = options; + const isSVG = computed(() => { + var _a, _b; + return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg"); + }); + const width = ref(initialSize.width); + const height = ref(initialSize.height); + const { stop: stop1 } = useResizeObserver( + target, + ([entry]) => { + const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize; + if (window2 && isSVG.value) { + const $elem = unrefElement(target); + if ($elem) { + const rect = $elem.getBoundingClientRect(); + width.value = rect.width; + height.value = rect.height; + } + } else { + if (boxSize) { + const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize]; + width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0); + height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0); + } else { + width.value = entry.contentRect.width; + height.value = entry.contentRect.height; + } + } + }, + options + ); + tryOnMounted(() => { + const ele = unrefElement(target); + if (ele) { + width.value = "offsetWidth" in ele ? ele.offsetWidth : initialSize.width; + height.value = "offsetHeight" in ele ? ele.offsetHeight : initialSize.height; + } + }); + const stop2 = watch( + () => unrefElement(target), + (ele) => { + width.value = ele ? initialSize.width : 0; + height.value = ele ? initialSize.height : 0; + } + ); + function stop() { + stop1(); + stop2(); + } + return { + width, + height, + stop + }; +} +function useIntersectionObserver(target, callback, options = {}) { + const { + root, + rootMargin = "0px", + threshold = 0.1, + window: window2 = defaultWindow, + immediate = true + } = options; + const isSupported = useSupported(() => window2 && "IntersectionObserver" in window2); + const targets = computed(() => { + const _target = toValue(target); + return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish); + }); + let cleanup = noop; + const isActive = ref(immediate); + const stopWatch = isSupported.value ? watch( + () => [targets.value, unrefElement(root), isActive.value], + ([targets2, root2]) => { + cleanup(); + if (!isActive.value) + return; + if (!targets2.length) + return; + const observer = new IntersectionObserver( + callback, + { + root: unrefElement(root2), + rootMargin, + threshold + } + ); + targets2.forEach((el) => el && observer.observe(el)); + cleanup = () => { + observer.disconnect(); + cleanup = noop; + }; + }, + { immediate, flush: "post" } + ) : noop; + const stop = () => { + cleanup(); + stopWatch(); + isActive.value = false; + }; + tryOnScopeDispose(stop); + return { + isSupported, + isActive, + pause() { + cleanup(); + isActive.value = false; + }, + resume() { + isActive.value = true; + }, + stop + }; +} +function useElementVisibility(element, options = {}) { + const { window: window2 = defaultWindow, scrollTarget, threshold = 0 } = options; + const elementIsVisible = ref(false); + useIntersectionObserver( + element, + (intersectionObserverEntries) => { + let isIntersecting = elementIsVisible.value; + let latestTime = 0; + for (const entry of intersectionObserverEntries) { + if (entry.time >= latestTime) { + latestTime = entry.time; + isIntersecting = entry.isIntersecting; + } + } + elementIsVisible.value = isIntersecting; + }, + { + root: scrollTarget, + window: window2, + threshold + } + ); + return elementIsVisible; +} +var events = /* @__PURE__ */ new Map(); +function useEventBus(key) { + const scope = getCurrentScope(); + function on(listener) { + var _a; + const listeners = events.get(key) || /* @__PURE__ */ new Set(); + listeners.add(listener); + events.set(key, listeners); + const _off = () => off(listener); + (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off); + return _off; + } + function once(listener) { + function _listener(...args) { + off(_listener); + listener(...args); + } + return on(_listener); + } + function off(listener) { + const listeners = events.get(key); + if (!listeners) + return; + listeners.delete(listener); + if (!listeners.size) + reset(); + } + function reset() { + events.delete(key); + } + function emit(event, payload) { + var _a; + (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload)); + } + return { on, once, off, emit, reset }; +} +function resolveNestedOptions$1(options) { + if (options === true) + return {}; + return options; +} +function useEventSource(url, events2 = [], options = {}) { + const event = ref(null); + const data = ref(null); + const status = ref("CONNECTING"); + const eventSource = ref(null); + const error = shallowRef(null); + const urlRef = toRef2(url); + const lastEventId = shallowRef(null); + let explicitlyClosed = false; + let retried = 0; + const { + withCredentials = false, + immediate = true + } = options; + const close = () => { + if (isClient && eventSource.value) { + eventSource.value.close(); + eventSource.value = null; + status.value = "CLOSED"; + explicitlyClosed = true; + } + }; + const _init = () => { + if (explicitlyClosed || typeof urlRef.value === "undefined") + return; + const es = new EventSource(urlRef.value, { withCredentials }); + status.value = "CONNECTING"; + eventSource.value = es; + es.onopen = () => { + status.value = "OPEN"; + error.value = null; + }; + es.onerror = (e) => { + status.value = "CLOSED"; + error.value = e; + if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) { + es.close(); + const { + retries = -1, + delay = 1e3, + onFailed + } = resolveNestedOptions$1(options.autoReconnect); + retried += 1; + if (typeof retries === "number" && (retries < 0 || retried < retries)) + setTimeout(_init, delay); + else if (typeof retries === "function" && retries()) + setTimeout(_init, delay); + else + onFailed == null ? void 0 : onFailed(); + } + }; + es.onmessage = (e) => { + event.value = null; + data.value = e.data; + lastEventId.value = e.lastEventId; + }; + for (const event_name of events2) { + useEventListener(es, event_name, (e) => { + event.value = event_name; + data.value = e.data || null; + }); + } + }; + const open = () => { + if (!isClient) + return; + close(); + explicitlyClosed = false; + retried = 0; + _init(); + }; + if (immediate) + watch(urlRef, open, { immediate: true }); + tryOnScopeDispose(close); + return { + eventSource, + event, + data, + status, + error, + open, + close, + lastEventId + }; +} +function useEyeDropper(options = {}) { + const { initialValue = "" } = options; + const isSupported = useSupported(() => typeof window !== "undefined" && "EyeDropper" in window); + const sRGBHex = ref(initialValue); + async function open(openOptions) { + if (!isSupported.value) + return; + const eyeDropper = new window.EyeDropper(); + const result = await eyeDropper.open(openOptions); + sRGBHex.value = result.sRGBHex; + return result; + } + return { isSupported, sRGBHex, open }; +} +function useFavicon(newIcon = null, options = {}) { + const { + baseUrl = "", + rel = "icon", + document: document2 = defaultDocument + } = options; + const favicon = toRef2(newIcon); + const applyIcon = (icon) => { + const elements = document2 == null ? void 0 : document2.head.querySelectorAll(`link[rel*="${rel}"]`); + if (!elements || elements.length === 0) { + const link = document2 == null ? void 0 : document2.createElement("link"); + if (link) { + link.rel = rel; + link.href = `${baseUrl}${icon}`; + link.type = `image/${icon.split(".").pop()}`; + document2 == null ? void 0 : document2.head.append(link); + } + return; + } + elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`); + }; + watch( + favicon, + (i, o) => { + if (typeof i === "string" && i !== o) + applyIcon(i); + }, + { immediate: true } + ); + return favicon; +} +var payloadMapping = { + json: "application/json", + text: "text/plain" +}; +function isFetchOptions(obj) { + return obj && containsProp(obj, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch", "updateDataOnError"); +} +var reAbsolute = /^(?:[a-z][a-z\d+\-.]*:)?\/\//i; +function isAbsoluteURL(url) { + return reAbsolute.test(url); +} +function headersToObject(headers) { + if (typeof Headers !== "undefined" && headers instanceof Headers) + return Object.fromEntries(headers.entries()); + return headers; +} +function combineCallbacks(combination, ...callbacks) { + if (combination === "overwrite") { + return async (ctx) => { + const callback = callbacks[callbacks.length - 1]; + if (callback) + return { ...ctx, ...await callback(ctx) }; + return ctx; + }; + } else { + return async (ctx) => { + for (const callback of callbacks) { + if (callback) + ctx = { ...ctx, ...await callback(ctx) }; + } + return ctx; + }; + } +} +function createFetch(config = {}) { + const _combination = config.combination || "chain"; + const _options = config.options || {}; + const _fetchOptions = config.fetchOptions || {}; + function useFactoryFetch(url, ...args) { + const computedUrl = computed(() => { + const baseUrl = toValue(config.baseUrl); + const targetUrl = toValue(url); + return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl; + }); + let options = _options; + let fetchOptions = _fetchOptions; + if (args.length > 0) { + if (isFetchOptions(args[0])) { + options = { + ...options, + ...args[0], + beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch), + afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch), + onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError) + }; + } else { + fetchOptions = { + ...fetchOptions, + ...args[0], + headers: { + ...headersToObject(fetchOptions.headers) || {}, + ...headersToObject(args[0].headers) || {} + } + }; + } + } + if (args.length > 1 && isFetchOptions(args[1])) { + options = { + ...options, + ...args[1], + beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch), + afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch), + onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError) + }; + } + return useFetch(computedUrl, fetchOptions, options); + } + return useFactoryFetch; +} +function useFetch(url, ...args) { + var _a; + const supportsAbort = typeof AbortController === "function"; + let fetchOptions = {}; + let options = { + immediate: true, + refetch: false, + timeout: 0, + updateDataOnError: false + }; + const config = { + method: "GET", + type: "text", + payload: void 0 + }; + if (args.length > 0) { + if (isFetchOptions(args[0])) + options = { ...options, ...args[0] }; + else + fetchOptions = args[0]; + } + if (args.length > 1) { + if (isFetchOptions(args[1])) + options = { ...options, ...args[1] }; + } + const { + fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch, + initialData, + timeout + } = options; + const responseEvent = createEventHook(); + const errorEvent = createEventHook(); + const finallyEvent = createEventHook(); + const isFinished = ref(false); + const isFetching = ref(false); + const aborted = ref(false); + const statusCode = ref(null); + const response = shallowRef(null); + const error = shallowRef(null); + const data = shallowRef(initialData || null); + const canAbort = computed(() => supportsAbort && isFetching.value); + let controller; + let timer; + const abort = () => { + if (supportsAbort) { + controller == null ? void 0 : controller.abort(); + controller = new AbortController(); + controller.signal.onabort = () => aborted.value = true; + fetchOptions = { + ...fetchOptions, + signal: controller.signal + }; + } + }; + const loading = (isLoading) => { + isFetching.value = isLoading; + isFinished.value = !isLoading; + }; + if (timeout) + timer = useTimeoutFn(abort, timeout, { immediate: false }); + let executeCounter = 0; + const execute = async (throwOnFailed = false) => { + var _a2, _b; + abort(); + loading(true); + error.value = null; + statusCode.value = null; + aborted.value = false; + executeCounter += 1; + const currentExecuteCounter = executeCounter; + const defaultFetchOptions = { + method: config.method, + headers: {} + }; + if (config.payload) { + const headers = headersToObject(defaultFetchOptions.headers); + const payload = toValue(config.payload); + if (!config.payloadType && payload && Object.getPrototypeOf(payload) === Object.prototype && !(payload instanceof FormData)) + config.payloadType = "json"; + if (config.payloadType) + headers["Content-Type"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType; + defaultFetchOptions.body = config.payloadType === "json" ? JSON.stringify(payload) : payload; + } + let isCanceled = false; + const context = { + url: toValue(url), + options: { + ...defaultFetchOptions, + ...fetchOptions + }, + cancel: () => { + isCanceled = true; + } + }; + if (options.beforeFetch) + Object.assign(context, await options.beforeFetch(context)); + if (isCanceled || !fetch) { + loading(false); + return Promise.resolve(null); + } + let responseData = null; + if (timer) + timer.start(); + return fetch( + context.url, + { + ...defaultFetchOptions, + ...context.options, + headers: { + ...headersToObject(defaultFetchOptions.headers), + ...headersToObject((_b = context.options) == null ? void 0 : _b.headers) + } + } + ).then(async (fetchResponse) => { + response.value = fetchResponse; + statusCode.value = fetchResponse.status; + responseData = await fetchResponse.clone()[config.type](); + if (!fetchResponse.ok) { + data.value = initialData || null; + throw new Error(fetchResponse.statusText); + } + if (options.afterFetch) { + ({ data: responseData } = await options.afterFetch({ + data: responseData, + response: fetchResponse + })); + } + data.value = responseData; + responseEvent.trigger(fetchResponse); + return fetchResponse; + }).catch(async (fetchError) => { + let errorData = fetchError.message || fetchError.name; + if (options.onFetchError) { + ({ error: errorData, data: responseData } = await options.onFetchError({ + data: responseData, + error: fetchError, + response: response.value + })); + } + error.value = errorData; + if (options.updateDataOnError) + data.value = responseData; + errorEvent.trigger(fetchError); + if (throwOnFailed) + throw fetchError; + return null; + }).finally(() => { + if (currentExecuteCounter === executeCounter) + loading(false); + if (timer) + timer.stop(); + finallyEvent.trigger(null); + }); + }; + const refetch = toRef2(options.refetch); + watch( + [ + refetch, + toRef2(url) + ], + ([refetch2]) => refetch2 && execute(), + { deep: true } + ); + const shell = { + isFinished: readonly(isFinished), + isFetching: readonly(isFetching), + statusCode, + response, + error, + data, + canAbort, + aborted, + abort, + execute, + onFetchResponse: responseEvent.on, + onFetchError: errorEvent.on, + onFetchFinally: finallyEvent.on, + // method + get: setMethod("GET"), + put: setMethod("PUT"), + post: setMethod("POST"), + delete: setMethod("DELETE"), + patch: setMethod("PATCH"), + head: setMethod("HEAD"), + options: setMethod("OPTIONS"), + // type + json: setType("json"), + text: setType("text"), + blob: setType("blob"), + arrayBuffer: setType("arrayBuffer"), + formData: setType("formData") + }; + function setMethod(method) { + return (payload, payloadType) => { + if (!isFetching.value) { + config.method = method; + config.payload = payload; + config.payloadType = payloadType; + if (isRef(config.payload)) { + watch( + [ + refetch, + toRef2(config.payload) + ], + ([refetch2]) => refetch2 && execute(), + { deep: true } + ); + } + return { + ...shell, + then(onFulfilled, onRejected) { + return waitUntilFinished().then(onFulfilled, onRejected); + } + }; + } + return void 0; + }; + } + function waitUntilFinished() { + return new Promise((resolve, reject) => { + until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2)); + }); + } + function setType(type) { + return () => { + if (!isFetching.value) { + config.type = type; + return { + ...shell, + then(onFulfilled, onRejected) { + return waitUntilFinished().then(onFulfilled, onRejected); + } + }; + } + return void 0; + }; + } + if (options.immediate) + Promise.resolve().then(() => execute()); + return { + ...shell, + then(onFulfilled, onRejected) { + return waitUntilFinished().then(onFulfilled, onRejected); + } + }; +} +function joinPaths(start, end) { + if (!start.endsWith("/") && !end.startsWith("/")) + return `${start}/${end}`; + return `${start}${end}`; +} +var DEFAULT_OPTIONS = { + multiple: true, + accept: "*", + reset: false, + directory: false +}; +function useFileDialog(options = {}) { + const { + document: document2 = defaultDocument + } = options; + const files = ref(null); + const { on: onChange, trigger } = createEventHook(); + let input; + if (document2) { + input = document2.createElement("input"); + input.type = "file"; + input.onchange = (event) => { + const result = event.target; + files.value = result.files; + trigger(files.value); + }; + } + const reset = () => { + files.value = null; + if (input && input.value) { + input.value = ""; + trigger(null); + } + }; + const open = (localOptions) => { + if (!input) + return; + const _options = { + ...DEFAULT_OPTIONS, + ...options, + ...localOptions + }; + input.multiple = _options.multiple; + input.accept = _options.accept; + input.webkitdirectory = _options.directory; + if (hasOwn(_options, "capture")) + input.capture = _options.capture; + if (_options.reset) + reset(); + input.click(); + }; + return { + files: readonly(files), + open, + reset, + onChange + }; +} +function useFileSystemAccess(options = {}) { + const { + window: _window = defaultWindow, + dataType = "Text" + } = options; + const window2 = _window; + const isSupported = useSupported(() => window2 && "showSaveFilePicker" in window2 && "showOpenFilePicker" in window2); + const fileHandle = ref(); + const data = ref(); + const file = ref(); + const fileName = computed(() => { + var _a, _b; + return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : ""; + }); + const fileMIME = computed(() => { + var _a, _b; + return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : ""; + }); + const fileSize = computed(() => { + var _a, _b; + return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0; + }); + const fileLastModified = computed(() => { + var _a, _b; + return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0; + }); + async function open(_options = {}) { + if (!isSupported.value) + return; + const [handle] = await window2.showOpenFilePicker({ ...toValue(options), ..._options }); + fileHandle.value = handle; + await updateData(); + } + async function create(_options = {}) { + if (!isSupported.value) + return; + fileHandle.value = await window2.showSaveFilePicker({ ...options, ..._options }); + data.value = void 0; + await updateData(); + } + async function save(_options = {}) { + if (!isSupported.value) + return; + if (!fileHandle.value) + return saveAs(_options); + if (data.value) { + const writableStream = await fileHandle.value.createWritable(); + await writableStream.write(data.value); + await writableStream.close(); + } + await updateFile(); + } + async function saveAs(_options = {}) { + if (!isSupported.value) + return; + fileHandle.value = await window2.showSaveFilePicker({ ...options, ..._options }); + if (data.value) { + const writableStream = await fileHandle.value.createWritable(); + await writableStream.write(data.value); + await writableStream.close(); + } + await updateFile(); + } + async function updateFile() { + var _a; + file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile()); + } + async function updateData() { + var _a, _b; + await updateFile(); + const type = toValue(dataType); + if (type === "Text") + data.value = await ((_a = file.value) == null ? void 0 : _a.text()); + else if (type === "ArrayBuffer") + data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer()); + else if (type === "Blob") + data.value = file.value; + } + watch(() => toValue(dataType), updateData); + return { + isSupported, + data, + file, + fileName, + fileMIME, + fileSize, + fileLastModified, + open, + create, + save, + saveAs, + updateData + }; +} +function useFocus(target, options = {}) { + const { initialValue = false, focusVisible = false, preventScroll = false } = options; + const innerFocused = ref(false); + const targetElement = computed(() => unrefElement(target)); + useEventListener(targetElement, "focus", (event) => { + var _a, _b; + if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, ":focus-visible"))) + innerFocused.value = true; + }); + useEventListener(targetElement, "blur", () => innerFocused.value = false); + const focused = computed({ + get: () => innerFocused.value, + set(value) { + var _a, _b; + if (!value && innerFocused.value) + (_a = targetElement.value) == null ? void 0 : _a.blur(); + else if (value && !innerFocused.value) + (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll }); + } + }); + watch( + targetElement, + () => { + focused.value = initialValue; + }, + { immediate: true, flush: "post" } + ); + return { focused }; +} +function useFocusWithin(target, options = {}) { + const activeElement = useActiveElement(options); + const targetElement = computed(() => unrefElement(target)); + const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false); + return { focused }; +} +function useFps(options) { + var _a; + const fps = ref(0); + if (typeof performance === "undefined") + return fps; + const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10; + let last = performance.now(); + let ticks = 0; + useRafFn(() => { + ticks += 1; + if (ticks >= every) { + const now2 = performance.now(); + const diff = now2 - last; + fps.value = Math.round(1e3 / (diff / ticks)); + last = now2; + ticks = 0; + } + }); + return fps; +} +var eventHandlers = [ + "fullscreenchange", + "webkitfullscreenchange", + "webkitendfullscreen", + "mozfullscreenchange", + "MSFullscreenChange" +]; +function useFullscreen(target, options = {}) { + const { + document: document2 = defaultDocument, + autoExit = false + } = options; + const targetRef = computed(() => { + var _a; + return (_a = unrefElement(target)) != null ? _a : document2 == null ? void 0 : document2.querySelector("html"); + }); + const isFullscreen = ref(false); + const requestMethod = computed(() => { + return [ + "requestFullscreen", + "webkitRequestFullscreen", + "webkitEnterFullscreen", + "webkitEnterFullScreen", + "webkitRequestFullScreen", + "mozRequestFullScreen", + "msRequestFullscreen" + ].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value); + }); + const exitMethod = computed(() => { + return [ + "exitFullscreen", + "webkitExitFullscreen", + "webkitExitFullScreen", + "webkitCancelFullScreen", + "mozCancelFullScreen", + "msExitFullscreen" + ].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value); + }); + const fullscreenEnabled = computed(() => { + return [ + "fullScreen", + "webkitIsFullScreen", + "webkitDisplayingFullscreen", + "mozFullScreen", + "msFullscreenElement" + ].find((m) => document2 && m in document2 || targetRef.value && m in targetRef.value); + }); + const fullscreenElementMethod = [ + "fullscreenElement", + "webkitFullscreenElement", + "mozFullScreenElement", + "msFullscreenElement" + ].find((m) => document2 && m in document2); + const isSupported = useSupported(() => targetRef.value && document2 && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0); + const isCurrentElementFullScreen = () => { + if (fullscreenElementMethod) + return (document2 == null ? void 0 : document2[fullscreenElementMethod]) === targetRef.value; + return false; + }; + const isElementFullScreen = () => { + if (fullscreenEnabled.value) { + if (document2 && document2[fullscreenEnabled.value] != null) { + return document2[fullscreenEnabled.value]; + } else { + const target2 = targetRef.value; + if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) { + return Boolean(target2[fullscreenEnabled.value]); + } + } + } + return false; + }; + async function exit() { + if (!isSupported.value || !isFullscreen.value) + return; + if (exitMethod.value) { + if ((document2 == null ? void 0 : document2[exitMethod.value]) != null) { + await document2[exitMethod.value](); + } else { + const target2 = targetRef.value; + if ((target2 == null ? void 0 : target2[exitMethod.value]) != null) + await target2[exitMethod.value](); + } + } + isFullscreen.value = false; + } + async function enter() { + if (!isSupported.value || isFullscreen.value) + return; + if (isElementFullScreen()) + await exit(); + const target2 = targetRef.value; + if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) { + await target2[requestMethod.value](); + isFullscreen.value = true; + } + } + async function toggle() { + await (isFullscreen.value ? exit() : enter()); + } + const handlerCallback = () => { + const isElementFullScreenValue = isElementFullScreen(); + if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen()) + isFullscreen.value = isElementFullScreenValue; + }; + useEventListener(document2, eventHandlers, handlerCallback, false); + useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false); + if (autoExit) + tryOnScopeDispose(exit); + return { + isSupported, + isFullscreen, + enter, + exit, + toggle + }; +} +function mapGamepadToXbox360Controller(gamepad) { + return computed(() => { + if (gamepad.value) { + return { + buttons: { + a: gamepad.value.buttons[0], + b: gamepad.value.buttons[1], + x: gamepad.value.buttons[2], + y: gamepad.value.buttons[3] + }, + bumper: { + left: gamepad.value.buttons[4], + right: gamepad.value.buttons[5] + }, + triggers: { + left: gamepad.value.buttons[6], + right: gamepad.value.buttons[7] + }, + stick: { + left: { + horizontal: gamepad.value.axes[0], + vertical: gamepad.value.axes[1], + button: gamepad.value.buttons[10] + }, + right: { + horizontal: gamepad.value.axes[2], + vertical: gamepad.value.axes[3], + button: gamepad.value.buttons[11] + } + }, + dpad: { + up: gamepad.value.buttons[12], + down: gamepad.value.buttons[13], + left: gamepad.value.buttons[14], + right: gamepad.value.buttons[15] + }, + back: gamepad.value.buttons[8], + start: gamepad.value.buttons[9] + }; + } + return null; + }); +} +function useGamepad(options = {}) { + const { + navigator = defaultNavigator + } = options; + const isSupported = useSupported(() => navigator && "getGamepads" in navigator); + const gamepads = ref([]); + const onConnectedHook = createEventHook(); + const onDisconnectedHook = createEventHook(); + const stateFromGamepad = (gamepad) => { + const hapticActuators = []; + const vibrationActuator = "vibrationActuator" in gamepad ? gamepad.vibrationActuator : null; + if (vibrationActuator) + hapticActuators.push(vibrationActuator); + if (gamepad.hapticActuators) + hapticActuators.push(...gamepad.hapticActuators); + return { + id: gamepad.id, + index: gamepad.index, + connected: gamepad.connected, + mapping: gamepad.mapping, + timestamp: gamepad.timestamp, + vibrationActuator: gamepad.vibrationActuator, + hapticActuators, + axes: gamepad.axes.map((axes) => axes), + buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value })) + }; + }; + const updateGamepadState = () => { + const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || []; + for (const gamepad of _gamepads) { + if (gamepad && gamepads.value[gamepad.index]) + gamepads.value[gamepad.index] = stateFromGamepad(gamepad); + } + }; + const { isActive, pause, resume } = useRafFn(updateGamepadState); + const onGamepadConnected = (gamepad) => { + if (!gamepads.value.some(({ index }) => index === gamepad.index)) { + gamepads.value.push(stateFromGamepad(gamepad)); + onConnectedHook.trigger(gamepad.index); + } + resume(); + }; + const onGamepadDisconnected = (gamepad) => { + gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index); + onDisconnectedHook.trigger(gamepad.index); + }; + useEventListener("gamepadconnected", (e) => onGamepadConnected(e.gamepad)); + useEventListener("gamepaddisconnected", (e) => onGamepadDisconnected(e.gamepad)); + tryOnMounted(() => { + const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || []; + for (const gamepad of _gamepads) { + if (gamepad && gamepads.value[gamepad.index]) + onGamepadConnected(gamepad); + } + }); + pause(); + return { + isSupported, + onConnected: onConnectedHook.on, + onDisconnected: onDisconnectedHook.on, + gamepads, + pause, + resume, + isActive + }; +} +function useGeolocation(options = {}) { + const { + enableHighAccuracy = true, + maximumAge = 3e4, + timeout = 27e3, + navigator = defaultNavigator, + immediate = true + } = options; + const isSupported = useSupported(() => navigator && "geolocation" in navigator); + const locatedAt = ref(null); + const error = shallowRef(null); + const coords = ref({ + accuracy: 0, + latitude: Number.POSITIVE_INFINITY, + longitude: Number.POSITIVE_INFINITY, + altitude: null, + altitudeAccuracy: null, + heading: null, + speed: null + }); + function updatePosition(position) { + locatedAt.value = position.timestamp; + coords.value = position.coords; + error.value = null; + } + let watcher; + function resume() { + if (isSupported.value) { + watcher = navigator.geolocation.watchPosition( + updatePosition, + (err) => error.value = err, + { + enableHighAccuracy, + maximumAge, + timeout + } + ); + } + } + if (immediate) + resume(); + function pause() { + if (watcher && navigator) + navigator.geolocation.clearWatch(watcher); + } + tryOnScopeDispose(() => { + pause(); + }); + return { + isSupported, + coords, + locatedAt, + error, + resume, + pause + }; +} +var defaultEvents$1 = ["mousemove", "mousedown", "resize", "keydown", "touchstart", "wheel"]; +var oneMinute = 6e4; +function useIdle(timeout = oneMinute, options = {}) { + const { + initialState = false, + listenForVisibilityChange = true, + events: events2 = defaultEvents$1, + window: window2 = defaultWindow, + eventFilter = throttleFilter(50) + } = options; + const idle = ref(initialState); + const lastActive = ref(timestamp()); + let timer; + const reset = () => { + idle.value = false; + clearTimeout(timer); + timer = setTimeout(() => idle.value = true, timeout); + }; + const onEvent = createFilterWrapper( + eventFilter, + () => { + lastActive.value = timestamp(); + reset(); + } + ); + if (window2) { + const document2 = window2.document; + for (const event of events2) + useEventListener(window2, event, onEvent, { passive: true }); + if (listenForVisibilityChange) { + useEventListener(document2, "visibilitychange", () => { + if (!document2.hidden) + onEvent(); + }); + } + reset(); + } + return { + idle, + lastActive, + reset + }; +} +async function loadImage(options) { + return new Promise((resolve, reject) => { + const img = new Image(); + const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options; + img.src = src; + if (srcset) + img.srcset = srcset; + if (sizes) + img.sizes = sizes; + if (clazz) + img.className = clazz; + if (loading) + img.loading = loading; + if (crossorigin) + img.crossOrigin = crossorigin; + if (referrerPolicy) + img.referrerPolicy = referrerPolicy; + img.onload = () => resolve(img); + img.onerror = reject; + }); +} +function useImage(options, asyncStateOptions = {}) { + const state = useAsyncState( + () => loadImage(toValue(options)), + void 0, + { + resetOnExecute: true, + ...asyncStateOptions + } + ); + watch( + () => toValue(options), + () => state.execute(asyncStateOptions.delay), + { deep: true } + ); + return state; +} +var ARRIVED_STATE_THRESHOLD_PIXELS = 1; +function useScroll(element, options = {}) { + const { + throttle = 0, + idle = 200, + onStop = noop, + onScroll = noop, + offset = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventListenerOptions = { + capture: false, + passive: true + }, + behavior = "auto", + window: window2 = defaultWindow, + onError = (e) => { + console.error(e); + } + } = options; + const internalX = ref(0); + const internalY = ref(0); + const x = computed({ + get() { + return internalX.value; + }, + set(x2) { + scrollTo2(x2, void 0); + } + }); + const y = computed({ + get() { + return internalY.value; + }, + set(y2) { + scrollTo2(void 0, y2); + } + }); + function scrollTo2(_x, _y) { + var _a, _b, _c, _d; + if (!window2) + return; + const _element = toValue(element); + if (!_element) + return; + (_c = _element instanceof Document ? window2.document.body : _element) == null ? void 0 : _c.scrollTo({ + top: (_a = toValue(_y)) != null ? _a : y.value, + left: (_b = toValue(_x)) != null ? _b : x.value, + behavior: toValue(behavior) + }); + const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element; + if (x != null) + internalX.value = scrollContainer.scrollLeft; + if (y != null) + internalY.value = scrollContainer.scrollTop; + } + const isScrolling = ref(false); + const arrivedState = reactive({ + left: true, + right: false, + top: true, + bottom: false + }); + const directions = reactive({ + left: false, + right: false, + top: false, + bottom: false + }); + const onScrollEnd = (e) => { + if (!isScrolling.value) + return; + isScrolling.value = false; + directions.left = false; + directions.right = false; + directions.top = false; + directions.bottom = false; + onStop(e); + }; + const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle); + const setArrivedState = (target) => { + var _a; + if (!window2) + return; + const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target); + const { display, flexDirection } = getComputedStyle(el); + const scrollLeft = el.scrollLeft; + directions.left = scrollLeft < internalX.value; + directions.right = scrollLeft > internalX.value; + const left = Math.abs(scrollLeft) <= (offset.left || 0); + const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS; + if (display === "flex" && flexDirection === "row-reverse") { + arrivedState.left = right; + arrivedState.right = left; + } else { + arrivedState.left = left; + arrivedState.right = right; + } + internalX.value = scrollLeft; + let scrollTop = el.scrollTop; + if (target === window2.document && !scrollTop) + scrollTop = window2.document.body.scrollTop; + directions.top = scrollTop < internalY.value; + directions.bottom = scrollTop > internalY.value; + const top = Math.abs(scrollTop) <= (offset.top || 0); + const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS; + if (display === "flex" && flexDirection === "column-reverse") { + arrivedState.top = bottom; + arrivedState.bottom = top; + } else { + arrivedState.top = top; + arrivedState.bottom = bottom; + } + internalY.value = scrollTop; + }; + const onScrollHandler = (e) => { + var _a; + if (!window2) + return; + const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target; + setArrivedState(eventTarget); + isScrolling.value = true; + onScrollEndDebounced(e); + onScroll(e); + }; + useEventListener( + element, + "scroll", + throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler, + eventListenerOptions + ); + tryOnMounted(() => { + try { + const _element = toValue(element); + if (!_element) + return; + setArrivedState(_element); + } catch (e) { + onError(e); + } + }); + useEventListener( + element, + "scrollend", + onScrollEnd, + eventListenerOptions + ); + return { + x, + y, + isScrolling, + arrivedState, + directions, + measure() { + const _element = toValue(element); + if (window2 && _element) + setArrivedState(_element); + } + }; +} +function resolveElement(el) { + if (typeof Window !== "undefined" && el instanceof Window) + return el.document.documentElement; + if (typeof Document !== "undefined" && el instanceof Document) + return el.documentElement; + return el; +} +function useInfiniteScroll(element, onLoadMore, options = {}) { + var _a; + const { + direction = "bottom", + interval = 100, + canLoadMore = () => true + } = options; + const state = reactive(useScroll( + element, + { + ...options, + offset: { + [direction]: (_a = options.distance) != null ? _a : 0, + ...options.offset + } + } + )); + const promise = ref(); + const isLoading = computed(() => !!promise.value); + const observedElement = computed(() => { + return resolveElement(toValue(element)); + }); + const isElementVisible = useElementVisibility(observedElement); + function checkAndLoad() { + state.measure(); + if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value)) + return; + const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value; + const isNarrower = direction === "bottom" || direction === "top" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth; + if (state.arrivedState[direction] || isNarrower) { + if (!promise.value) { + promise.value = Promise.all([ + onLoadMore(state), + new Promise((resolve) => setTimeout(resolve, interval)) + ]).finally(() => { + promise.value = null; + nextTick(() => checkAndLoad()); + }); + } + } + } + watch( + () => [state.arrivedState[direction], isElementVisible.value], + checkAndLoad, + { immediate: true } + ); + return { + isLoading + }; +} +var defaultEvents = ["mousedown", "mouseup", "keydown", "keyup"]; +function useKeyModifier(modifier, options = {}) { + const { + events: events2 = defaultEvents, + document: document2 = defaultDocument, + initial = null + } = options; + const state = ref(initial); + if (document2) { + events2.forEach((listenerEvent) => { + useEventListener(document2, listenerEvent, (evt) => { + if (typeof evt.getModifierState === "function") + state.value = evt.getModifierState(modifier); + }); + }); + } + return state; +} +function useLocalStorage(key, initialValue, options = {}) { + const { window: window2 = defaultWindow } = options; + return useStorage(key, initialValue, window2 == null ? void 0 : window2.localStorage, options); +} +var DefaultMagicKeysAliasMap = { + ctrl: "control", + command: "meta", + cmd: "meta", + option: "alt", + up: "arrowup", + down: "arrowdown", + left: "arrowleft", + right: "arrowright" +}; +function useMagicKeys(options = {}) { + const { + reactive: useReactive = false, + target = defaultWindow, + aliasMap = DefaultMagicKeysAliasMap, + passive = true, + onEventFired = noop + } = options; + const current = reactive(/* @__PURE__ */ new Set()); + const obj = { + toJSON() { + return {}; + }, + current + }; + const refs = useReactive ? reactive(obj) : obj; + const metaDeps = /* @__PURE__ */ new Set(); + const usedKeys = /* @__PURE__ */ new Set(); + function setRefs(key, value) { + if (key in refs) { + if (useReactive) + refs[key] = value; + else + refs[key].value = value; + } + } + function reset() { + current.clear(); + for (const key of usedKeys) + setRefs(key, false); + } + function updateRefs(e, value) { + var _a, _b; + const key = (_a = e.key) == null ? void 0 : _a.toLowerCase(); + const code = (_b = e.code) == null ? void 0 : _b.toLowerCase(); + const values = [code, key].filter(Boolean); + if (key) { + if (value) + current.add(key); + else + current.delete(key); + } + for (const key2 of values) { + usedKeys.add(key2); + setRefs(key2, value); + } + if (key === "meta" && !value) { + metaDeps.forEach((key2) => { + current.delete(key2); + setRefs(key2, false); + }); + metaDeps.clear(); + } else if (typeof e.getModifierState === "function" && e.getModifierState("Meta") && value) { + [...current, ...values].forEach((key2) => metaDeps.add(key2)); + } + } + useEventListener(target, "keydown", (e) => { + updateRefs(e, true); + return onEventFired(e); + }, { passive }); + useEventListener(target, "keyup", (e) => { + updateRefs(e, false); + return onEventFired(e); + }, { passive }); + useEventListener("blur", reset, { passive: true }); + useEventListener("focus", reset, { passive: true }); + const proxy = new Proxy( + refs, + { + get(target2, prop, rec) { + if (typeof prop !== "string") + return Reflect.get(target2, prop, rec); + prop = prop.toLowerCase(); + if (prop in aliasMap) + prop = aliasMap[prop]; + if (!(prop in refs)) { + if (/[+_-]/.test(prop)) { + const keys2 = prop.split(/[+_-]/g).map((i) => i.trim()); + refs[prop] = computed(() => keys2.every((key) => toValue(proxy[key]))); + } else { + refs[prop] = ref(false); + } + } + const r = Reflect.get(target2, prop, rec); + return useReactive ? toValue(r) : r; + } + } + ); + return proxy; +} +function usingElRef(source, cb) { + if (toValue(source)) + cb(toValue(source)); +} +function timeRangeToArray(timeRanges) { + let ranges = []; + for (let i = 0; i < timeRanges.length; ++i) + ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]]; + return ranges; +} +function tracksToArray(tracks) { + return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType })); +} +var defaultOptions = { + src: "", + tracks: [] +}; +function useMediaControls(target, options = {}) { + target = toRef2(target); + options = { + ...defaultOptions, + ...options + }; + const { + document: document2 = defaultDocument + } = options; + const currentTime = ref(0); + const duration = ref(0); + const seeking = ref(false); + const volume = ref(1); + const waiting = ref(false); + const ended = ref(false); + const playing = ref(false); + const rate = ref(1); + const stalled = ref(false); + const buffered = ref([]); + const tracks = ref([]); + const selectedTrack = ref(-1); + const isPictureInPicture = ref(false); + const muted = ref(false); + const supportsPictureInPicture = document2 && "pictureInPictureEnabled" in document2; + const sourceErrorEvent = createEventHook(); + const disableTrack = (track) => { + usingElRef(target, (el) => { + if (track) { + const id = typeof track === "number" ? track : track.id; + el.textTracks[id].mode = "disabled"; + } else { + for (let i = 0; i < el.textTracks.length; ++i) + el.textTracks[i].mode = "disabled"; + } + selectedTrack.value = -1; + }); + }; + const enableTrack = (track, disableTracks = true) => { + usingElRef(target, (el) => { + const id = typeof track === "number" ? track : track.id; + if (disableTracks) + disableTrack(); + el.textTracks[id].mode = "showing"; + selectedTrack.value = id; + }); + }; + const togglePictureInPicture = () => { + return new Promise((resolve, reject) => { + usingElRef(target, async (el) => { + if (supportsPictureInPicture) { + if (!isPictureInPicture.value) { + el.requestPictureInPicture().then(resolve).catch(reject); + } else { + document2.exitPictureInPicture().then(resolve).catch(reject); + } + } + }); + }); + }; + watchEffect(() => { + if (!document2) + return; + const el = toValue(target); + if (!el) + return; + const src = toValue(options.src); + let sources = []; + if (!src) + return; + if (typeof src === "string") + sources = [{ src }]; + else if (Array.isArray(src)) + sources = src; + else if (isObject(src)) + sources = [src]; + el.querySelectorAll("source").forEach((e) => { + e.removeEventListener("error", sourceErrorEvent.trigger); + e.remove(); + }); + sources.forEach(({ src: src2, type }) => { + const source = document2.createElement("source"); + source.setAttribute("src", src2); + source.setAttribute("type", type || ""); + source.addEventListener("error", sourceErrorEvent.trigger); + el.appendChild(source); + }); + el.load(); + }); + tryOnScopeDispose(() => { + const el = toValue(target); + if (!el) + return; + el.querySelectorAll("source").forEach((e) => e.removeEventListener("error", sourceErrorEvent.trigger)); + }); + watch([target, volume], () => { + const el = toValue(target); + if (!el) + return; + el.volume = volume.value; + }); + watch([target, muted], () => { + const el = toValue(target); + if (!el) + return; + el.muted = muted.value; + }); + watch([target, rate], () => { + const el = toValue(target); + if (!el) + return; + el.playbackRate = rate.value; + }); + watchEffect(() => { + if (!document2) + return; + const textTracks = toValue(options.tracks); + const el = toValue(target); + if (!textTracks || !textTracks.length || !el) + return; + el.querySelectorAll("track").forEach((e) => e.remove()); + textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => { + const track = document2.createElement("track"); + track.default = isDefault || false; + track.kind = kind; + track.label = label; + track.src = src; + track.srclang = srcLang; + if (track.default) + selectedTrack.value = i; + el.appendChild(track); + }); + }); + const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => { + const el = toValue(target); + if (!el) + return; + el.currentTime = time; + }); + const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => { + const el = toValue(target); + if (!el) + return; + isPlaying ? el.play() : el.pause(); + }); + useEventListener(target, "timeupdate", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime)); + useEventListener(target, "durationchange", () => duration.value = toValue(target).duration); + useEventListener(target, "progress", () => buffered.value = timeRangeToArray(toValue(target).buffered)); + useEventListener(target, "seeking", () => seeking.value = true); + useEventListener(target, "seeked", () => seeking.value = false); + useEventListener(target, ["waiting", "loadstart"], () => { + waiting.value = true; + ignorePlayingUpdates(() => playing.value = false); + }); + useEventListener(target, "loadeddata", () => waiting.value = false); + useEventListener(target, "playing", () => { + waiting.value = false; + ended.value = false; + ignorePlayingUpdates(() => playing.value = true); + }); + useEventListener(target, "ratechange", () => rate.value = toValue(target).playbackRate); + useEventListener(target, "stalled", () => stalled.value = true); + useEventListener(target, "ended", () => ended.value = true); + useEventListener(target, "pause", () => ignorePlayingUpdates(() => playing.value = false)); + useEventListener(target, "play", () => ignorePlayingUpdates(() => playing.value = true)); + useEventListener(target, "enterpictureinpicture", () => isPictureInPicture.value = true); + useEventListener(target, "leavepictureinpicture", () => isPictureInPicture.value = false); + useEventListener(target, "volumechange", () => { + const el = toValue(target); + if (!el) + return; + volume.value = el.volume; + muted.value = el.muted; + }); + const listeners = []; + const stop = watch([target], () => { + const el = toValue(target); + if (!el) + return; + stop(); + listeners[0] = useEventListener(el.textTracks, "addtrack", () => tracks.value = tracksToArray(el.textTracks)); + listeners[1] = useEventListener(el.textTracks, "removetrack", () => tracks.value = tracksToArray(el.textTracks)); + listeners[2] = useEventListener(el.textTracks, "change", () => tracks.value = tracksToArray(el.textTracks)); + }); + tryOnScopeDispose(() => listeners.forEach((listener) => listener())); + return { + currentTime, + duration, + waiting, + seeking, + ended, + stalled, + buffered, + playing, + rate, + // Volume + volume, + muted, + // Tracks + tracks, + selectedTrack, + enableTrack, + disableTrack, + // Picture in Picture + supportsPictureInPicture, + togglePictureInPicture, + isPictureInPicture, + // Events + onSourceError: sourceErrorEvent.on + }; +} +function getMapVue2Compat() { + const data = shallowReactive({}); + return { + get: (key) => data[key], + set: (key, value) => set3(data, key, value), + has: (key) => hasOwn(data, key), + delete: (key) => del(data, key), + clear: () => { + Object.keys(data).forEach((key) => { + del(data, key); + }); + } + }; +} +function useMemoize(resolver, options) { + const initCache = () => { + if (options == null ? void 0 : options.cache) + return shallowReactive(options.cache); + if (isVue22) + return getMapVue2Compat(); + return shallowReactive(/* @__PURE__ */ new Map()); + }; + const cache = initCache(); + const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args); + const _loadData = (key, ...args) => { + cache.set(key, resolver(...args)); + return cache.get(key); + }; + const loadData = (...args) => _loadData(generateKey(...args), ...args); + const deleteData = (...args) => { + cache.delete(generateKey(...args)); + }; + const clearData = () => { + cache.clear(); + }; + const memoized = (...args) => { + const key = generateKey(...args); + if (cache.has(key)) + return cache.get(key); + return _loadData(key, ...args); + }; + memoized.load = loadData; + memoized.delete = deleteData; + memoized.clear = clearData; + memoized.generateKey = generateKey; + memoized.cache = cache; + return memoized; +} +function useMemory(options = {}) { + const memory = ref(); + const isSupported = useSupported(() => typeof performance !== "undefined" && "memory" in performance); + if (isSupported.value) { + const { interval = 1e3 } = options; + useIntervalFn(() => { + memory.value = performance.memory; + }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback }); + } + return { isSupported, memory }; +} +var UseMouseBuiltinExtractors = { + page: (event) => [event.pageX, event.pageY], + client: (event) => [event.clientX, event.clientY], + screen: (event) => [event.screenX, event.screenY], + movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY] +}; +function useMouse(options = {}) { + const { + type = "page", + touch = true, + resetOnTouchEnds = false, + initialValue = { x: 0, y: 0 }, + window: window2 = defaultWindow, + target = window2, + scroll = true, + eventFilter + } = options; + let _prevMouseEvent = null; + const x = ref(initialValue.x); + const y = ref(initialValue.y); + const sourceType = ref(null); + const extractor = typeof type === "function" ? type : UseMouseBuiltinExtractors[type]; + const mouseHandler = (event) => { + const result = extractor(event); + _prevMouseEvent = event; + if (result) { + [x.value, y.value] = result; + sourceType.value = "mouse"; + } + }; + const touchHandler = (event) => { + if (event.touches.length > 0) { + const result = extractor(event.touches[0]); + if (result) { + [x.value, y.value] = result; + sourceType.value = "touch"; + } + } + }; + const scrollHandler = () => { + if (!_prevMouseEvent || !window2) + return; + const pos = extractor(_prevMouseEvent); + if (_prevMouseEvent instanceof MouseEvent && pos) { + x.value = pos[0] + window2.scrollX; + y.value = pos[1] + window2.scrollY; + } + }; + const reset = () => { + x.value = initialValue.x; + y.value = initialValue.y; + }; + const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event); + const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event); + const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler(); + if (target) { + const listenerOptions = { passive: true }; + useEventListener(target, ["mousemove", "dragover"], mouseHandlerWrapper, listenerOptions); + if (touch && type !== "movement") { + useEventListener(target, ["touchstart", "touchmove"], touchHandlerWrapper, listenerOptions); + if (resetOnTouchEnds) + useEventListener(target, "touchend", reset, listenerOptions); + } + if (scroll && type === "page") + useEventListener(window2, "scroll", scrollHandlerWrapper, { passive: true }); + } + return { + x, + y, + sourceType + }; +} +function useMouseInElement(target, options = {}) { + const { + handleOutside = true, + window: window2 = defaultWindow + } = options; + const type = options.type || "page"; + const { x, y, sourceType } = useMouse(options); + const targetRef = ref(target != null ? target : window2 == null ? void 0 : window2.document.body); + const elementX = ref(0); + const elementY = ref(0); + const elementPositionX = ref(0); + const elementPositionY = ref(0); + const elementHeight = ref(0); + const elementWidth = ref(0); + const isOutside = ref(true); + let stop = () => { + }; + if (window2) { + stop = watch( + [targetRef, x, y], + () => { + const el = unrefElement(targetRef); + if (!el) + return; + const { + left, + top, + width, + height + } = el.getBoundingClientRect(); + elementPositionX.value = left + (type === "page" ? window2.pageXOffset : 0); + elementPositionY.value = top + (type === "page" ? window2.pageYOffset : 0); + elementHeight.value = height; + elementWidth.value = width; + const elX = x.value - elementPositionX.value; + const elY = y.value - elementPositionY.value; + isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height; + if (handleOutside || !isOutside.value) { + elementX.value = elX; + elementY.value = elY; + } + }, + { immediate: true } + ); + useEventListener(document, "mouseleave", () => { + isOutside.value = true; + }); + } + return { + x, + y, + sourceType, + elementX, + elementY, + elementPositionX, + elementPositionY, + elementHeight, + elementWidth, + isOutside, + stop + }; +} +function useMousePressed(options = {}) { + const { + touch = true, + drag = true, + capture = false, + initialValue = false, + window: window2 = defaultWindow + } = options; + const pressed = ref(initialValue); + const sourceType = ref(null); + if (!window2) { + return { + pressed, + sourceType + }; + } + const onPressed = (srcType) => () => { + pressed.value = true; + sourceType.value = srcType; + }; + const onReleased = () => { + pressed.value = false; + sourceType.value = null; + }; + const target = computed(() => unrefElement(options.target) || window2); + useEventListener(target, "mousedown", onPressed("mouse"), { passive: true, capture }); + useEventListener(window2, "mouseleave", onReleased, { passive: true, capture }); + useEventListener(window2, "mouseup", onReleased, { passive: true, capture }); + if (drag) { + useEventListener(target, "dragstart", onPressed("mouse"), { passive: true, capture }); + useEventListener(window2, "drop", onReleased, { passive: true, capture }); + useEventListener(window2, "dragend", onReleased, { passive: true, capture }); + } + if (touch) { + useEventListener(target, "touchstart", onPressed("touch"), { passive: true, capture }); + useEventListener(window2, "touchend", onReleased, { passive: true, capture }); + useEventListener(window2, "touchcancel", onReleased, { passive: true, capture }); + } + return { + pressed, + sourceType + }; +} +function useNavigatorLanguage(options = {}) { + const { window: window2 = defaultWindow } = options; + const navigator = window2 == null ? void 0 : window2.navigator; + const isSupported = useSupported(() => navigator && "language" in navigator); + const language = ref(navigator == null ? void 0 : navigator.language); + useEventListener(window2, "languagechange", () => { + if (navigator) + language.value = navigator.language; + }); + return { + isSupported, + language + }; +} +function useNetwork(options = {}) { + const { window: window2 = defaultWindow } = options; + const navigator = window2 == null ? void 0 : window2.navigator; + const isSupported = useSupported(() => navigator && "connection" in navigator); + const isOnline = ref(true); + const saveData = ref(false); + const offlineAt = ref(void 0); + const onlineAt = ref(void 0); + const downlink = ref(void 0); + const downlinkMax = ref(void 0); + const rtt = ref(void 0); + const effectiveType = ref(void 0); + const type = ref("unknown"); + const connection = isSupported.value && navigator.connection; + function updateNetworkInformation() { + if (!navigator) + return; + isOnline.value = navigator.onLine; + offlineAt.value = isOnline.value ? void 0 : Date.now(); + onlineAt.value = isOnline.value ? Date.now() : void 0; + if (connection) { + downlink.value = connection.downlink; + downlinkMax.value = connection.downlinkMax; + effectiveType.value = connection.effectiveType; + rtt.value = connection.rtt; + saveData.value = connection.saveData; + type.value = connection.type; + } + } + if (window2) { + useEventListener(window2, "offline", () => { + isOnline.value = false; + offlineAt.value = Date.now(); + }); + useEventListener(window2, "online", () => { + isOnline.value = true; + onlineAt.value = Date.now(); + }); + } + if (connection) + useEventListener(connection, "change", updateNetworkInformation, false); + updateNetworkInformation(); + return { + isSupported, + isOnline, + saveData, + offlineAt, + onlineAt, + downlink, + downlinkMax, + effectiveType, + rtt, + type + }; +} +function useNow(options = {}) { + const { + controls: exposeControls = false, + interval = "requestAnimationFrame" + } = options; + const now2 = ref(/* @__PURE__ */ new Date()); + const update = () => now2.value = /* @__PURE__ */ new Date(); + const controls = interval === "requestAnimationFrame" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true }); + if (exposeControls) { + return { + now: now2, + ...controls + }; + } else { + return now2; + } +} +function useObjectUrl(object) { + const url = ref(); + const release = () => { + if (url.value) + URL.revokeObjectURL(url.value); + url.value = void 0; + }; + watch( + () => toValue(object), + (newObject) => { + release(); + if (newObject) + url.value = URL.createObjectURL(newObject); + }, + { immediate: true } + ); + tryOnScopeDispose(release); + return readonly(url); +} +function useClamp(value, min, max) { + if (typeof value === "function" || isReadonly(value)) + return computed(() => clamp(toValue(value), toValue(min), toValue(max))); + const _value = ref(value); + return computed({ + get() { + return _value.value = clamp(_value.value, toValue(min), toValue(max)); + }, + set(value2) { + _value.value = clamp(value2, toValue(min), toValue(max)); + } + }); +} +function useOffsetPagination(options) { + const { + total = Number.POSITIVE_INFINITY, + pageSize = 10, + page = 1, + onPageChange = noop, + onPageSizeChange = noop, + onPageCountChange = noop + } = options; + const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY); + const pageCount = computed(() => Math.max( + 1, + Math.ceil(toValue(total) / toValue(currentPageSize)) + )); + const currentPage = useClamp(page, 1, pageCount); + const isFirstPage = computed(() => currentPage.value === 1); + const isLastPage = computed(() => currentPage.value === pageCount.value); + if (isRef(page)) { + syncRef(page, currentPage, { + direction: isReadonly(page) ? "ltr" : "both" + }); + } + if (isRef(pageSize)) { + syncRef(pageSize, currentPageSize, { + direction: isReadonly(pageSize) ? "ltr" : "both" + }); + } + function prev() { + currentPage.value--; + } + function next() { + currentPage.value++; + } + const returnValue = { + currentPage, + currentPageSize, + pageCount, + isFirstPage, + isLastPage, + prev, + next + }; + watch(currentPage, () => { + onPageChange(reactive(returnValue)); + }); + watch(currentPageSize, () => { + onPageSizeChange(reactive(returnValue)); + }); + watch(pageCount, () => { + onPageCountChange(reactive(returnValue)); + }); + return returnValue; +} +function useOnline(options = {}) { + const { isOnline } = useNetwork(options); + return isOnline; +} +function usePageLeave(options = {}) { + const { window: window2 = defaultWindow } = options; + const isLeft = ref(false); + const handler = (event) => { + if (!window2) + return; + event = event || window2.event; + const from = event.relatedTarget || event.toElement; + isLeft.value = !from; + }; + if (window2) { + useEventListener(window2, "mouseout", handler, { passive: true }); + useEventListener(window2.document, "mouseleave", handler, { passive: true }); + useEventListener(window2.document, "mouseenter", handler, { passive: true }); + } + return isLeft; +} +function useScreenOrientation(options = {}) { + const { + window: window2 = defaultWindow + } = options; + const isSupported = useSupported(() => window2 && "screen" in window2 && "orientation" in window2.screen); + const screenOrientation = isSupported.value ? window2.screen.orientation : {}; + const orientation = ref(screenOrientation.type); + const angle = ref(screenOrientation.angle || 0); + if (isSupported.value) { + useEventListener(window2, "orientationchange", () => { + orientation.value = screenOrientation.type; + angle.value = screenOrientation.angle; + }); + } + const lockOrientation = (type) => { + if (isSupported.value && typeof screenOrientation.lock === "function") + return screenOrientation.lock(type); + return Promise.reject(new Error("Not supported")); + }; + const unlockOrientation = () => { + if (isSupported.value && typeof screenOrientation.unlock === "function") + screenOrientation.unlock(); + }; + return { + isSupported, + orientation, + angle, + lockOrientation, + unlockOrientation + }; +} +function useParallax(target, options = {}) { + const { + deviceOrientationTiltAdjust = (i) => i, + deviceOrientationRollAdjust = (i) => i, + mouseTiltAdjust = (i) => i, + mouseRollAdjust = (i) => i, + window: window2 = defaultWindow + } = options; + const orientation = reactive(useDeviceOrientation({ window: window2 })); + const screenOrientation = reactive(useScreenOrientation({ window: window2 })); + const { + elementX: x, + elementY: y, + elementWidth: width, + elementHeight: height + } = useMouseInElement(target, { handleOutside: false, window: window2 }); + const source = computed(() => { + if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) { + return "deviceOrientation"; + } + return "mouse"; + }); + const roll = computed(() => { + if (source.value === "deviceOrientation") { + let value; + switch (screenOrientation.orientation) { + case "landscape-primary": + value = orientation.gamma / 90; + break; + case "landscape-secondary": + value = -orientation.gamma / 90; + break; + case "portrait-primary": + value = -orientation.beta / 90; + break; + case "portrait-secondary": + value = orientation.beta / 90; + break; + default: + value = -orientation.beta / 90; + } + return deviceOrientationRollAdjust(value); + } else { + const value = -(y.value - height.value / 2) / height.value; + return mouseRollAdjust(value); + } + }); + const tilt = computed(() => { + if (source.value === "deviceOrientation") { + let value; + switch (screenOrientation.orientation) { + case "landscape-primary": + value = orientation.beta / 90; + break; + case "landscape-secondary": + value = -orientation.beta / 90; + break; + case "portrait-primary": + value = orientation.gamma / 90; + break; + case "portrait-secondary": + value = -orientation.gamma / 90; + break; + default: + value = orientation.gamma / 90; + } + return deviceOrientationTiltAdjust(value); + } else { + const value = (x.value - width.value / 2) / width.value; + return mouseTiltAdjust(value); + } + }); + return { roll, tilt, source }; +} +function useParentElement(element = useCurrentElement()) { + const parentElement = shallowRef(); + const update = () => { + const el = unrefElement(element); + if (el) + parentElement.value = el.parentElement; + }; + tryOnMounted(update); + watch(() => toValue(element), update); + return parentElement; +} +function usePerformanceObserver(options, callback) { + const { + window: window2 = defaultWindow, + immediate = true, + ...performanceOptions + } = options; + const isSupported = useSupported(() => window2 && "PerformanceObserver" in window2); + let observer; + const stop = () => { + observer == null ? void 0 : observer.disconnect(); + }; + const start = () => { + if (isSupported.value) { + stop(); + observer = new PerformanceObserver(callback); + observer.observe(performanceOptions); + } + }; + tryOnScopeDispose(stop); + if (immediate) + start(); + return { + isSupported, + start, + stop + }; +} +var defaultState = { + x: 0, + y: 0, + pointerId: 0, + pressure: 0, + tiltX: 0, + tiltY: 0, + width: 0, + height: 0, + twist: 0, + pointerType: null +}; +var keys = Object.keys(defaultState); +function usePointer(options = {}) { + const { + target = defaultWindow + } = options; + const isInside = ref(false); + const state = ref(options.initialValue || {}); + Object.assign(state.value, defaultState, state.value); + const handler = (event) => { + isInside.value = true; + if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType)) + return; + state.value = objectPick(event, keys, false); + }; + if (target) { + const listenerOptions = { passive: true }; + useEventListener(target, ["pointerdown", "pointermove", "pointerup"], handler, listenerOptions); + useEventListener(target, "pointerleave", () => isInside.value = false, listenerOptions); + } + return { + ...toRefs2(state), + isInside + }; +} +function usePointerLock(target, options = {}) { + const { document: document2 = defaultDocument } = options; + const isSupported = useSupported(() => document2 && "pointerLockElement" in document2); + const element = ref(); + const triggerElement = ref(); + let targetElement; + if (isSupported.value) { + useEventListener(document2, "pointerlockchange", () => { + var _a; + const currentElement = (_a = document2.pointerLockElement) != null ? _a : element.value; + if (targetElement && currentElement === targetElement) { + element.value = document2.pointerLockElement; + if (!element.value) + targetElement = triggerElement.value = null; + } + }); + useEventListener(document2, "pointerlockerror", () => { + var _a; + const currentElement = (_a = document2.pointerLockElement) != null ? _a : element.value; + if (targetElement && currentElement === targetElement) { + const action = document2.pointerLockElement ? "release" : "acquire"; + throw new Error(`Failed to ${action} pointer lock.`); + } + }); + } + async function lock(e) { + var _a; + if (!isSupported.value) + throw new Error("Pointer Lock API is not supported by your browser."); + triggerElement.value = e instanceof Event ? e.currentTarget : null; + targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e); + if (!targetElement) + throw new Error("Target element undefined."); + targetElement.requestPointerLock(); + return await until(element).toBe(targetElement); + } + async function unlock() { + if (!element.value) + return false; + document2.exitPointerLock(); + await until(element).toBeNull(); + return true; + } + return { + isSupported, + element, + triggerElement, + lock, + unlock + }; +} +function usePointerSwipe(target, options = {}) { + const targetRef = toRef2(target); + const { + threshold = 50, + onSwipe, + onSwipeEnd, + onSwipeStart, + disableTextSelect = false + } = options; + const posStart = reactive({ x: 0, y: 0 }); + const updatePosStart = (x, y) => { + posStart.x = x; + posStart.y = y; + }; + const posEnd = reactive({ x: 0, y: 0 }); + const updatePosEnd = (x, y) => { + posEnd.x = x; + posEnd.y = y; + }; + const distanceX = computed(() => posStart.x - posEnd.x); + const distanceY = computed(() => posStart.y - posEnd.y); + const { max, abs } = Math; + const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold); + const isSwiping = ref(false); + const isPointerDown = ref(false); + const direction = computed(() => { + if (!isThresholdExceeded.value) + return "none"; + if (abs(distanceX.value) > abs(distanceY.value)) { + return distanceX.value > 0 ? "left" : "right"; + } else { + return distanceY.value > 0 ? "up" : "down"; + } + }); + const eventIsAllowed = (e) => { + var _a, _b, _c; + const isReleasingButton = e.buttons === 0; + const isPrimaryButton = e.buttons === 1; + return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true; + }; + const stops = [ + useEventListener(target, "pointerdown", (e) => { + if (!eventIsAllowed(e)) + return; + isPointerDown.value = true; + const eventTarget = e.target; + eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId); + const { clientX: x, clientY: y } = e; + updatePosStart(x, y); + updatePosEnd(x, y); + onSwipeStart == null ? void 0 : onSwipeStart(e); + }), + useEventListener(target, "pointermove", (e) => { + if (!eventIsAllowed(e)) + return; + if (!isPointerDown.value) + return; + const { clientX: x, clientY: y } = e; + updatePosEnd(x, y); + if (!isSwiping.value && isThresholdExceeded.value) + isSwiping.value = true; + if (isSwiping.value) + onSwipe == null ? void 0 : onSwipe(e); + }), + useEventListener(target, "pointerup", (e) => { + if (!eventIsAllowed(e)) + return; + if (isSwiping.value) + onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value); + isPointerDown.value = false; + isSwiping.value = false; + }) + ]; + tryOnMounted(() => { + var _a, _b, _c, _d, _e, _f, _g, _h; + (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "none"); + if (disableTextSelect) { + (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty("-webkit-user-select", "none"); + (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty("-ms-user-select", "none"); + (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty("user-select", "none"); + } + }); + const stop = () => stops.forEach((s) => s()); + return { + isSwiping: readonly(isSwiping), + direction: readonly(direction), + posStart: readonly(posStart), + posEnd: readonly(posEnd), + distanceX, + distanceY, + stop + }; +} +function usePreferredColorScheme(options) { + const isLight = useMediaQuery("(prefers-color-scheme: light)", options); + const isDark = useMediaQuery("(prefers-color-scheme: dark)", options); + return computed(() => { + if (isDark.value) + return "dark"; + if (isLight.value) + return "light"; + return "no-preference"; + }); +} +function usePreferredContrast(options) { + const isMore = useMediaQuery("(prefers-contrast: more)", options); + const isLess = useMediaQuery("(prefers-contrast: less)", options); + const isCustom = useMediaQuery("(prefers-contrast: custom)", options); + return computed(() => { + if (isMore.value) + return "more"; + if (isLess.value) + return "less"; + if (isCustom.value) + return "custom"; + return "no-preference"; + }); +} +function usePreferredLanguages(options = {}) { + const { window: window2 = defaultWindow } = options; + if (!window2) + return ref(["en"]); + const navigator = window2.navigator; + const value = ref(navigator.languages); + useEventListener(window2, "languagechange", () => { + value.value = navigator.languages; + }); + return value; +} +function usePreferredReducedMotion(options) { + const isReduced = useMediaQuery("(prefers-reduced-motion: reduce)", options); + return computed(() => { + if (isReduced.value) + return "reduce"; + return "no-preference"; + }); +} +function usePrevious(value, initialValue) { + const previous = shallowRef(initialValue); + watch( + toRef2(value), + (_, oldValue) => { + previous.value = oldValue; + }, + { flush: "sync" } + ); + return readonly(previous); +} +var topVarName = "--vueuse-safe-area-top"; +var rightVarName = "--vueuse-safe-area-right"; +var bottomVarName = "--vueuse-safe-area-bottom"; +var leftVarName = "--vueuse-safe-area-left"; +function useScreenSafeArea() { + const top = ref(""); + const right = ref(""); + const bottom = ref(""); + const left = ref(""); + if (isClient) { + const topCssVar = useCssVar(topVarName); + const rightCssVar = useCssVar(rightVarName); + const bottomCssVar = useCssVar(bottomVarName); + const leftCssVar = useCssVar(leftVarName); + topCssVar.value = "env(safe-area-inset-top, 0px)"; + rightCssVar.value = "env(safe-area-inset-right, 0px)"; + bottomCssVar.value = "env(safe-area-inset-bottom, 0px)"; + leftCssVar.value = "env(safe-area-inset-left, 0px)"; + update(); + useEventListener("resize", useDebounceFn(update)); + } + function update() { + top.value = getValue(topVarName); + right.value = getValue(rightVarName); + bottom.value = getValue(bottomVarName); + left.value = getValue(leftVarName); + } + return { + top, + right, + bottom, + left, + update + }; +} +function getValue(position) { + return getComputedStyle(document.documentElement).getPropertyValue(position); +} +function useScriptTag(src, onLoaded = noop, options = {}) { + const { + immediate = true, + manual = false, + type = "text/javascript", + async = true, + crossOrigin, + referrerPolicy, + noModule, + defer, + document: document2 = defaultDocument, + attrs = {} + } = options; + const scriptTag = ref(null); + let _promise = null; + const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => { + const resolveWithElement = (el2) => { + scriptTag.value = el2; + resolve(el2); + return el2; + }; + if (!document2) { + resolve(false); + return; + } + let shouldAppend = false; + let el = document2.querySelector(`script[src="${toValue(src)}"]`); + if (!el) { + el = document2.createElement("script"); + el.type = type; + el.async = async; + el.src = toValue(src); + if (defer) + el.defer = defer; + if (crossOrigin) + el.crossOrigin = crossOrigin; + if (noModule) + el.noModule = noModule; + if (referrerPolicy) + el.referrerPolicy = referrerPolicy; + Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value)); + shouldAppend = true; + } else if (el.hasAttribute("data-loaded")) { + resolveWithElement(el); + } + el.addEventListener("error", (event) => reject(event)); + el.addEventListener("abort", (event) => reject(event)); + el.addEventListener("load", () => { + el.setAttribute("data-loaded", "true"); + onLoaded(el); + resolveWithElement(el); + }); + if (shouldAppend) + el = document2.head.appendChild(el); + if (!waitForScriptLoad) + resolveWithElement(el); + }); + const load = (waitForScriptLoad = true) => { + if (!_promise) + _promise = loadScript(waitForScriptLoad); + return _promise; + }; + const unload = () => { + if (!document2) + return; + _promise = null; + if (scriptTag.value) + scriptTag.value = null; + const el = document2.querySelector(`script[src="${toValue(src)}"]`); + if (el) + document2.head.removeChild(el); + }; + if (immediate && !manual) + tryOnMounted(load); + if (!manual) + tryOnUnmounted(unload); + return { scriptTag, load, unload }; +} +function checkOverflowScroll(ele) { + const style = window.getComputedStyle(ele); + if (style.overflowX === "scroll" || style.overflowY === "scroll" || style.overflowX === "auto" && ele.clientWidth < ele.scrollWidth || style.overflowY === "auto" && ele.clientHeight < ele.scrollHeight) { + return true; + } else { + const parent = ele.parentNode; + if (!parent || parent.tagName === "BODY") + return false; + return checkOverflowScroll(parent); + } +} +function preventDefault(rawEvent) { + const e = rawEvent || window.event; + const _target = e.target; + if (checkOverflowScroll(_target)) + return false; + if (e.touches.length > 1) + return true; + if (e.preventDefault) + e.preventDefault(); + return false; +} +var elInitialOverflow = /* @__PURE__ */ new WeakMap(); +function useScrollLock(element, initialState = false) { + const isLocked = ref(initialState); + let stopTouchMoveListener = null; + let initialOverflow = ""; + watch(toRef2(element), (el) => { + const target = resolveElement(toValue(el)); + if (target) { + const ele = target; + if (!elInitialOverflow.get(ele)) + elInitialOverflow.set(ele, ele.style.overflow); + if (ele.style.overflow !== "hidden") + initialOverflow = ele.style.overflow; + if (ele.style.overflow === "hidden") + return isLocked.value = true; + if (isLocked.value) + return ele.style.overflow = "hidden"; + } + }, { + immediate: true + }); + const lock = () => { + const el = resolveElement(toValue(element)); + if (!el || isLocked.value) + return; + if (isIOS) { + stopTouchMoveListener = useEventListener( + el, + "touchmove", + (e) => { + preventDefault(e); + }, + { passive: false } + ); + } + el.style.overflow = "hidden"; + isLocked.value = true; + }; + const unlock = () => { + const el = resolveElement(toValue(element)); + if (!el || !isLocked.value) + return; + isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener()); + el.style.overflow = initialOverflow; + elInitialOverflow.delete(el); + isLocked.value = false; + }; + tryOnScopeDispose(unlock); + return computed({ + get() { + return isLocked.value; + }, + set(v) { + if (v) + lock(); + else unlock(); + } + }); +} +function useSessionStorage(key, initialValue, options = {}) { + const { window: window2 = defaultWindow } = options; + return useStorage(key, initialValue, window2 == null ? void 0 : window2.sessionStorage, options); +} +function useShare(shareOptions = {}, options = {}) { + const { navigator = defaultNavigator } = options; + const _navigator = navigator; + const isSupported = useSupported(() => _navigator && "canShare" in _navigator); + const share = async (overrideOptions = {}) => { + if (isSupported.value) { + const data = { + ...toValue(shareOptions), + ...toValue(overrideOptions) + }; + let granted = true; + if (data.files && _navigator.canShare) + granted = _navigator.canShare({ files: data.files }); + if (granted) + return _navigator.share(data); + } + }; + return { + isSupported, + share + }; +} +var defaultSortFn = (source, compareFn) => source.sort(compareFn); +var defaultCompare = (a, b) => a - b; +function useSorted(...args) { + var _a, _b, _c, _d; + const [source] = args; + let compareFn = defaultCompare; + let options = {}; + if (args.length === 2) { + if (typeof args[1] === "object") { + options = args[1]; + compareFn = (_a = options.compareFn) != null ? _a : defaultCompare; + } else { + compareFn = (_b = args[1]) != null ? _b : defaultCompare; + } + } else if (args.length > 2) { + compareFn = (_c = args[1]) != null ? _c : defaultCompare; + options = (_d = args[2]) != null ? _d : {}; + } + const { + dirty = false, + sortFn = defaultSortFn + } = options; + if (!dirty) + return computed(() => sortFn([...toValue(source)], compareFn)); + watchEffect(() => { + const result = sortFn(toValue(source), compareFn); + if (isRef(source)) + source.value = result; + else + source.splice(0, source.length, ...result); + }); + return source; +} +function useSpeechRecognition(options = {}) { + const { + interimResults = true, + continuous = true, + window: window2 = defaultWindow + } = options; + const lang = toRef2(options.lang || "en-US"); + const isListening = ref(false); + const isFinal = ref(false); + const result = ref(""); + const error = shallowRef(void 0); + const toggle = (value = !isListening.value) => { + isListening.value = value; + }; + const start = () => { + isListening.value = true; + }; + const stop = () => { + isListening.value = false; + }; + const SpeechRecognition = window2 && (window2.SpeechRecognition || window2.webkitSpeechRecognition); + const isSupported = useSupported(() => SpeechRecognition); + let recognition; + if (isSupported.value) { + recognition = new SpeechRecognition(); + recognition.continuous = continuous; + recognition.interimResults = interimResults; + recognition.lang = toValue(lang); + recognition.onstart = () => { + isFinal.value = false; + }; + watch(lang, (lang2) => { + if (recognition && !isListening.value) + recognition.lang = lang2; + }); + recognition.onresult = (event) => { + const currentResult = event.results[event.resultIndex]; + const { transcript } = currentResult[0]; + isFinal.value = currentResult.isFinal; + result.value = transcript; + error.value = void 0; + }; + recognition.onerror = (event) => { + error.value = event; + }; + recognition.onend = () => { + isListening.value = false; + recognition.lang = toValue(lang); + }; + watch(isListening, () => { + if (isListening.value) + recognition.start(); + else + recognition.stop(); + }); + } + tryOnScopeDispose(() => { + isListening.value = false; + }); + return { + isSupported, + isListening, + isFinal, + recognition, + result, + error, + toggle, + start, + stop + }; +} +function useSpeechSynthesis(text, options = {}) { + const { + pitch = 1, + rate = 1, + volume = 1, + window: window2 = defaultWindow + } = options; + const synth = window2 && window2.speechSynthesis; + const isSupported = useSupported(() => synth); + const isPlaying = ref(false); + const status = ref("init"); + const spokenText = toRef2(text || ""); + const lang = toRef2(options.lang || "en-US"); + const error = shallowRef(void 0); + const toggle = (value = !isPlaying.value) => { + isPlaying.value = value; + }; + const bindEventsForUtterance = (utterance2) => { + utterance2.lang = toValue(lang); + utterance2.voice = toValue(options.voice) || null; + utterance2.pitch = toValue(pitch); + utterance2.rate = toValue(rate); + utterance2.volume = volume; + utterance2.onstart = () => { + isPlaying.value = true; + status.value = "play"; + }; + utterance2.onpause = () => { + isPlaying.value = false; + status.value = "pause"; + }; + utterance2.onresume = () => { + isPlaying.value = true; + status.value = "play"; + }; + utterance2.onend = () => { + isPlaying.value = false; + status.value = "end"; + }; + utterance2.onerror = (event) => { + error.value = event; + }; + }; + const utterance = computed(() => { + isPlaying.value = false; + status.value = "init"; + const newUtterance = new SpeechSynthesisUtterance(spokenText.value); + bindEventsForUtterance(newUtterance); + return newUtterance; + }); + const speak = () => { + synth.cancel(); + utterance && synth.speak(utterance.value); + }; + const stop = () => { + synth.cancel(); + isPlaying.value = false; + }; + if (isSupported.value) { + bindEventsForUtterance(utterance.value); + watch(lang, (lang2) => { + if (utterance.value && !isPlaying.value) + utterance.value.lang = lang2; + }); + if (options.voice) { + watch(options.voice, () => { + synth.cancel(); + }); + } + watch(isPlaying, () => { + if (isPlaying.value) + synth.resume(); + else + synth.pause(); + }); + } + tryOnScopeDispose(() => { + isPlaying.value = false; + }); + return { + isSupported, + isPlaying, + status, + utterance, + error, + stop, + toggle, + speak + }; +} +function useStepper(steps, initialStep) { + const stepsRef = ref(steps); + const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value)); + const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0])); + const current = computed(() => at(index.value)); + const isFirst = computed(() => index.value === 0); + const isLast = computed(() => index.value === stepNames.value.length - 1); + const next = computed(() => stepNames.value[index.value + 1]); + const previous = computed(() => stepNames.value[index.value - 1]); + function at(index2) { + if (Array.isArray(stepsRef.value)) + return stepsRef.value[index2]; + return stepsRef.value[stepNames.value[index2]]; + } + function get2(step) { + if (!stepNames.value.includes(step)) + return; + return at(stepNames.value.indexOf(step)); + } + function goTo(step) { + if (stepNames.value.includes(step)) + index.value = stepNames.value.indexOf(step); + } + function goToNext() { + if (isLast.value) + return; + index.value++; + } + function goToPrevious() { + if (isFirst.value) + return; + index.value--; + } + function goBackTo(step) { + if (isAfter(step)) + goTo(step); + } + function isNext(step) { + return stepNames.value.indexOf(step) === index.value + 1; + } + function isPrevious(step) { + return stepNames.value.indexOf(step) === index.value - 1; + } + function isCurrent(step) { + return stepNames.value.indexOf(step) === index.value; + } + function isBefore(step) { + return index.value < stepNames.value.indexOf(step); + } + function isAfter(step) { + return index.value > stepNames.value.indexOf(step); + } + return { + steps: stepsRef, + stepNames, + index, + current, + next, + previous, + isFirst, + isLast, + at, + get: get2, + goTo, + goToNext, + goToPrevious, + goBackTo, + isNext, + isPrevious, + isCurrent, + isBefore, + isAfter + }; +} +function useStorageAsync(key, initialValue, storage, options = {}) { + var _a; + const { + flush = "pre", + deep = true, + listenToStorageChanges = true, + writeDefaults = true, + mergeDefaults = false, + shallow, + window: window2 = defaultWindow, + eventFilter, + onError = (e) => { + console.error(e); + } + } = options; + const rawInit = toValue(initialValue); + const type = guessSerializerType(rawInit); + const data = (shallow ? shallowRef : ref)(initialValue); + const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; + if (!storage) { + try { + storage = getSSRHandler("getDefaultStorageAsync", () => { + var _a2; + return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; + })(); + } catch (e) { + onError(e); + } + } + async function read(event) { + if (!storage || event && event.key !== key) + return; + try { + const rawValue = event ? event.newValue : await storage.getItem(key); + if (rawValue == null) { + data.value = rawInit; + if (writeDefaults && rawInit !== null) + await storage.setItem(key, await serializer.write(rawInit)); + } else if (mergeDefaults) { + const value = await serializer.read(rawValue); + if (typeof mergeDefaults === "function") + data.value = mergeDefaults(value, rawInit); + else if (type === "object" && !Array.isArray(value)) + data.value = { ...rawInit, ...value }; + else data.value = value; + } else { + data.value = await serializer.read(rawValue); + } + } catch (e) { + onError(e); + } + } + read(); + if (window2 && listenToStorageChanges) + useEventListener(window2, "storage", (e) => Promise.resolve().then(() => read(e))); + if (storage) { + watchWithFilter( + data, + async () => { + try { + if (data.value == null) + await storage.removeItem(key); + else + await storage.setItem(key, await serializer.write(data.value)); + } catch (e) { + onError(e); + } + }, + { + flush, + deep, + eventFilter + } + ); + } + return data; +} +var _id = 0; +function useStyleTag(css, options = {}) { + const isLoaded = ref(false); + const { + document: document2 = defaultDocument, + immediate = true, + manual = false, + id = `vueuse_styletag_${++_id}` + } = options; + const cssRef = ref(css); + let stop = () => { + }; + const load = () => { + if (!document2) + return; + const el = document2.getElementById(id) || document2.createElement("style"); + if (!el.isConnected) { + el.id = id; + if (options.media) + el.media = options.media; + document2.head.appendChild(el); + } + if (isLoaded.value) + return; + stop = watch( + cssRef, + (value) => { + el.textContent = value; + }, + { immediate: true } + ); + isLoaded.value = true; + }; + const unload = () => { + if (!document2 || !isLoaded.value) + return; + stop(); + document2.head.removeChild(document2.getElementById(id)); + isLoaded.value = false; + }; + if (immediate && !manual) + tryOnMounted(load); + if (!manual) + tryOnScopeDispose(unload); + return { + id, + css: cssRef, + unload, + load, + isLoaded: readonly(isLoaded) + }; +} +function useSwipe(target, options = {}) { + const { + threshold = 50, + onSwipe, + onSwipeEnd, + onSwipeStart, + passive = true, + window: window2 = defaultWindow + } = options; + const coordsStart = reactive({ x: 0, y: 0 }); + const coordsEnd = reactive({ x: 0, y: 0 }); + const diffX = computed(() => coordsStart.x - coordsEnd.x); + const diffY = computed(() => coordsStart.y - coordsEnd.y); + const { max, abs } = Math; + const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold); + const isSwiping = ref(false); + const direction = computed(() => { + if (!isThresholdExceeded.value) + return "none"; + if (abs(diffX.value) > abs(diffY.value)) { + return diffX.value > 0 ? "left" : "right"; + } else { + return diffY.value > 0 ? "up" : "down"; + } + }); + const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY]; + const updateCoordsStart = (x, y) => { + coordsStart.x = x; + coordsStart.y = y; + }; + const updateCoordsEnd = (x, y) => { + coordsEnd.x = x; + coordsEnd.y = y; + }; + let listenerOptions; + const isPassiveEventSupported = checkPassiveEventSupport(window2 == null ? void 0 : window2.document); + if (!passive) + listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true }; + else + listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false }; + const onTouchEnd = (e) => { + if (isSwiping.value) + onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value); + isSwiping.value = false; + }; + const stops = [ + useEventListener(target, "touchstart", (e) => { + if (e.touches.length !== 1) + return; + if (listenerOptions.capture && !listenerOptions.passive) + e.preventDefault(); + const [x, y] = getTouchEventCoords(e); + updateCoordsStart(x, y); + updateCoordsEnd(x, y); + onSwipeStart == null ? void 0 : onSwipeStart(e); + }, listenerOptions), + useEventListener(target, "touchmove", (e) => { + if (e.touches.length !== 1) + return; + const [x, y] = getTouchEventCoords(e); + updateCoordsEnd(x, y); + if (!isSwiping.value && isThresholdExceeded.value) + isSwiping.value = true; + if (isSwiping.value) + onSwipe == null ? void 0 : onSwipe(e); + }, listenerOptions), + useEventListener(target, ["touchend", "touchcancel"], onTouchEnd, listenerOptions) + ]; + const stop = () => stops.forEach((s) => s()); + return { + isPassiveEventSupported, + isSwiping, + direction, + coordsStart, + coordsEnd, + lengthX: diffX, + lengthY: diffY, + stop + }; +} +function checkPassiveEventSupport(document2) { + if (!document2) + return false; + let supportsPassive = false; + const optionsBlock = { + get passive() { + supportsPassive = true; + return false; + } + }; + document2.addEventListener("x", noop, optionsBlock); + document2.removeEventListener("x", noop); + return supportsPassive; +} +function useTemplateRefsList() { + const refs = ref([]); + refs.value.set = (el) => { + if (el) + refs.value.push(el); + }; + onBeforeUpdate(() => { + refs.value.length = 0; + }); + return refs; +} +function useTextDirection(options = {}) { + const { + document: document2 = defaultDocument, + selector = "html", + observe = false, + initialValue = "ltr" + } = options; + function getValue2() { + var _a, _b; + return (_b = (_a = document2 == null ? void 0 : document2.querySelector(selector)) == null ? void 0 : _a.getAttribute("dir")) != null ? _b : initialValue; + } + const dir = ref(getValue2()); + tryOnMounted(() => dir.value = getValue2()); + if (observe && document2) { + useMutationObserver( + document2.querySelector(selector), + () => dir.value = getValue2(), + { attributes: true } + ); + } + return computed({ + get() { + return dir.value; + }, + set(v) { + var _a, _b; + dir.value = v; + if (!document2) + return; + if (dir.value) + (_a = document2.querySelector(selector)) == null ? void 0 : _a.setAttribute("dir", dir.value); + else + (_b = document2.querySelector(selector)) == null ? void 0 : _b.removeAttribute("dir"); + } + }); +} +function getRangesFromSelection(selection) { + var _a; + const rangeCount = (_a = selection.rangeCount) != null ? _a : 0; + return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i)); +} +function useTextSelection(options = {}) { + const { + window: window2 = defaultWindow + } = options; + const selection = ref(null); + const text = computed(() => { + var _a, _b; + return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : ""; + }); + const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []); + const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect())); + function onSelectionChange() { + selection.value = null; + if (window2) + selection.value = window2.getSelection(); + } + if (window2) + useEventListener(window2.document, "selectionchange", onSelectionChange); + return { + text, + rects, + ranges, + selection + }; +} +function useTextareaAutosize(options) { + var _a; + const textarea = ref(options == null ? void 0 : options.element); + const input = ref(options == null ? void 0 : options.input); + const styleProp = (_a = options == null ? void 0 : options.styleProp) != null ? _a : "height"; + const textareaScrollHeight = ref(1); + function triggerResize() { + var _a2; + if (!textarea.value) + return; + let height = ""; + textarea.value.style[styleProp] = "1px"; + textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight; + if (options == null ? void 0 : options.styleTarget) + toValue(options.styleTarget).style[styleProp] = `${textareaScrollHeight.value}px`; + else + height = `${textareaScrollHeight.value}px`; + textarea.value.style[styleProp] = height; + } + watch([input, textarea], () => nextTick(triggerResize), { immediate: true }); + watch(textareaScrollHeight, () => { + var _a2; + return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options); + }); + useResizeObserver(textarea, () => triggerResize()); + if (options == null ? void 0 : options.watch) + watch(options.watch, triggerResize, { immediate: true, deep: true }); + return { + textarea, + input, + triggerResize + }; +} +function useThrottledRefHistory(source, options = {}) { + const { throttle = 200, trailing = true } = options; + const filter = throttleFilter(throttle, trailing); + const history = useRefHistory(source, { ...options, eventFilter: filter }); + return { + ...history + }; +} +var DEFAULT_UNITS = [ + { max: 6e4, value: 1e3, name: "second" }, + { max: 276e4, value: 6e4, name: "minute" }, + { max: 72e6, value: 36e5, name: "hour" }, + { max: 5184e5, value: 864e5, name: "day" }, + { max: 24192e5, value: 6048e5, name: "week" }, + { max: 28512e6, value: 2592e6, name: "month" }, + { max: Number.POSITIVE_INFINITY, value: 31536e6, name: "year" } +]; +var DEFAULT_MESSAGES = { + justNow: "just now", + past: (n) => n.match(/\d/) ? `${n} ago` : n, + future: (n) => n.match(/\d/) ? `in ${n}` : n, + month: (n, past) => n === 1 ? past ? "last month" : "next month" : `${n} month${n > 1 ? "s" : ""}`, + year: (n, past) => n === 1 ? past ? "last year" : "next year" : `${n} year${n > 1 ? "s" : ""}`, + day: (n, past) => n === 1 ? past ? "yesterday" : "tomorrow" : `${n} day${n > 1 ? "s" : ""}`, + week: (n, past) => n === 1 ? past ? "last week" : "next week" : `${n} week${n > 1 ? "s" : ""}`, + hour: (n) => `${n} hour${n > 1 ? "s" : ""}`, + minute: (n) => `${n} minute${n > 1 ? "s" : ""}`, + second: (n) => `${n} second${n > 1 ? "s" : ""}`, + invalid: "" +}; +function DEFAULT_FORMATTER(date) { + return date.toISOString().slice(0, 10); +} +function useTimeAgo(time, options = {}) { + const { + controls: exposeControls = false, + updateInterval = 3e4 + } = options; + const { now: now2, ...controls } = useNow({ interval: updateInterval, controls: true }); + const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now2))); + if (exposeControls) { + return { + timeAgo, + ...controls + }; + } else { + return timeAgo; + } +} +function formatTimeAgo(from, options = {}, now2 = Date.now()) { + var _a; + const { + max, + messages = DEFAULT_MESSAGES, + fullDateFormatter = DEFAULT_FORMATTER, + units = DEFAULT_UNITS, + showSecond = false, + rounding = "round" + } = options; + const roundFn = typeof rounding === "number" ? (n) => +n.toFixed(rounding) : Math[rounding]; + const diff = +now2 - +from; + const absDiff = Math.abs(diff); + function getValue2(diff2, unit) { + return roundFn(Math.abs(diff2) / unit.value); + } + function format(diff2, unit) { + const val = getValue2(diff2, unit); + const past = diff2 > 0; + const str = applyFormat(unit.name, val, past); + return applyFormat(past ? "past" : "future", str, past); + } + function applyFormat(name, val, isPast) { + const formatter = messages[name]; + if (typeof formatter === "function") + return formatter(val, isPast); + return formatter.replace("{0}", val.toString()); + } + if (absDiff < 6e4 && !showSecond) + return messages.justNow; + if (typeof max === "number" && absDiff > max) + return fullDateFormatter(new Date(from)); + if (typeof max === "string") { + const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max; + if (unitMax && absDiff > unitMax) + return fullDateFormatter(new Date(from)); + } + for (const [idx, unit] of units.entries()) { + const val = getValue2(diff, unit); + if (val <= 0 && units[idx - 1]) + return format(diff, units[idx - 1]); + if (absDiff < unit.max) + return format(diff, unit); + } + return messages.invalid; +} +function useTimeoutPoll(fn, interval, timeoutPollOptions) { + const { start } = useTimeoutFn(loop, interval, { immediate: false }); + const isActive = ref(false); + async function loop() { + if (!isActive.value) + return; + await fn(); + start(); + } + function resume() { + if (!isActive.value) { + isActive.value = true; + loop(); + } + } + function pause() { + isActive.value = false; + } + if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate) + resume(); + tryOnScopeDispose(pause); + return { + isActive, + pause, + resume + }; +} +function useTimestamp(options = {}) { + const { + controls: exposeControls = false, + offset = 0, + immediate = true, + interval = "requestAnimationFrame", + callback + } = options; + const ts = ref(timestamp() + offset); + const update = () => ts.value = timestamp() + offset; + const cb = callback ? () => { + update(); + callback(ts.value); + } : update; + const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate }); + if (exposeControls) { + return { + timestamp: ts, + ...controls + }; + } else { + return ts; + } +} +function useTitle(newTitle = null, options = {}) { + var _a, _b, _c; + const { + document: document2 = defaultDocument, + restoreOnUnmount = (t) => t + } = options; + const originalTitle = (_a = document2 == null ? void 0 : document2.title) != null ? _a : ""; + const title = toRef2((_b = newTitle != null ? newTitle : document2 == null ? void 0 : document2.title) != null ? _b : null); + const isReadonly2 = newTitle && typeof newTitle === "function"; + function format(t) { + if (!("titleTemplate" in options)) + return t; + const template = options.titleTemplate || "%s"; + return typeof template === "function" ? template(t) : toValue(template).replace(/%s/g, t); + } + watch( + title, + (t, o) => { + if (t !== o && document2) + document2.title = format(typeof t === "string" ? t : ""); + }, + { immediate: true } + ); + if (options.observe && !options.titleTemplate && document2 && !isReadonly2) { + useMutationObserver( + (_c = document2.head) == null ? void 0 : _c.querySelector("title"), + () => { + if (document2 && document2.title !== title.value) + title.value = format(document2.title); + }, + { childList: true } + ); + } + tryOnBeforeUnmount(() => { + if (restoreOnUnmount) { + const restoredTitle = restoreOnUnmount(originalTitle, title.value || ""); + if (restoredTitle != null && document2) + document2.title = restoredTitle; + } + }); + return title; +} +var _TransitionPresets = { + easeInSine: [0.12, 0, 0.39, 0], + easeOutSine: [0.61, 1, 0.88, 1], + easeInOutSine: [0.37, 0, 0.63, 1], + easeInQuad: [0.11, 0, 0.5, 0], + easeOutQuad: [0.5, 1, 0.89, 1], + easeInOutQuad: [0.45, 0, 0.55, 1], + easeInCubic: [0.32, 0, 0.67, 0], + easeOutCubic: [0.33, 1, 0.68, 1], + easeInOutCubic: [0.65, 0, 0.35, 1], + easeInQuart: [0.5, 0, 0.75, 0], + easeOutQuart: [0.25, 1, 0.5, 1], + easeInOutQuart: [0.76, 0, 0.24, 1], + easeInQuint: [0.64, 0, 0.78, 0], + easeOutQuint: [0.22, 1, 0.36, 1], + easeInOutQuint: [0.83, 0, 0.17, 1], + easeInExpo: [0.7, 0, 0.84, 0], + easeOutExpo: [0.16, 1, 0.3, 1], + easeInOutExpo: [0.87, 0, 0.13, 1], + easeInCirc: [0.55, 0, 1, 0.45], + easeOutCirc: [0, 0.55, 0.45, 1], + easeInOutCirc: [0.85, 0, 0.15, 1], + easeInBack: [0.36, 0, 0.66, -0.56], + easeOutBack: [0.34, 1.56, 0.64, 1], + easeInOutBack: [0.68, -0.6, 0.32, 1.6] +}; +var TransitionPresets = Object.assign({}, { linear: identity }, _TransitionPresets); +function createEasingFunction([p0, p1, p2, p3]) { + const a = (a1, a2) => 1 - 3 * a2 + 3 * a1; + const b = (a1, a2) => 3 * a2 - 6 * a1; + const c = (a1) => 3 * a1; + const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t; + const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1); + const getTforX = (x) => { + let aGuessT = x; + for (let i = 0; i < 4; ++i) { + const currentSlope = getSlope(aGuessT, p0, p2); + if (currentSlope === 0) + return aGuessT; + const currentX = calcBezier(aGuessT, p0, p2) - x; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + }; + return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3); +} +function lerp(a, b, alpha) { + return a + alpha * (b - a); +} +function toVec(t) { + return (typeof t === "number" ? [t] : t) || []; +} +function executeTransition(source, from, to, options = {}) { + var _a, _b; + const fromVal = toValue(from); + const toVal = toValue(to); + const v1 = toVec(fromVal); + const v2 = toVec(toVal); + const duration = (_a = toValue(options.duration)) != null ? _a : 1e3; + const startedAt = Date.now(); + const endAt = Date.now() + duration; + const trans = typeof options.transition === "function" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity; + const ease = typeof trans === "function" ? trans : createEasingFunction(trans); + return new Promise((resolve) => { + source.value = fromVal; + const tick = () => { + var _a2; + if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) { + resolve(); + return; + } + const now2 = Date.now(); + const alpha = ease((now2 - startedAt) / duration); + const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha)); + if (Array.isArray(source.value)) + source.value = arr.map((n, i) => { + var _a3, _b2; + return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha); + }); + else if (typeof source.value === "number") + source.value = arr[0]; + if (now2 < endAt) { + requestAnimationFrame(tick); + } else { + source.value = toVal; + resolve(); + } + }; + tick(); + }); +} +function useTransition(source, options = {}) { + let currentId = 0; + const sourceVal = () => { + const v = toValue(source); + return typeof v === "number" ? v : v.map(toValue); + }; + const outputRef = ref(sourceVal()); + watch(sourceVal, async (to) => { + var _a, _b; + if (toValue(options.disabled)) + return; + const id = ++currentId; + if (options.delay) + await promiseTimeout(toValue(options.delay)); + if (id !== currentId) + return; + const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to); + (_a = options.onStarted) == null ? void 0 : _a.call(options); + await executeTransition(outputRef, outputRef.value, toVal, { + ...options, + abort: () => { + var _a2; + return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options)); + } + }); + (_b = options.onFinished) == null ? void 0 : _b.call(options); + }, { deep: true }); + watch(() => toValue(options.disabled), (disabled) => { + if (disabled) { + currentId++; + outputRef.value = sourceVal(); + } + }); + tryOnScopeDispose(() => { + currentId++; + }); + return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value); +} +function useUrlSearchParams(mode = "history", options = {}) { + const { + initialValue = {}, + removeNullishValues = true, + removeFalsyValues = false, + write: enableWrite = true, + window: window2 = defaultWindow + } = options; + if (!window2) + return reactive(initialValue); + const state = reactive({}); + function getRawParams() { + if (mode === "history") { + return window2.location.search || ""; + } else if (mode === "hash") { + const hash = window2.location.hash || ""; + const index = hash.indexOf("?"); + return index > 0 ? hash.slice(index) : ""; + } else { + return (window2.location.hash || "").replace(/^#/, ""); + } + } + function constructQuery(params) { + const stringified = params.toString(); + if (mode === "history") + return `${stringified ? `?${stringified}` : ""}${window2.location.hash || ""}`; + if (mode === "hash-params") + return `${window2.location.search || ""}${stringified ? `#${stringified}` : ""}`; + const hash = window2.location.hash || "#"; + const index = hash.indexOf("?"); + if (index > 0) + return `${hash.slice(0, index)}${stringified ? `?${stringified}` : ""}`; + return `${hash}${stringified ? `?${stringified}` : ""}`; + } + function read() { + return new URLSearchParams(getRawParams()); + } + function updateState(params) { + const unusedKeys = new Set(Object.keys(state)); + for (const key of params.keys()) { + const paramsForKey = params.getAll(key); + state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || ""; + unusedKeys.delete(key); + } + Array.from(unusedKeys).forEach((key) => delete state[key]); + } + const { pause, resume } = watchPausable( + state, + () => { + const params = new URLSearchParams(""); + Object.keys(state).forEach((key) => { + const mapEntry = state[key]; + if (Array.isArray(mapEntry)) + mapEntry.forEach((value) => params.append(key, value)); + else if (removeNullishValues && mapEntry == null) + params.delete(key); + else if (removeFalsyValues && !mapEntry) + params.delete(key); + else + params.set(key, mapEntry); + }); + write(params); + }, + { deep: true } + ); + function write(params, shouldUpdate) { + pause(); + if (shouldUpdate) + updateState(params); + window2.history.replaceState( + window2.history.state, + window2.document.title, + window2.location.pathname + constructQuery(params) + ); + resume(); + } + function onChanged() { + if (!enableWrite) + return; + write(read(), true); + } + useEventListener(window2, "popstate", onChanged, false); + if (mode !== "history") + useEventListener(window2, "hashchange", onChanged, false); + const initial = read(); + if (initial.keys().next().value) + updateState(initial); + else + Object.assign(state, initialValue); + return state; +} +function useUserMedia(options = {}) { + var _a, _b; + const enabled = ref((_a = options.enabled) != null ? _a : false); + const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true); + const constraints = ref(options.constraints); + const { navigator = defaultNavigator } = options; + const isSupported = useSupported(() => { + var _a2; + return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia; + }); + const stream = shallowRef(); + function getDeviceOptions(type) { + switch (type) { + case "video": { + if (constraints.value) + return constraints.value.video || false; + break; + } + case "audio": { + if (constraints.value) + return constraints.value.audio || false; + break; + } + } + } + async function _start() { + if (!isSupported.value || stream.value) + return; + stream.value = await navigator.mediaDevices.getUserMedia({ + video: getDeviceOptions("video"), + audio: getDeviceOptions("audio") + }); + return stream.value; + } + function _stop() { + var _a2; + (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop()); + stream.value = void 0; + } + function stop() { + _stop(); + enabled.value = false; + } + async function start() { + await _start(); + if (stream.value) + enabled.value = true; + return stream.value; + } + async function restart() { + _stop(); + return await start(); + } + watch( + enabled, + (v) => { + if (v) + _start(); + else _stop(); + }, + { immediate: true } + ); + watch( + constraints, + () => { + if (autoSwitch.value && stream.value) + restart(); + }, + { immediate: true } + ); + tryOnScopeDispose(() => { + stop(); + }); + return { + isSupported, + stream, + start, + stop, + restart, + constraints, + enabled, + autoSwitch + }; +} +function useVModel(props, key, emit, options = {}) { + var _a, _b, _c, _d, _e; + const { + clone = false, + passive = false, + eventName, + deep = false, + defaultValue, + shouldEmit + } = options; + const vm = getCurrentInstance(); + const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy)); + let event = eventName; + if (!key) { + if (isVue22) { + const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model; + key = (modelOptions == null ? void 0 : modelOptions.value) || "value"; + if (!eventName) + event = (modelOptions == null ? void 0 : modelOptions.event) || "input"; + } else { + key = "modelValue"; + } + } + event = event || `update:${key.toString()}`; + const cloneFn = (val) => !clone ? val : typeof clone === "function" ? clone(val) : cloneFnJSON(val); + const getValue2 = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue; + const triggerEmit = (value) => { + if (shouldEmit) { + if (shouldEmit(value)) + _emit(event, value); + } else { + _emit(event, value); + } + }; + if (passive) { + const initialValue = getValue2(); + const proxy = ref(initialValue); + let isUpdating = false; + watch( + () => props[key], + (v) => { + if (!isUpdating) { + isUpdating = true; + proxy.value = cloneFn(v); + nextTick(() => isUpdating = false); + } + } + ); + watch( + proxy, + (v) => { + if (!isUpdating && (v !== props[key] || deep)) + triggerEmit(v); + }, + { deep } + ); + return proxy; + } else { + return computed({ + get() { + return getValue2(); + }, + set(value) { + triggerEmit(value); + } + }); + } +} +function useVModels(props, emit, options = {}) { + const ret = {}; + for (const key in props) { + ret[key] = useVModel( + props, + key, + emit, + options + ); + } + return ret; +} +function useVibrate(options) { + const { + pattern = [], + interval = 0, + navigator = defaultNavigator + } = options || {}; + const isSupported = useSupported(() => typeof navigator !== "undefined" && "vibrate" in navigator); + const patternRef = toRef2(pattern); + let intervalControls; + const vibrate = (pattern2 = patternRef.value) => { + if (isSupported.value) + navigator.vibrate(pattern2); + }; + const stop = () => { + if (isSupported.value) + navigator.vibrate(0); + intervalControls == null ? void 0 : intervalControls.pause(); + }; + if (interval > 0) { + intervalControls = useIntervalFn( + vibrate, + interval, + { + immediate: false, + immediateCallback: false + } + ); + } + return { + isSupported, + pattern, + intervalControls, + vibrate, + stop + }; +} +function useVirtualList(list, options) { + const { containerStyle, wrapperProps, scrollTo: scrollTo2, calculateRange, currentList, containerRef } = "itemHeight" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list); + return { + list: currentList, + scrollTo: scrollTo2, + containerProps: { + ref: containerRef, + onScroll: () => { + calculateRange(); + }, + style: containerStyle + }, + wrapperProps + }; +} +function useVirtualListResources(list) { + const containerRef = ref(null); + const size = useElementSize(containerRef); + const currentList = ref([]); + const source = shallowRef(list); + const state = ref({ start: 0, end: 10 }); + return { state, source, currentList, size, containerRef }; +} +function createGetViewCapacity(state, source, itemSize) { + return (containerSize) => { + if (typeof itemSize === "number") + return Math.ceil(containerSize / itemSize); + const { start = 0 } = state.value; + let sum = 0; + let capacity = 0; + for (let i = start; i < source.value.length; i++) { + const size = itemSize(i); + sum += size; + capacity = i; + if (sum > containerSize) + break; + } + return capacity - start; + }; +} +function createGetOffset(source, itemSize) { + return (scrollDirection) => { + if (typeof itemSize === "number") + return Math.floor(scrollDirection / itemSize) + 1; + let sum = 0; + let offset = 0; + for (let i = 0; i < source.value.length; i++) { + const size = itemSize(i); + sum += size; + if (sum >= scrollDirection) { + offset = i; + break; + } + } + return offset + 1; + }; +} +function createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) { + return () => { + const element = containerRef.value; + if (element) { + const offset = getOffset(type === "vertical" ? element.scrollTop : element.scrollLeft); + const viewCapacity = getViewCapacity(type === "vertical" ? element.clientHeight : element.clientWidth); + const from = offset - overscan; + const to = offset + viewCapacity + overscan; + state.value = { + start: from < 0 ? 0 : from, + end: to > source.value.length ? source.value.length : to + }; + currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({ + data: ele, + index: index + state.value.start + })); + } + }; +} +function createGetDistance(itemSize, source) { + return (index) => { + if (typeof itemSize === "number") { + const size2 = index * itemSize; + return size2; + } + const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0); + return size; + }; +} +function useWatchForSizes(size, list, containerRef, calculateRange) { + watch([size.width, size.height, list, containerRef], () => { + calculateRange(); + }); +} +function createComputedTotalSize(itemSize, source) { + return computed(() => { + if (typeof itemSize === "number") + return source.value.length * itemSize; + return source.value.reduce((sum, _, index) => sum + itemSize(index), 0); + }); +} +var scrollToDictionaryForElementScrollKey = { + horizontal: "scrollLeft", + vertical: "scrollTop" +}; +function createScrollTo(type, calculateRange, getDistance, containerRef) { + return (index) => { + if (containerRef.value) { + containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index); + calculateRange(); + } + }; +} +function useHorizontalVirtualList(options, list) { + const resources = useVirtualListResources(list); + const { state, source, currentList, size, containerRef } = resources; + const containerStyle = { overflowX: "auto" }; + const { itemWidth, overscan = 5 } = options; + const getViewCapacity = createGetViewCapacity(state, source, itemWidth); + const getOffset = createGetOffset(source, itemWidth); + const calculateRange = createCalculateRange("horizontal", overscan, getOffset, getViewCapacity, resources); + const getDistanceLeft = createGetDistance(itemWidth, source); + const offsetLeft = computed(() => getDistanceLeft(state.value.start)); + const totalWidth = createComputedTotalSize(itemWidth, source); + useWatchForSizes(size, list, containerRef, calculateRange); + const scrollTo2 = createScrollTo("horizontal", calculateRange, getDistanceLeft, containerRef); + const wrapperProps = computed(() => { + return { + style: { + height: "100%", + width: `${totalWidth.value - offsetLeft.value}px`, + marginLeft: `${offsetLeft.value}px`, + display: "flex" + } + }; + }); + return { + scrollTo: scrollTo2, + calculateRange, + wrapperProps, + containerStyle, + currentList, + containerRef + }; +} +function useVerticalVirtualList(options, list) { + const resources = useVirtualListResources(list); + const { state, source, currentList, size, containerRef } = resources; + const containerStyle = { overflowY: "auto" }; + const { itemHeight, overscan = 5 } = options; + const getViewCapacity = createGetViewCapacity(state, source, itemHeight); + const getOffset = createGetOffset(source, itemHeight); + const calculateRange = createCalculateRange("vertical", overscan, getOffset, getViewCapacity, resources); + const getDistanceTop = createGetDistance(itemHeight, source); + const offsetTop = computed(() => getDistanceTop(state.value.start)); + const totalHeight = createComputedTotalSize(itemHeight, source); + useWatchForSizes(size, list, containerRef, calculateRange); + const scrollTo2 = createScrollTo("vertical", calculateRange, getDistanceTop, containerRef); + const wrapperProps = computed(() => { + return { + style: { + width: "100%", + height: `${totalHeight.value - offsetTop.value}px`, + marginTop: `${offsetTop.value}px` + } + }; + }); + return { + calculateRange, + scrollTo: scrollTo2, + containerStyle, + wrapperProps, + currentList, + containerRef + }; +} +function useWakeLock(options = {}) { + const { + navigator = defaultNavigator, + document: document2 = defaultDocument + } = options; + let wakeLock; + const isSupported = useSupported(() => navigator && "wakeLock" in navigator); + const isActive = ref(false); + async function onVisibilityChange() { + if (!isSupported.value || !wakeLock) + return; + if (document2 && document2.visibilityState === "visible") + wakeLock = await navigator.wakeLock.request("screen"); + isActive.value = !wakeLock.released; + } + if (document2) + useEventListener(document2, "visibilitychange", onVisibilityChange, { passive: true }); + async function request(type) { + if (!isSupported.value) + return; + wakeLock = await navigator.wakeLock.request(type); + isActive.value = !wakeLock.released; + } + async function release() { + if (!isSupported.value || !wakeLock) + return; + await wakeLock.release(); + isActive.value = !wakeLock.released; + wakeLock = null; + } + return { + isSupported, + isActive, + request, + release + }; +} +function useWebNotification(options = {}) { + const { + window: window2 = defaultWindow, + requestPermissions: _requestForPermissions = true + } = options; + const defaultWebNotificationOptions = options; + const isSupported = useSupported(() => { + if (!window2 || !("Notification" in window2)) + return false; + try { + new Notification(""); + } catch (e) { + return false; + } + return true; + }); + const permissionGranted = ref(isSupported.value && "permission" in Notification && Notification.permission === "granted"); + const notification = ref(null); + const ensurePermissions = async () => { + if (!isSupported.value) + return; + if (!permissionGranted.value && Notification.permission !== "denied") { + const result = await Notification.requestPermission(); + if (result === "granted") + permissionGranted.value = true; + } + return permissionGranted.value; + }; + const { on: onClick, trigger: clickTrigger } = createEventHook(); + const { on: onShow, trigger: showTrigger } = createEventHook(); + const { on: onError, trigger: errorTrigger } = createEventHook(); + const { on: onClose, trigger: closeTrigger } = createEventHook(); + const show = async (overrides) => { + if (!isSupported.value || !permissionGranted.value) + return; + const options2 = Object.assign({}, defaultWebNotificationOptions, overrides); + notification.value = new Notification(options2.title || "", options2); + notification.value.onclick = clickTrigger; + notification.value.onshow = showTrigger; + notification.value.onerror = errorTrigger; + notification.value.onclose = closeTrigger; + return notification.value; + }; + const close = () => { + if (notification.value) + notification.value.close(); + notification.value = null; + }; + if (_requestForPermissions) + tryOnMounted(ensurePermissions); + tryOnScopeDispose(close); + if (isSupported.value && window2) { + const document2 = window2.document; + useEventListener(document2, "visibilitychange", (e) => { + e.preventDefault(); + if (document2.visibilityState === "visible") { + close(); + } + }); + } + return { + isSupported, + notification, + ensurePermissions, + permissionGranted, + show, + close, + onClick, + onShow, + onError, + onClose + }; +} +var DEFAULT_PING_MESSAGE = "ping"; +function resolveNestedOptions(options) { + if (options === true) + return {}; + return options; +} +function useWebSocket(url, options = {}) { + const { + onConnected, + onDisconnected, + onError, + onMessage, + immediate = true, + autoClose = true, + protocols = [] + } = options; + const data = ref(null); + const status = ref("CLOSED"); + const wsRef = ref(); + const urlRef = toRef2(url); + let heartbeatPause; + let heartbeatResume; + let explicitlyClosed = false; + let retried = 0; + let bufferedData = []; + let pongTimeoutWait; + const _sendBuffer = () => { + if (bufferedData.length && wsRef.value && status.value === "OPEN") { + for (const buffer of bufferedData) + wsRef.value.send(buffer); + bufferedData = []; + } + }; + const resetHeartbeat = () => { + clearTimeout(pongTimeoutWait); + pongTimeoutWait = void 0; + }; + const close = (code = 1e3, reason) => { + if (!isClient || !wsRef.value) + return; + explicitlyClosed = true; + resetHeartbeat(); + heartbeatPause == null ? void 0 : heartbeatPause(); + wsRef.value.close(code, reason); + wsRef.value = void 0; + }; + const send = (data2, useBuffer = true) => { + if (!wsRef.value || status.value !== "OPEN") { + if (useBuffer) + bufferedData.push(data2); + return false; + } + _sendBuffer(); + wsRef.value.send(data2); + return true; + }; + const _init = () => { + if (explicitlyClosed || typeof urlRef.value === "undefined") + return; + const ws = new WebSocket(urlRef.value, protocols); + wsRef.value = ws; + status.value = "CONNECTING"; + ws.onopen = () => { + status.value = "OPEN"; + onConnected == null ? void 0 : onConnected(ws); + heartbeatResume == null ? void 0 : heartbeatResume(); + _sendBuffer(); + }; + ws.onclose = (ev) => { + status.value = "CLOSED"; + onDisconnected == null ? void 0 : onDisconnected(ws, ev); + if (!explicitlyClosed && options.autoReconnect) { + const { + retries = -1, + delay = 1e3, + onFailed + } = resolveNestedOptions(options.autoReconnect); + retried += 1; + if (typeof retries === "number" && (retries < 0 || retried < retries)) + setTimeout(_init, delay); + else if (typeof retries === "function" && retries()) + setTimeout(_init, delay); + else + onFailed == null ? void 0 : onFailed(); + } + }; + ws.onerror = (e) => { + onError == null ? void 0 : onError(ws, e); + }; + ws.onmessage = (e) => { + if (options.heartbeat) { + resetHeartbeat(); + const { + message = DEFAULT_PING_MESSAGE + } = resolveNestedOptions(options.heartbeat); + if (e.data === message) + return; + } + data.value = e.data; + onMessage == null ? void 0 : onMessage(ws, e); + }; + }; + if (options.heartbeat) { + const { + message = DEFAULT_PING_MESSAGE, + interval = 1e3, + pongTimeout = 1e3 + } = resolveNestedOptions(options.heartbeat); + const { pause, resume } = useIntervalFn( + () => { + send(message, false); + if (pongTimeoutWait != null) + return; + pongTimeoutWait = setTimeout(() => { + close(); + explicitlyClosed = false; + }, pongTimeout); + }, + interval, + { immediate: false } + ); + heartbeatPause = pause; + heartbeatResume = resume; + } + if (autoClose) { + if (isClient) + useEventListener("beforeunload", () => close()); + tryOnScopeDispose(close); + } + const open = () => { + if (!isClient && !isWorker) + return; + close(); + explicitlyClosed = false; + retried = 0; + _init(); + }; + if (immediate) + open(); + watch(urlRef, open); + return { + data, + status, + close, + send, + open, + ws: wsRef + }; +} +function useWebWorker(arg0, workerOptions, options) { + const { + window: window2 = defaultWindow + } = options != null ? options : {}; + const data = ref(null); + const worker = shallowRef(); + const post = (...args) => { + if (!worker.value) + return; + worker.value.postMessage(...args); + }; + const terminate = function terminate2() { + if (!worker.value) + return; + worker.value.terminate(); + }; + if (window2) { + if (typeof arg0 === "string") + worker.value = new Worker(arg0, workerOptions); + else if (typeof arg0 === "function") + worker.value = arg0(); + else + worker.value = arg0; + worker.value.onmessage = (e) => { + data.value = e.data; + }; + tryOnScopeDispose(() => { + if (worker.value) + worker.value.terminate(); + }); + } + return { + data, + post, + terminate, + worker + }; +} +function jobRunner(userFunc) { + return (e) => { + const userFuncArgs = e.data[0]; + return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => { + postMessage(["SUCCESS", result]); + }).catch((error) => { + postMessage(["ERROR", error]); + }); + }; +} +function depsParser(deps, localDeps) { + if (deps.length === 0 && localDeps.length === 0) + return ""; + const depsString = deps.map((dep) => `'${dep}'`).toString(); + const depsFunctionString = localDeps.filter((dep) => typeof dep === "function").map((fn) => { + const str = fn.toString(); + if (str.trim().startsWith("function")) { + return str; + } else { + const name = fn.name; + return `const ${name} = ${str}`; + } + }).join(";"); + const importString = `importScripts(${depsString});`; + return `${depsString.trim() === "" ? "" : importString} ${depsFunctionString}`; +} +function createWorkerBlobUrl(fn, deps, localDeps) { + const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`; + const blob = new Blob([blobCode], { type: "text/javascript" }); + const url = URL.createObjectURL(blob); + return url; +} +function useWebWorkerFn(fn, options = {}) { + const { + dependencies = [], + localDependencies = [], + timeout, + window: window2 = defaultWindow + } = options; + const worker = ref(); + const workerStatus = ref("PENDING"); + const promise = ref({}); + const timeoutId = ref(); + const workerTerminate = (status = "PENDING") => { + if (worker.value && worker.value._url && window2) { + worker.value.terminate(); + URL.revokeObjectURL(worker.value._url); + promise.value = {}; + worker.value = void 0; + window2.clearTimeout(timeoutId.value); + workerStatus.value = status; + } + }; + workerTerminate(); + tryOnScopeDispose(workerTerminate); + const generateWorker = () => { + const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies); + const newWorker = new Worker(blobUrl); + newWorker._url = blobUrl; + newWorker.onmessage = (e) => { + const { resolve = () => { + }, reject = () => { + } } = promise.value; + const [status, result] = e.data; + switch (status) { + case "SUCCESS": + resolve(result); + workerTerminate(status); + break; + default: + reject(result); + workerTerminate("ERROR"); + break; + } + }; + newWorker.onerror = (e) => { + const { reject = () => { + } } = promise.value; + e.preventDefault(); + reject(e); + workerTerminate("ERROR"); + }; + if (timeout) { + timeoutId.value = setTimeout( + () => workerTerminate("TIMEOUT_EXPIRED"), + timeout + ); + } + return newWorker; + }; + const callWorker = (...fnArgs) => new Promise((resolve, reject) => { + promise.value = { + resolve, + reject + }; + worker.value && worker.value.postMessage([[...fnArgs]]); + workerStatus.value = "RUNNING"; + }); + const workerFn = (...fnArgs) => { + if (workerStatus.value === "RUNNING") { + console.error( + "[useWebWorkerFn] You can only run one instance of the worker at a time." + ); + return Promise.reject(); + } + worker.value = generateWorker(); + return callWorker(...fnArgs); + }; + return { + workerFn, + workerStatus, + workerTerminate + }; +} +function useWindowFocus(options = {}) { + const { window: window2 = defaultWindow } = options; + if (!window2) + return ref(false); + const focused = ref(window2.document.hasFocus()); + useEventListener(window2, "blur", () => { + focused.value = false; + }); + useEventListener(window2, "focus", () => { + focused.value = true; + }); + return focused; +} +function useWindowScroll(options = {}) { + const { window: window2 = defaultWindow, behavior = "auto" } = options; + if (!window2) { + return { + x: ref(0), + y: ref(0) + }; + } + const internalX = ref(window2.scrollX); + const internalY = ref(window2.scrollY); + const x = computed({ + get() { + return internalX.value; + }, + set(x2) { + scrollTo({ left: x2, behavior }); + } + }); + const y = computed({ + get() { + return internalY.value; + }, + set(y2) { + scrollTo({ top: y2, behavior }); + } + }); + useEventListener( + window2, + "scroll", + () => { + internalX.value = window2.scrollX; + internalY.value = window2.scrollY; + }, + { + capture: false, + passive: true + } + ); + return { x, y }; +} +function useWindowSize(options = {}) { + const { + window: window2 = defaultWindow, + initialWidth = Number.POSITIVE_INFINITY, + initialHeight = Number.POSITIVE_INFINITY, + listenOrientation = true, + includeScrollbar = true + } = options; + const width = ref(initialWidth); + const height = ref(initialHeight); + const update = () => { + if (window2) { + if (includeScrollbar) { + width.value = window2.innerWidth; + height.value = window2.innerHeight; + } else { + width.value = window2.document.documentElement.clientWidth; + height.value = window2.document.documentElement.clientHeight; + } + } + }; + update(); + tryOnMounted(update); + useEventListener("resize", update, { passive: true }); + if (listenOrientation) { + const matches = useMediaQuery("(orientation: portrait)"); + watch(matches, () => update()); + } + return { width, height }; +} +export { + DefaultMagicKeysAliasMap, + StorageSerializers, + TransitionPresets, + assert, + computedAsync as asyncComputed, + refAutoReset as autoResetRef, + breakpointsAntDesign, + breakpointsBootstrapV5, + breakpointsMasterCss, + breakpointsPrimeFlex, + breakpointsQuasar, + breakpointsSematic, + breakpointsTailwind, + breakpointsVuetify, + breakpointsVuetifyV2, + breakpointsVuetifyV3, + bypassFilter, + camelize, + clamp, + cloneFnJSON, + computedAsync, + computedEager, + computedInject, + computedWithControl, + containsProp, + computedWithControl as controlledComputed, + controlledRef, + createEventHook, + createFetch, + createFilterWrapper, + createGlobalState, + createInjectionState, + reactify as createReactiveFn, + createReusableTemplate, + createSharedComposable, + createSingletonPromise, + createTemplatePromise, + createUnrefFn, + customStorageEventName, + debounceFilter, + refDebounced as debouncedRef, + watchDebounced as debouncedWatch, + defaultDocument, + defaultLocation, + defaultNavigator, + defaultWindow, + directiveHooks, + computedEager as eagerComputed, + executeTransition, + extendRef, + formatDate, + formatTimeAgo, + get, + getLifeCycleTarget, + getSSRHandler, + hasOwn, + hyphenate, + identity, + watchIgnorable as ignorableWatch, + increaseWithUnit, + injectLocal, + invoke, + isClient, + isDef, + isDefined, + isIOS, + isObject, + isWorker, + makeDestructurable, + mapGamepadToXbox360Controller, + noop, + normalizeDate, + notNullish, + now, + objectEntries, + objectOmit, + objectPick, + onClickOutside, + onKeyDown, + onKeyPressed, + onKeyStroke, + onKeyUp, + onLongPress, + onStartTyping, + pausableFilter, + watchPausable as pausableWatch, + promiseTimeout, + provideLocal, + rand, + reactify, + reactifyObject, + reactiveComputed, + reactiveOmit, + reactivePick, + refAutoReset, + refDebounced, + refDefault, + refThrottled, + refWithControl, + resolveRef, + resolveUnref, + set2 as set, + setSSRHandler, + syncRef, + syncRefs, + templateRef, + throttleFilter, + refThrottled as throttledRef, + watchThrottled as throttledWatch, + timestamp, + toReactive, + toRef2 as toRef, + toRefs2 as toRefs, + toValue, + tryOnBeforeMount, + tryOnBeforeUnmount, + tryOnMounted, + tryOnScopeDispose, + tryOnUnmounted, + unrefElement, + until, + useActiveElement, + useAnimate, + useArrayDifference, + useArrayEvery, + useArrayFilter, + useArrayFind, + useArrayFindIndex, + useArrayFindLast, + useArrayIncludes, + useArrayJoin, + useArrayMap, + useArrayReduce, + useArraySome, + useArrayUnique, + useAsyncQueue, + useAsyncState, + useBase64, + useBattery, + useBluetooth, + useBreakpoints, + useBroadcastChannel, + useBrowserLocation, + useCached, + useClipboard, + useClipboardItems, + useCloned, + useColorMode, + useConfirmDialog, + useCounter, + useCssVar, + useCurrentElement, + useCycleList, + useDark, + useDateFormat, + refDebounced as useDebounce, + useDebounceFn, + useDebouncedRefHistory, + useDeviceMotion, + useDeviceOrientation, + useDevicePixelRatio, + useDevicesList, + useDisplayMedia, + useDocumentVisibility, + useDraggable, + useDropZone, + useElementBounding, + useElementByPoint, + useElementHover, + useElementSize, + useElementVisibility, + useEventBus, + useEventListener, + useEventSource, + useEyeDropper, + useFavicon, + useFetch, + useFileDialog, + useFileSystemAccess, + useFocus, + useFocusWithin, + useFps, + useFullscreen, + useGamepad, + useGeolocation, + useIdle, + useImage, + useInfiniteScroll, + useIntersectionObserver, + useInterval, + useIntervalFn, + useKeyModifier, + useLastChanged, + useLocalStorage, + useMagicKeys, + useManualRefHistory, + useMediaControls, + useMediaQuery, + useMemoize, + useMemory, + useMounted, + useMouse, + useMouseInElement, + useMousePressed, + useMutationObserver, + useNavigatorLanguage, + useNetwork, + useNow, + useObjectUrl, + useOffsetPagination, + useOnline, + usePageLeave, + useParallax, + useParentElement, + usePerformanceObserver, + usePermission, + usePointer, + usePointerLock, + usePointerSwipe, + usePreferredColorScheme, + usePreferredContrast, + usePreferredDark, + usePreferredLanguages, + usePreferredReducedMotion, + usePrevious, + useRafFn, + useRefHistory, + useResizeObserver, + useScreenOrientation, + useScreenSafeArea, + useScriptTag, + useScroll, + useScrollLock, + useSessionStorage, + useShare, + useSorted, + useSpeechRecognition, + useSpeechSynthesis, + useStepper, + useStorage, + useStorageAsync, + useStyleTag, + useSupported, + useSwipe, + useTemplateRefsList, + useTextDirection, + useTextSelection, + useTextareaAutosize, + refThrottled as useThrottle, + useThrottleFn, + useThrottledRefHistory, + useTimeAgo, + useTimeout, + useTimeoutFn, + useTimeoutPoll, + useTimestamp, + useTitle, + useToNumber, + useToString, + useToggle, + useTransition, + useUrlSearchParams, + useUserMedia, + useVModel, + useVModels, + useVibrate, + useVirtualList, + useWakeLock, + useWebNotification, + useWebSocket, + useWebWorker, + useWebWorkerFn, + useWindowFocus, + useWindowScroll, + useWindowSize, + watchArray, + watchAtMost, + watchDebounced, + watchDeep, + watchIgnorable, + watchImmediate, + watchOnce, + watchPausable, + watchThrottled, + watchTriggerable, + watchWithFilter, + whenever +}; +//# sourceMappingURL=@vueuse_core.js.map diff --git a/src/.vuepress/.cache/deps/@vueuse_core.js.map b/src/.vuepress/.cache/deps/@vueuse_core.js.map new file mode 100644 index 000000000..e5153ac27 --- /dev/null +++ b/src/.vuepress/.cache/deps/@vueuse_core.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/@vueuse/shared/node_modules/vue-demi/lib/index.mjs", "../../../../node_modules/@vueuse/shared/index.mjs", "../../../../node_modules/@vueuse/core/node_modules/vue-demi/lib/index.mjs", "../../../../node_modules/@vueuse/core/index.mjs"], + "sourcesContent": ["import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n if (Array.isArray(target)) {\n target.length = Math.max(target.length, key)\n target.splice(key, 1, val)\n return val\n }\n target[key] = val\n return val\n}\n\nexport function del(target, key) {\n if (Array.isArray(target)) {\n target.splice(key, 1)\n return\n }\n delete target[key]\n}\n\nexport * from 'vue'\nexport {\n Vue,\n Vue2,\n isVue2,\n isVue3,\n install,\n}\n", "import { shallowRef, watchEffect, readonly, ref, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, provide, inject, isVue3, version, isRef, unref, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, isVue2, set as set$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue-demi';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = ref(true);\n const update = () => {\n dirty.value = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\" });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = get();\n dirty.value = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n if (Object.isExtensible(result))\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst provideLocal = (key, value) => {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n provide(key, value);\n};\n\nconst injectLocal = (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"injectLocal must be called in setup\");\n if (localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!state) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n if (!isVue3 && !version.startsWith(\"2.7.\")) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] extendRef only works in Vue 2.7 or above.\");\n return;\n }\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction toValue(r) {\n return typeof r === \"function\" ? r() : unref(r);\n}\nconst resolveUnref = toValue;\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n const filter = (invoke) => {\n const duration = toValue(ms);\n const maxDuration = toValue(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = null;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = null;\n resolve(invoke());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = null;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n const isActive = ref(true);\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nconst directiveHooks = {\n mounted: isVue3 ? \"mounted\" : \"inserted\",\n updated: isVue3 ? \"updated\" : \"componentUpdated\",\n unmounted: isVue3 ? \"unmounted\" : \"unbind\"\n};\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue(defaultValue);\n trigger();\n }, toValue(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n if (isVue2) {\n set$1(...args);\n } else {\n const [target, key, value] = args;\n target[key] = value;\n }\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n if (!Array.isArray(targets))\n targets = [targets];\n return watch(\n source,\n (newValue) => targets.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget();\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n stop == null ? void 0 : stop();\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n stop == null ? void 0 : stop();\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\nfunction useArrayDifference(...args) {\n var _a;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n return computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1));\n}\n\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue(list).map((i) => toValue(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n return computed(() => toValue(\n toValue(list).find((element, index, array) => fn(toValue(element), index, array))\n ));\n}\n\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue(\n !Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue(value2);\n return computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator(\n toValue(element),\n toValue(value),\n index,\n toValue(array)\n )));\n}\n\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n return computed(() => toValue(list).map((i) => toValue(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index);\n return computed(() => {\n const resolved = toValue(list);\n return args.length ? resolved.reduce(reduceCallback, toValue(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\nfunction useArraySome(list, fn) {\n return computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue(list).map((element) => toValue(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = ref(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(options.locales, { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(options.locales, { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(options.locales, { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(options.locales, { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(options.locales, { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true)\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = ref(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = ref(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter,\n reset,\n ...controls\n };\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = ref((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true\n } = options;\n const isPending = ref(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, toValue(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: readonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue(value);\n if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\nfunction useToString(value) {\n return computed(() => `${toValue(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = ref(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue(truthyValue);\n _value.value = _value.value === truthy ? toValue(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...source instanceof Function ? source() : Array.isArray(source) ? source : toValue(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = ref(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = ref(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n const ignoreCounter = ref(0);\n const syncCounter = ref(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter.value++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n return stop;\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue(item));\n return toValue(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, directiveHooks, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n", "import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n if (Array.isArray(target)) {\n target.length = Math.max(target.length, key)\n target.splice(key, 1, val)\n return val\n }\n target[key] = val\n return val\n}\n\nexport function del(target, key) {\n if (Array.isArray(target)) {\n target.splice(key, 1)\n return\n }\n delete target[key]\n}\n\nexport * from 'vue'\nexport {\n Vue,\n Vue2,\n isVue2,\n isVue3,\n install,\n}\n", "import { noop, makeDestructurable, camelize, toValue, isClient, isObject, tryOnScopeDispose, isIOS, tryOnMounted, notNullish, objectOmit, promiseTimeout, until, increaseWithUnit, objectEntries, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, createFilterWrapper, bypassFilter, toRefs, useIntervalFn, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, clamp, syncRef, objectPick, tryOnUnmounted, watchWithFilter, tryOnBeforeUnmount, identity, isDef, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, shallowRef, watchEffect, computed, inject, isVue3, version, defineComponent, h, TransitionGroup, shallowReactive, Fragment, watch, getCurrentInstance, customRef, onUpdated, onMounted, isVue2, readonly, nextTick, reactive, markRaw, unref, getCurrentScope, set, del, isReadonly, onBeforeUpdate } from 'vue-demi';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n shallow = true,\n onError = noop\n } = options;\n const started = ref(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nfunction createReusableTemplate(options = {}) {\n if (!isVue3 && !version.startsWith(\"2.7.\")) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] createReusableTemplate only works in Vue 2.7 or above.\");\n return;\n }\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /* #__PURE__ */ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /* #__PURE__ */ defineComponent({\n inheritAttrs,\n setup(_, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, { ...keysToCamelKebabCase(attrs), $slots: slots });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\nfunction createTemplatePromise(options = {}) {\n if (!isVue3) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] createTemplatePromise only works in Vue 3 or above.\");\n return;\n }\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /* #__PURE__ */ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n let target;\n let events;\n let listeners;\n let options;\n if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n [events, listeners, options] = args;\n target = defaultWindow;\n } else {\n [target, events, listeners, options] = args;\n }\n if (!target)\n return noop;\n if (!Array.isArray(events))\n events = [events];\n if (!Array.isArray(listeners))\n listeners = [listeners];\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options2) => {\n el.addEventListener(event, listener, options2);\n return () => el.removeEventListener(event, listener, options2);\n };\n const stopWatch = watch(\n () => [unrefElement(target), toValue(options)],\n ([el, options2]) => {\n cleanup();\n if (!el)\n return;\n const optionsClone = isObject(options2) ? { ...options2 } : options2;\n cleanups.push(\n ...events.flatMap((event) => {\n return listeners.map((listener) => register(el, event, listener, optionsClone));\n })\n );\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;\n if (!window)\n return noop;\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop));\n window.document.documentElement.addEventListener(\"click\", noop);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return ignore.some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n const listener = (event) => {\n const el = unrefElement(target);\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n const cleanup = [\n useEventListener(window, \"click\", listener, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n if (keyCode >= 97 && keyCode <= 122)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useMounted() {\n const isMounted = ref(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, isVue2 ? void 0 : instance);\n }\n return isMounted;\n}\n\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n () => targets.value,\n (targets2) => {\n cleanup();\n if (isSupported.value && targets2.size) {\n observer = new MutationObserver(callback);\n targets2.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = ref();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n useEventListener(window, \"blur\", (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n }, true);\n useEventListener(window, \"focus\", trigger, true);\n }\n if (triggerOnRemoval) {\n useMutationObserver(document, (mutations) => {\n mutations.filter((m) => m.removedNodes.length).map((n) => Array.from(n.removedNodes)).flat().forEach((node) => {\n if (node === activeElement.value)\n trigger();\n });\n }, {\n childList: true,\n subtree: true\n });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow\n } = options;\n const isActive = ref(false);\n const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null;\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit && delta < intervalLimit) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n !animate.value && update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n el && update();\n });\n watch(() => keyframes, (value) => {\n !animate.value && update();\n if (!unrefElement(target) && animate.value) {\n animate.value.effect = new KeyframeEffect(\n unrefElement(target),\n toValue(value),\n animateOptions\n );\n }\n }, { deep: true });\n tryOnMounted(() => {\n nextTick(() => update(true));\n });\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n });\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = ref(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n activeIndex.value === tasks.length - 1 && onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = ref(false);\n const isLoading = ref(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate)\n execute(delay);\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = ref(\"\");\n const promise = ref();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => base64.value = res);\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = ref(false);\n const chargingTime = ref(0);\n const dischargingTime = ref(0);\n const level = ref(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef(void 0);\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = ref();\n const isConnected = computed(() => {\n var _a;\n return ((_a = server.value) == null ? void 0 : _a.connected) || false;\n });\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n device.value.addEventListener(\"gattserverdisconnected\", () => {\n });\n try {\n server.value = await device.value.gatt.connect();\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected,\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n let mediaQuery;\n const matches = ref(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n const cleanup = () => {\n if (!mediaQuery)\n return;\n if (\"removeEventListener\" in mediaQuery)\n mediaQuery.removeEventListener(\"change\", handler);\n else\n mediaQuery.removeListener(handler);\n };\n const stopWatch = watchEffect(() => {\n if (!isSupported.value)\n return;\n cleanup();\n mediaQuery = window.matchMedia(toValue(query));\n if (\"addEventListener\" in mediaQuery)\n mediaQuery.addEventListener(\"change\", handler);\n else\n mediaQuery.addListener(handler);\n matches.value = mediaQuery.matches;\n });\n tryOnScopeDispose(() => {\n stopWatch();\n cleanup();\n mediaQuery = void 0;\n });\n return matches;\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\n\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\" } = options;\n function match(query) {\n if (!window)\n return false;\n return window.matchMedia(query).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(`(min-width: ${getValue(k, 0.1)})`);\n },\n isGreaterOrEqual(k) {\n return match(`(min-width: ${getValue(k)})`);\n },\n isSmaller(k) {\n return match(`(max-width: ${getValue(k, -0.1)})`);\n },\n isSmallerOrEqual(k) {\n return match(`(max-width: ${getValue(k)})`);\n },\n isInBetween(a, b) {\n return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(-1));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = ref(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n channel.value.addEventListener(\"message\", (e) => {\n data.value = e.data;\n }, { passive: true });\n channel.value.addEventListener(\"messageerror\", (e) => {\n error.value = e;\n }, { passive: true });\n channel.value.addEventListener(\"close\", () => {\n isClosed.value = true;\n });\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref2] of objectEntries(refs)) {\n watch(ref2, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n const cachedValue = ref(refValue.value);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n let permissionStatus;\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = ref();\n const onChange = () => {\n if (permissionStatus)\n state.value = permissionStatus.state;\n };\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus) {\n try {\n permissionStatus = await navigator.permissions.query(desc);\n useEventListener(permissionStatus, \"change\", onChange);\n onChange();\n } catch (e) {\n state.value = \"prompt\";\n }\n }\n return permissionStatus;\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = ref(\"\");\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateText() {\n if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) {\n navigator.clipboard.readText().then((value) => {\n text.value = value;\n });\n } else {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText);\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n if (isClipboardApiSupported.value && isAllowed(permissionWrite.value))\n await navigator.clipboard.writeText(value);\n else\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateContent);\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content,\n copied,\n copy\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n function sync() {\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n () => write(data.value),\n { flush, deep, eventFilter }\n );\n if (window && listenToStorageChanges) {\n tryOnMounted(() => {\n useEventListener(window, \"storage\", update);\n useEventListener(window, customStorageEventName, updateFromCustomEvent);\n if (initOnMounted)\n update();\n });\n }\n if (!initOnMounted)\n update();\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n window.dispatchEvent(new CustomEvent(customStorageEventName, {\n detail: {\n key,\n oldValue,\n newValue,\n storageArea: storage\n }\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(key);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(key);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(key, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(key);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(key, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== key)\n return;\n pauseWatch();\n try {\n if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n data.value = read(event);\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n const styleString = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\n style.appendChild(document.createTextNode(styleString));\n window.document.head.appendChild(style);\n }\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n el.classList.add(v);\n else\n el.classList.remove(v);\n });\n } else {\n el.setAttribute(attribute2, value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n try {\n return Object.assign(auto, { store, system, state });\n } catch (e) {\n return auto;\n }\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue = \"\", observe = false } = options;\n const variable = ref(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n updateCssVar,\n { immediate: true }\n );\n watch(\n variable,\n (val) => {\n var _a;\n if ((_a = elRef.value) == null ? void 0 : _a.style)\n elRef.value.style.setProperty(toValue(prop), val);\n }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\",\n window = defaultWindow\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => {\n if (mode.system) {\n return mode.system.value;\n } else {\n const preferredDark = usePreferredDark({ window });\n return preferredDark.value ? \"dark\" : \"light\";\n }\n });\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n eventFilter = bypassFilter\n } = options;\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = ref(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n acceleration.value = event.acceleration;\n accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n rotationRate.value = event.rotationRate;\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion);\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = ref(false);\n const alpha = ref(null);\n const beta = ref(null);\n const gamma = ref(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = ref(1);\n if (window) {\n let observe2 = function() {\n pixelRatio.value = window.devicePixelRatio;\n cleanup2();\n media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);\n media.addEventListener(\"change\", observe2, { once: true });\n }, cleanup2 = function() {\n media == null ? void 0 : media.removeEventListener(\"change\", observe2);\n };\n let media;\n observe2();\n tryOnScopeDispose(cleanup2);\n }\n return { pixelRatio };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = ref(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(\"camera\", { controls: true });\n await query();\n if (state.value !== \"granted\") {\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n update();\n permissionGranted.value = true;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update);\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.addEventListener(\"ended\", stop));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return ref(\"visible\");\n const visibility = ref(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a, _b;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (e.button !== 0)\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = { capture: (_b = options.capture) != null ? _b : true };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n const isOverDropZone = ref(false);\n const files = shallowRef(null);\n let counter = 0;\n let isDataTypeIncluded = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const getFiles = (event) => {\n var _a, _b;\n const list = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);\n return files.value = list.length === 0 ? null : list;\n };\n useEventListener(target, \"dragenter\", (event) => {\n var _a, _b;\n const types = Array.from(((_a = event == null ? void 0 : event.dataTransfer) == null ? void 0 : _a.items) || []).map((i) => i.kind === \"file\" ? i.type : null).filter(notNullish);\n if (_options.dataTypes && event.dataTransfer) {\n const dataTypes = unref(_options.dataTypes);\n isDataTypeIncluded = typeof dataTypes === \"function\" ? dataTypes(types) : dataTypes ? dataTypes.some((item) => types.includes(item)) : true;\n if (!isDataTypeIncluded)\n return;\n }\n event.preventDefault();\n counter += 1;\n isOverDropZone.value = true;\n (_b = _options.onEnter) == null ? void 0 : _b.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"dragover\", (event) => {\n var _a;\n if (!isDataTypeIncluded)\n return;\n event.preventDefault();\n (_a = _options.onOver) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"dragleave\", (event) => {\n var _a;\n if (!isDataTypeIncluded)\n return;\n event.preventDefault();\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_a = _options.onLeave) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"drop\", (event) => {\n var _a;\n event.preventDefault();\n counter = 0;\n isOverDropZone.value = false;\n (_a = _options.onDrop) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]);\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els)\n _el && observer.observe(_el, observerOptions);\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true\n } = options;\n const height = ref(0);\n const bottom = ref(0);\n const left = ref(0);\n const right = ref(0);\n const top = ref(0);\n const width = ref(0);\n const x = ref(0);\n const y = ref(0);\n function update() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = ref(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n window = defaultWindow\n } = options;\n const isHovered = ref(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = ref(initialSize.width);\n const height = ref(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0.1,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = ref(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const { window = defaultWindow, scrollTarget, threshold = 0 } = options;\n const elementIsVisible = ref(false);\n useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n },\n {\n root: scrollTarget,\n window,\n threshold\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = ref(null);\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(options.autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n watch(urlRef, open, { immediate: true });\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = ref(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n const callback = callbacks[callbacks.length - 1];\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = ref(false);\n const isFetching = ref(false);\n const aborted = ref(false);\n const statusCode = ref(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort();\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n if (config.payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const payload = toValue(config.payload);\n if (!config.payloadType && payload && Object.getPrototypeOf(payload) === Object.prototype && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b = context.options) == null ? void 0 : _b.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n return `${start}/${end}`;\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(null);\n const { on: onChange, trigger } = createEventHook();\n let input;\n if (document) {\n input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n trigger(files.value);\n };\n }\n const reset = () => {\n files.value = null;\n if (input && input.value) {\n input.value = \"\";\n trigger(null);\n }\n };\n const open = (localOptions) => {\n if (!input)\n return;\n const _options = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n input.multiple = _options.multiple;\n input.accept = _options.accept;\n input.webkitdirectory = _options.directory;\n if (hasOwn(_options, \"capture\"))\n input.capture = _options.capture;\n if (_options.reset)\n reset();\n input.click();\n };\n return {\n files: readonly(files),\n open,\n reset,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = ref();\n const data = ref();\n const file = ref();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = ref(false);\n const targetElement = computed(() => unrefElement(target));\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n });\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = ref(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.querySelector(\"html\");\n });\n const isFullscreen = ref(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n useEventListener(document, eventHandlers, handlerCallback, false);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad));\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad));\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = ref(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = ref(initialState);\n const lastActive = ref(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n for (const event of events)\n useEventListener(window, event, onEvent, { passive: true });\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n });\n }\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options;\n img.src = src;\n if (srcset)\n img.srcset = srcset;\n if (sizes)\n img.sizes = sizes;\n if (clazz)\n img.className = clazz;\n if (loading)\n img.loading = loading;\n if (crossorigin)\n img.crossOrigin = crossorigin;\n if (referrerPolicy)\n img.referrerPolicy = referrerPolicy;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const internalX = ref(0);\n const internalY = ref(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = ref(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection } = getComputedStyle(el);\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft) <= (offset.left || 0);\n const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n return {\n isLoading\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = ref(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive: true });\n useEventListener(\"focus\", reset, { passive: true });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.every((key) => toValue(proxy[key])));\n } else {\n refs[prop] = ref(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const currentTime = ref(0);\n const duration = ref(0);\n const seeking = ref(false);\n const volume = ref(1);\n const waiting = ref(false);\n const ended = ref(false);\n const playing = ref(false);\n const rate = ref(1);\n const stalled = ref(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = ref(-1);\n const isPictureInPicture = ref(false);\n const muted = ref(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n e.remove();\n });\n sources.forEach(({ src: src2, type }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.addEventListener(\"error\", sourceErrorEvent.trigger);\n el.appendChild(source);\n });\n el.load();\n });\n tryOnScopeDispose(() => {\n const el = toValue(target);\n if (!el)\n return;\n el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n isPlaying ? el.play() : el.pause();\n });\n useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime));\n useEventListener(target, \"durationchange\", () => duration.value = toValue(target).duration);\n useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(toValue(target).buffered));\n useEventListener(target, \"seeking\", () => seeking.value = true);\n useEventListener(target, \"seeked\", () => seeking.value = false);\n useEventListener(target, [\"waiting\", \"loadstart\"], () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n });\n useEventListener(target, \"loadeddata\", () => waiting.value = false);\n useEventListener(target, \"playing\", () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n });\n useEventListener(target, \"ratechange\", () => rate.value = toValue(target).playbackRate);\n useEventListener(target, \"stalled\", () => stalled.value = true);\n useEventListener(target, \"ended\", () => ended.value = true);\n useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n useEventListener(target, \"volumechange\", () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n });\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on\n };\n}\n\nfunction getMapVue2Compat() {\n const data = shallowReactive({});\n return {\n get: (key) => data[key],\n set: (key, value) => set(data, key, value),\n has: (key) => hasOwn(data, key),\n delete: (key) => del(data, key),\n clear: () => {\n Object.keys(data).forEach((key) => {\n del(data, key);\n });\n }\n };\n}\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n if (isVue2)\n return getMapVue2Compat();\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY]\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n const x = ref(initialValue.x);\n const y = ref(initialValue.y);\n const sourceType = ref(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX;\n y.value = pos[1] + window.scrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, { passive: true });\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = ref(0);\n const elementY = ref(0);\n const elementPositionX = ref(0);\n const elementPositionY = ref(0);\n const elementHeight = ref(0);\n const elementWidth = ref(0);\n const isOutside = ref(true);\n let stop = () => {\n };\n if (window) {\n stop = watch(\n [targetRef, x, y],\n () => {\n const el = unrefElement(targetRef);\n if (!el)\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n },\n { immediate: true }\n );\n useEventListener(document, \"mouseleave\", () => {\n isOutside.value = true;\n });\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = ref(initialValue);\n const sourceType = ref(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => () => {\n pressed.value = true;\n sourceType.value = srcType;\n };\n const onReleased = () => {\n pressed.value = false;\n sourceType.value = null;\n };\n const target = computed(() => unrefElement(options.target) || window);\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true, capture });\n useEventListener(window, \"mouseleave\", onReleased, { passive: true, capture });\n useEventListener(window, \"mouseup\", onReleased, { passive: true, capture });\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true, capture });\n useEventListener(window, \"drop\", onReleased, { passive: true, capture });\n useEventListener(window, \"dragend\", onReleased, { passive: true, capture });\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true, capture });\n useEventListener(window, \"touchend\", onReleased, { passive: true, capture });\n useEventListener(window, \"touchcancel\", onReleased, { passive: true, capture });\n }\n return {\n pressed,\n sourceType\n };\n}\n\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = ref(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n });\n return {\n isSupported,\n language\n };\n}\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = ref(true);\n const saveData = ref(false);\n const offlineAt = ref(void 0);\n const onlineAt = ref(void 0);\n const downlink = ref(void 0);\n const downlinkMax = ref(void 0);\n const rtt = ref(void 0);\n const effectiveType = ref(void 0);\n const type = ref(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n });\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n });\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, false);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline,\n saveData,\n offlineAt,\n onlineAt,\n downlink,\n downlinkMax,\n effectiveType,\n rtt,\n type\n };\n}\n\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = ref();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = ref(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n useEventListener(window, \"mouseout\", handler, { passive: true });\n useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n }\n return isLeft;\n}\n\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = ref(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = ref(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = ref();\n const triggerElement = ref();\n let targetElement;\n if (isSupported.value) {\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n });\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n });\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = ref(false);\n const isPointerDown = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n })\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n });\n return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = ref(\"\");\n const right = ref(\"\");\n const bottom = ref(\"\");\n const left = ref(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update));\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = ref(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n el.addEventListener(\"error\", (event) => reject(event));\n el.addEventListener(\"abort\", (event) => reject(event));\n el.addEventListener(\"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n });\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = ref(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = ref(false);\n const isFinal = ref(false);\n const result = ref(\"\");\n const error = shallowRef(void 0);\n const toggle = (value = !isListening.value) => {\n isListening.value = value;\n };\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n let recognition;\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.onstart = () => {\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, () => {\n if (isListening.value)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n isListening.value = false;\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = ref(false);\n const status = ref(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n utterance && synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)));\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = ref(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = ref(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true,\n window = defaultWindow\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n let listenerOptions;\n const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n if (!passive)\n listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n else\n listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n if (listenerOptions.capture && !listenerOptions.passive)\n e.preventDefault();\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isPassiveEventSupported,\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop\n };\n}\nfunction checkPassiveEventSupport(document) {\n if (!document)\n return false;\n let supportsPassive = false;\n const optionsBlock = {\n get passive() {\n supportsPassive = true;\n return false;\n }\n };\n document.addEventListener(\"x\", noop, optionsBlock);\n document.removeEventListener(\"x\", noop);\n return supportsPassive;\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange);\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction useTextareaAutosize(options) {\n var _a;\n const textarea = ref(options == null ? void 0 : options.element);\n const input = ref(options == null ? void 0 : options.input);\n const styleProp = (_a = options == null ? void 0 : options.styleProp) != null ? _a : \"height\";\n const textareaScrollHeight = ref(1);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n if (options == null ? void 0 : options.styleTarget)\n toValue(options.styleTarget).style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, () => triggerResize());\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, timeoutPollOptions) {\n const { start } = useTimeoutFn(loop, interval, { immediate: false });\n const isActive = ref(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n loop();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = ref(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = newTitle && typeof newTitle === \"function\";\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (t, o) => {\n if (t !== o && document)\n document.title = format(typeof t === \"string\" ? t : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnBeforeUnmount(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params);\n },\n { deep: true }\n );\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n resume();\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true);\n }\n useEventListener(window, \"popstate\", onChanged, false);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, false);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c, _d, _e;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n let event = eventName;\n if (!key) {\n if (isVue2) {\n const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;\n key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n if (!eventName)\n event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n } else {\n key = \"modelValue\";\n }\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = ref(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, list, containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n let wakeLock;\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = ref(false);\n async function onVisibilityChange() {\n if (!isSupported.value || !wakeLock)\n return;\n if (document && document.visibilityState === \"visible\")\n wakeLock = await navigator.wakeLock.request(\"screen\");\n isActive.value = !wakeLock.released;\n }\n if (document)\n useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n async function request(type) {\n if (!isSupported.value)\n return;\n wakeLock = await navigator.wakeLock.request(type);\n isActive.value = !wakeLock.released;\n }\n async function release() {\n if (!isSupported.value || !wakeLock)\n return;\n await wakeLock.release();\n isActive.value = !wakeLock.released;\n wakeLock = null;\n }\n return {\n isSupported,\n isActive,\n request,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n try {\n new Notification(\"\");\n } catch (e) {\n return false;\n }\n return true;\n });\n const permissionGranted = ref(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = ref(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n if (!isClient || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === message)\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(message, false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close());\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = ref(\"PENDING\");\n const promise = ref({});\n const timeoutId = ref();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n promise.value = {\n resolve,\n reject\n };\n worker.value && worker.value.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref(false);\n const focused = ref(window.document.hasFocus());\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n });\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n });\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, behavior = \"auto\" } = options;\n if (!window) {\n return {\n x: ref(0),\n y: ref(0)\n };\n }\n const internalX = ref(window.scrollX);\n const internalY = ref(window.scrollY);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo({ left: x2, behavior });\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo({ top: y2, behavior });\n }\n });\n useEventListener(\n window,\n \"scroll\",\n () => {\n internalX.value = window.scrollX;\n internalY.value = window.scrollY;\n },\n {\n capture: false,\n passive: true\n }\n );\n return { x, y };\n}\n\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true\n } = options;\n const width = ref(initialWidth);\n const height = ref(initialHeight);\n const update = () => {\n if (window) {\n if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n useEventListener(\"resize\", update, { passive: true });\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePrevious, useRafFn, useRefHistory, useResizeObserver, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n"], + "mappings": "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", + "names": ["get", "set", "ref", "keys", "invoke", "toRef", "toRefs", "isVue2", "isVue3", "set", "isVue3", "events", "window", "isVue2", "document", "timestamp", "getValue", "defaults", "toRef", "set", "onUpdated", "preventDefault", "toRefs", "now", "scrollTo", "keys", "get", "isReadonly"] +} diff --git a/src/.vuepress/.cache/deps/_metadata.json b/src/.vuepress/.cache/deps/_metadata.json new file mode 100644 index 000000000..bdd0edc7f --- /dev/null +++ b/src/.vuepress/.cache/deps/_metadata.json @@ -0,0 +1,55 @@ +{ + "hash": "da7b0b2e", + "configHash": "57ba075c", + "lockfileHash": "89c63d95", + "browserHash": "a17cf043", + "optimized": { + "slimsearch": { + "src": "../../../../node_modules/slimsearch/dist/index.mjs", + "file": "slimsearch.js", + "fileHash": "8b700554", + "needsInterop": false + }, + "@vueuse/core": { + "src": "../../../../node_modules/@vueuse/core/index.mjs", + "file": "@vueuse_core.js", + "fileHash": "9098d5cd", + "needsInterop": false + }, + "@vue/devtools-api": { + "src": "../../../../node_modules/@vue/devtools-api/lib/esm/index.js", + "file": "@vue_devtools-api.js", + "fileHash": "7278892e", + "needsInterop": false + }, + "@vuepress/shared": { + "src": "../../../../node_modules/@vuepress/shared/dist/index.js", + "file": "@vuepress_shared.js", + "fileHash": "b092033d", + "needsInterop": false + }, + "vue": { + "src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js", + "file": "vue.js", + "fileHash": "5e6d6e9c", + "needsInterop": false + }, + "vue-router": { + "src": "../../../../node_modules/vue-router/dist/vue-router.esm-bundler.js", + "file": "vue-router.js", + "fileHash": "8fbe221b", + "needsInterop": false + } + }, + "chunks": { + "chunk-UKCZNIRO": { + "file": "chunk-UKCZNIRO.js" + }, + "chunk-PAUCAATC": { + "file": "chunk-PAUCAATC.js" + }, + "chunk-V6TY7KAL": { + "file": "chunk-V6TY7KAL.js" + } + } +} \ No newline at end of file diff --git a/src/.vuepress/.cache/deps/chunk-PAUCAATC.js b/src/.vuepress/.cache/deps/chunk-PAUCAATC.js new file mode 100644 index 000000000..45a077f61 --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-PAUCAATC.js @@ -0,0 +1,11482 @@ +// node_modules/@vue/shared/dist/shared.esm-bundler.js +function makeMap(str, expectsLowerCase) { + const set2 = new Set(str.split(",")); + return expectsLowerCase ? (val) => set2.has(val.toLowerCase()) : (val) => set2.has(val); +} +var EMPTY_OBJ = true ? Object.freeze({}) : {}; +var EMPTY_ARR = true ? Object.freeze([]) : []; +var NOOP = () => { +}; +var NO = () => false; +var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); +var isModelListener = (key) => key.startsWith("onUpdate:"); +var extend = Object.assign; +var remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var hasOwn = (val, key) => hasOwnProperty.call(val, key); +var isArray = Array.isArray; +var isMap = (val) => toTypeString(val) === "[object Map]"; +var isSet = (val) => toTypeString(val) === "[object Set]"; +var isDate = (val) => toTypeString(val) === "[object Date]"; +var isRegExp = (val) => toTypeString(val) === "[object RegExp]"; +var isFunction = (val) => typeof val === "function"; +var isString = (val) => typeof val === "string"; +var isSymbol = (val) => typeof val === "symbol"; +var isObject = (val) => val !== null && typeof val === "object"; +var isPromise = (val) => { + return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); +}; +var objectToString = Object.prototype.toString; +var toTypeString = (value) => objectToString.call(value); +var toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +var isPlainObject = (val) => toTypeString(val) === "[object Object]"; +var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +var isReservedProp = makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +var isBuiltInDirective = makeMap( + "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" +); +var cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +var camelizeRE = /-(\w)/g; +var camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +var hyphenateRE = /\B([A-Z])/g; +var hyphenate = cacheStringFunction( + (str) => str.replace(hyphenateRE, "-$1").toLowerCase() +); +var capitalize = cacheStringFunction((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +var toHandlerKey = cacheStringFunction((str) => { + const s = str ? `on${capitalize(str)}` : ``; + return s; +}); +var hasChanged = (value, oldValue) => !Object.is(value, oldValue); +var invokeArrayFns = (fns, ...arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](...arg); + } +}; +var def = (obj, key, value, writable = false) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + writable, + value + }); +}; +var looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +var toNumber = (val) => { + const n = isString(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +var _globalThis; +var getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; +var GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error"; +var isGloballyAllowed = makeMap(GLOBALS_ALLOWED); +function normalizeStyle(value) { + if (isArray(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString(value) || isObject(value)) { + return value; + } +} +var listDelimiterRE = /;(?![^(]*\))/g; +var propertyDelimiterRE = /:([^]+)/; +var styleCommentRE = /\/\*[^]*?\*\//g; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function stringifyStyle(styles) { + let ret = ""; + if (!styles || isString(styles)) { + return ret; + } + for (const key in styles) { + const value = styles[key]; + if (isString(value) || typeof value === "number") { + const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key); + ret += `${normalizedKey}:${value};`; + } + } + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString(value)) { + res = value; + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) return null; + let { class: klass, style } = props; + if (klass && !isString(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; +var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; +var MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"; +var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; +var isHTMLTag = makeMap(HTML_TAGS); +var isSVGTag = makeMap(SVG_TAGS); +var isMathMLTag = makeMap(MATH_TAGS); +var isVoidTag = makeMap(VOID_TAGS); +var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +var isSpecialBooleanAttr = makeMap(specialBooleanAttrs); +var isBooleanAttr = makeMap( + specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected` +); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +var isKnownHtmlAttr = makeMap( + `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap` +); +var isKnownSvgAttr = makeMap( + `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan` +); +function isRenderableAttrValue(value) { + if (value == null) { + return false; + } + const type = typeof value; + return type === "string" || type === "number" || type === "boolean"; +} +function looseCompareArrays(a, b) { + if (a.length !== b.length) return false; + let equal = true; + for (let i = 0; equal && i < a.length; i++) { + equal = looseEqual(a[i], b[i]); + } + return equal; +} +function looseEqual(a, b) { + if (a === b) return true; + let aValidType = isDate(a); + let bValidType = isDate(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol(a); + bValidType = isSymbol(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray(a); + bValidType = isArray(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject(a); + bValidType = isObject(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; + } + } + } + return String(a) === String(b); +} +function looseIndexOf(arr, val) { + return arr.findIndex((item) => looseEqual(item, val)); +} +var isRef = (val) => { + return !!(val && val.__v_isRef === true); +}; +var toDisplayString = (val) => { + return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); +}; +var replacer = (_key, val) => { + if (isRef(val)) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i) => { + entries[stringifySymbol(key, i) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) + }; + } else if (isSymbol(val)) { + return stringifySymbol(val); + } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { + return String(val); + } + return val; +}; +var stringifySymbol = (v, i = "") => { + var _a; + return ( + // Symbol.description in es2019+ so we need to cast here to pass + // the lib: es2016 check + isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v + ); +}; + +// node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js +function warn(msg, ...args) { + console.warn(`[Vue warn] ${msg}`, ...args); +} +var activeEffectScope; +var EffectScope = class { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; + } + } + get active() { + return this._active; + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } else if (true) { + warn(`cannot run an inactive effect scope.`); + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } + } +}; +function effectScope(detached) { + return new EffectScope(detached); +} +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } else if (true) { + warn( + `onScopeDispose() is called when there is no active effect scope to be associated with.` + ); + } +} +var activeEffect; +var ReactiveEffect = class { + constructor(fn, trigger2, scheduler, scope) { + this.fn = fn; + this.trigger = trigger2; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this._dirtyLevel = 4; + this._trackId = 0; + this._runnings = 0; + this._shouldSchedule = false; + this._depsLength = 0; + recordEffectScope(this, scope); + } + get dirty() { + if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { + this._dirtyLevel = 1; + pauseTracking(); + for (let i = 0; i < this._depsLength; i++) { + const dep = this.deps[i]; + if (dep.computed) { + triggerComputed(dep.computed); + if (this._dirtyLevel >= 4) { + break; + } + } + } + if (this._dirtyLevel === 1) { + this._dirtyLevel = 0; + } + resetTracking(); + } + return this._dirtyLevel >= 4; + } + set dirty(v) { + this._dirtyLevel = v ? 4 : 0; + } + run() { + this._dirtyLevel = 0; + if (!this.active) { + return this.fn(); + } + let lastShouldTrack = shouldTrack; + let lastEffect = activeEffect; + try { + shouldTrack = true; + activeEffect = this; + this._runnings++; + preCleanupEffect(this); + return this.fn(); + } finally { + postCleanupEffect(this); + this._runnings--; + activeEffect = lastEffect; + shouldTrack = lastShouldTrack; + } + } + stop() { + if (this.active) { + preCleanupEffect(this); + postCleanupEffect(this); + this.onStop && this.onStop(); + this.active = false; + } + } +}; +function triggerComputed(computed3) { + return computed3.value; +} +function preCleanupEffect(effect2) { + effect2._trackId++; + effect2._depsLength = 0; +} +function postCleanupEffect(effect2) { + if (effect2.deps.length > effect2._depsLength) { + for (let i = effect2._depsLength; i < effect2.deps.length; i++) { + cleanupDepEffect(effect2.deps[i], effect2); + } + effect2.deps.length = effect2._depsLength; + } +} +function cleanupDepEffect(dep, effect2) { + const trackId = dep.get(effect2); + if (trackId !== void 0 && effect2._trackId !== trackId) { + dep.delete(effect2); + if (dep.size === 0) { + dep.cleanup(); + } + } +} +function effect(fn, options) { + if (fn.effect instanceof ReactiveEffect) { + fn = fn.effect.fn; + } + const _effect = new ReactiveEffect(fn, NOOP, () => { + if (_effect.dirty) { + _effect.run(); + } + }); + if (options) { + extend(_effect, options); + if (options.scope) recordEffectScope(_effect, options.scope); + } + if (!options || !options.lazy) { + _effect.run(); + } + const runner = _effect.run.bind(_effect); + runner.effect = _effect; + return runner; +} +function stop(runner) { + runner.effect.stop(); +} +var shouldTrack = true; +var pauseScheduleStack = 0; +var trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function pauseScheduling() { + pauseScheduleStack++; +} +function resetScheduling() { + pauseScheduleStack--; + while (!pauseScheduleStack && queueEffectSchedulers.length) { + queueEffectSchedulers.shift()(); + } +} +function trackEffect(effect2, dep, debuggerEventExtraInfo) { + var _a; + if (dep.get(effect2) !== effect2._trackId) { + dep.set(effect2, effect2._trackId); + const oldDep = effect2.deps[effect2._depsLength]; + if (oldDep !== dep) { + if (oldDep) { + cleanupDepEffect(oldDep, effect2); + } + effect2.deps[effect2._depsLength++] = dep; + } else { + effect2._depsLength++; + } + if (true) { + (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + } +} +var queueEffectSchedulers = []; +function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { + var _a; + pauseScheduling(); + for (const effect2 of dep.keys()) { + let tracking; + if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); + effect2._dirtyLevel = dirtyLevel; + } + if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + if (true) { + (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + effect2.trigger(); + if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { + effect2._shouldSchedule = false; + if (effect2.scheduler) { + queueEffectSchedulers.push(effect2.scheduler); + } + } + } + } + resetScheduling(); +} +var createDep = (cleanup, computed3) => { + const dep = /* @__PURE__ */ new Map(); + dep.cleanup = cleanup; + dep.computed = computed3; + return dep; +}; +var targetMap = /* @__PURE__ */ new WeakMap(); +var ITERATE_KEY = Symbol(true ? "iterate" : ""); +var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : ""); +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep(() => depsMap.delete(key))); + } + trackEffect( + activeEffect, + dep, + true ? { + target, + type, + key + } : void 0 + ); + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray(target)) { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || !isSymbol(key2) && key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); + } + break; + case "delete": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + } + break; + } + } + pauseScheduling(); + for (const dep of deps) { + if (dep) { + triggerEffects( + dep, + 4, + true ? { + target, + type, + key, + newValue, + oldValue, + oldTarget + } : void 0 + ); + } + } + resetScheduling(); +} +function getDepFromReactive(object, key) { + const depsMap = targetMap.get(object); + return depsMap && depsMap.get(key); +} +var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); +var builtInSymbols = new Set( + Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +var arrayInstrumentations = createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i = 0, l = this.length; i < l; i++) { + track(arr, "get", i + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + pauseScheduling(); + const res = toRaw(this)[key].apply(this, args); + resetScheduling(); + resetTracking(); + return res; + }; + }); + return instrumentations; +} +function hasOwnProperty2(key) { + if (!isSymbol(key)) key = String(key); + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +var BaseReactiveHandler = class { + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the receiver is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; + } + const targetIsArray = isArray(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + if (key === "hasOwnProperty") { + return hasOwnProperty2; + } + } + const res = Reflect.get(target, key, receiver); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef2(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +}; +var MutableReactiveHandler = class extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value, receiver) { + let oldValue = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue); + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray(target) && isRef2(oldValue) && !isRef2(value)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue.value = value; + return true; + } + } + } + const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set(target, key, value, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + } + return result; + } + deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + const oldValue = target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +}; +var ReadonlyReactiveHandler = class extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + if (true) { + warn( + `Set operation on key "${String(key)}" failed: target is readonly.`, + target + ); + } + return true; + } + deleteProperty(target, key) { + if (true) { + warn( + `Delete operation on key "${String(key)}" failed: target is readonly.`, + target + ); + } + return true; + } +}; +var mutableHandlers = new MutableReactiveHandler(); +var readonlyHandlers = new ReadonlyReactiveHandler(); +var shallowReactiveHandlers = new MutableReactiveHandler( + true +); +var shallowReadonlyHandlers = new ReadonlyReactiveHandler(true); +var toShallow = (value) => value; +var getProto = (v) => Reflect.getPrototypeOf(v); +function get(target, key, isReadonly2 = false, isShallow2 = false) { + target = target["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } +} +function has(key, isReadonly2 = false) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); +} +function size(target, isReadonly2 = false) { + target = target["__v_raw"]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); +} +function add(value, _isShallow = false) { + if (!_isShallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; +} +function set(key, value, _isShallow = false) { + if (!_isShallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + return this; +} +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2 ? get2.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0, oldTarget); + } + return result; +} +function createForEach(isReadonly2, isShallow2) { + return function forEach(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + }; +} +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + if (true) { + const key = args[0] ? `on key "${args[0]}" ` : ``; + warn( + `${capitalize(type)} operation ${key}failed: target is readonly.`, + toRaw(this) + ); + } + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get(this, key); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get(this, key, false, true); + }, + get size() { + return size(this); + }, + has, + add(value) { + return add.call(this, value, true); + }, + set(key, value) { + return set.call(this, key, value, true); + }, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get(this, key, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, true) + }; + const iteratorMethods = [ + "keys", + "values", + "entries", + Symbol.iterator + ]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod(method, false, false); + readonlyInstrumentations2[method] = createIterableMethod(method, true, false); + shallowInstrumentations2[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations2[method] = createIterableMethod( + method, + true, + true + ); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +var [ + mutableInstrumentations, + readonlyInstrumentations, + shallowInstrumentations, + shallowReadonlyInstrumentations +] = createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get( + hasOwn(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +var mutableCollectionHandlers = { + get: createInstrumentationGetter(false, false) +}; +var shallowCollectionHandlers = { + get: createInstrumentationGetter(false, true) +}; +var readonlyCollectionHandlers = { + get: createInstrumentationGetter(true, false) +}; +var shallowReadonlyCollectionHandlers = { + get: createInstrumentationGetter(true, true) +}; +function checkIdentityKeys(target, has2, key) { + const rawKey = toRaw(key); + if (rawKey !== key && has2.call(target, rawKey)) { + const type = toRawType(target); + warn( + `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` + ); + } +} +var reactiveMap = /* @__PURE__ */ new WeakMap(); +var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +var readonlyMap = /* @__PURE__ */ new WeakMap(); +var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject(target)) { + if (true) { + warn( + `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String( + target + )}` + ); + } + return target; + } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw"]); + } + return !!(value && value["__v_isReactive"]); +} +function isReadonly(value) { + return !!(value && value["__v_isReadonly"]); +} +function isShallow(value) { + return !!(value && value["__v_isShallow"]); +} +function isProxy(value) { + return value ? !!value["__v_raw"] : false; +} +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + if (Object.isExtensible(value)) { + def(value, "__v_skip", true); + } + return value; +} +var toReactive = (value) => isObject(value) ? reactive(value) : value; +var toReadonly = (value) => isObject(value) ? readonly(value) : value; +var COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`; +var ComputedRefImpl = class { + constructor(getter, _setter, isReadonly2, isSSR) { + this.getter = getter; + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this["__v_isReadonly"] = false; + this.effect = new ReactiveEffect( + () => getter(this._value), + () => triggerRefValue( + this, + this.effect._dirtyLevel === 2 ? 2 : 3 + ) + ); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this["__v_isReadonly"] = isReadonly2; + } + get value() { + const self2 = toRaw(this); + if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) { + triggerRefValue(self2, 4); + } + trackRefValue(self2); + if (self2.effect._dirtyLevel >= 2) { + if (this._warnRecursive) { + warn(COMPUTED_SIDE_EFFECT_WARN, ` + +getter: `, this.getter); + } + triggerRefValue(self2, 2); + } + return self2._value; + } + set value(newValue) { + this._setter(newValue); + } + // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x + get _dirty() { + return this.effect.dirty; + } + set _dirty(v) { + this.effect.dirty = v; + } + // #endregion +}; +function computed(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = true ? () => { + warn("Write operation failed: computed value is readonly"); + } : NOOP; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + if (debugOptions && !isSSR) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + return cRef; +} +function trackRefValue(ref2) { + var _a; + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + trackEffect( + activeEffect, + (_a = ref2.dep) != null ? _a : ref2.dep = createDep( + () => ref2.dep = void 0, + ref2 instanceof ComputedRefImpl ? ref2 : void 0 + ), + true ? { + target: ref2, + type: "get", + key: "value" + } : void 0 + ); + } +} +function triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + triggerEffects( + dep, + dirtyLevel, + true ? { + target: ref2, + type: "set", + key: "value", + newValue: newVal, + oldValue: oldVal + } : void 0 + ); + } +} +function isRef2(r) { + return !!(r && r.__v_isRef === true); +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef2(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +var RefImpl = class { + constructor(value, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value : toRaw(value); + this._value = __v_isShallow ? value : toReactive(value); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + const oldVal = this._rawValue; + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive(newVal); + triggerRefValue(this, 4, newVal, oldVal); + } + } +}; +function triggerRef(ref2) { + triggerRefValue(ref2, 4, true ? ref2.value : void 0); +} +function unref(ref2) { + return isRef2(ref2) ? ref2.value : ref2; +} +function toValue(source) { + return isFunction(source) ? source() : unref(source); +} +var shallowUnwrapHandlers = { + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef2(oldValue) && !isRef2(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +var CustomRefImpl = class { + constructor(factory) { + this.dep = void 0; + this.__v_isRef = true; + const { get: get2, set: set2 } = factory( + () => trackRefValue(this), + () => triggerRefValue(this) + ); + this._get = get2; + this._set = set2; + } + get value() { + return this._get(); + } + set value(newVal) { + this._set(newVal); + } +}; +function customRef(factory) { + return new CustomRefImpl(factory); +} +function toRefs(object) { + if (!isProxy(object)) { + warn(`toRefs() expects a reactive object but received a plain one.`); + } + const ret = isArray(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = propertyToRef(object, key); + } + return ret; +} +var ObjectRefImpl = class { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this.__v_isRef = true; + } + get value() { + const val = this._object[this._key]; + return val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +}; +var GetterRefImpl = class { + constructor(_getter) { + this._getter = _getter; + this.__v_isRef = true; + this.__v_isReadonly = true; + } + get value() { + return this._getter(); + } +}; +function toRef(source, key, defaultValue) { + if (isRef2(source)) { + return source; + } else if (isFunction(source)) { + return new GetterRefImpl(source); + } else if (isObject(source) && arguments.length > 1) { + return propertyToRef(source, key, defaultValue); + } else { + return ref(source); + } +} +function propertyToRef(source, key, defaultValue) { + const val = source[key]; + return isRef2(val) ? val : new ObjectRefImpl(source, key, defaultValue); +} +var TrackOpTypes = { + "GET": "get", + "HAS": "has", + "ITERATE": "iterate" +}; +var TriggerOpTypes = { + "SET": "set", + "ADD": "add", + "DELETE": "delete", + "CLEAR": "clear" +}; + +// node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +var stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +function popWarningContext() { + stack.pop(); +} +var isWarning = false; +function warn$1(msg, ...args) { + if (isWarning) return; + isWarning = true; + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + // eslint-disable-next-line no-restricted-syntax + msg + args.map((a) => { + var _a, _b; + return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); + isWarning = false; +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef2(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function assertNumber(val, type) { + if (false) return; + if (val === void 0) { + return; + } else if (typeof val !== "number") { + warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`); + } else if (isNaN(val)) { + warn$1(`${type} is NaN - the duration expression might be incorrect.`); + } +} +var ErrorCodes = { + "SETUP_FUNCTION": 0, + "0": "SETUP_FUNCTION", + "RENDER_FUNCTION": 1, + "1": "RENDER_FUNCTION", + "WATCH_GETTER": 2, + "2": "WATCH_GETTER", + "WATCH_CALLBACK": 3, + "3": "WATCH_CALLBACK", + "WATCH_CLEANUP": 4, + "4": "WATCH_CLEANUP", + "NATIVE_EVENT_HANDLER": 5, + "5": "NATIVE_EVENT_HANDLER", + "COMPONENT_EVENT_HANDLER": 6, + "6": "COMPONENT_EVENT_HANDLER", + "VNODE_HOOK": 7, + "7": "VNODE_HOOK", + "DIRECTIVE_HOOK": 8, + "8": "DIRECTIVE_HOOK", + "TRANSITION_HOOK": 9, + "9": "TRANSITION_HOOK", + "APP_ERROR_HANDLER": 10, + "10": "APP_ERROR_HANDLER", + "APP_WARN_HANDLER": 11, + "11": "APP_WARN_HANDLER", + "FUNCTION_REF": 12, + "12": "FUNCTION_REF", + "ASYNC_COMPONENT_LOADER": 13, + "13": "ASYNC_COMPONENT_LOADER", + "SCHEDULER": 14, + "14": "SCHEDULER", + "COMPONENT_UPDATE": 15, + "15": "COMPONENT_UPDATE" +}; +var ErrorTypeStrings$1 = { + ["sp"]: "serverPrefetch hook", + ["bc"]: "beforeCreate hook", + ["c"]: "created hook", + ["bm"]: "beforeMount hook", + ["m"]: "mounted hook", + ["bu"]: "beforeUpdate hook", + ["u"]: "updated", + ["bum"]: "beforeUnmount hook", + ["um"]: "unmounted hook", + ["a"]: "activated hook", + ["da"]: "deactivated hook", + ["ec"]: "errorCaptured hook", + ["rtc"]: "renderTracked hook", + ["rtg"]: "renderTriggered hook", + [0]: "setup function", + [1]: "render function", + [2]: "watcher getter", + [3]: "watcher callback", + [4]: "watcher cleanup function", + [5]: "native event handler", + [6]: "component event handler", + [7]: "vnode hook", + [8]: "directive hook", + [9]: "transition hook", + [10]: "app errorHandler", + [11]: "app warnHandler", + [12]: "ref function", + [13]: "async component loader", + [14]: "scheduler flush", + [15]: "component update" +}; +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + if (isArray(fn)) { + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; + } else if (true) { + warn$1( + `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}` + ); + } +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = true ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + pauseTracking(); + callWithErrorHandling( + appErrorHandler, + null, + 10, + [err, exposedInstance, errorInfo] + ); + resetTracking(); + return; + } + } + logError(err, type, contextVNode, throwInDev); +} +function logError(err, type, contextVNode, throwInDev = true) { + if (true) { + const info = ErrorTypeStrings$1[type]; + if (contextVNode) { + pushWarningContext(contextVNode); + } + warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`); + if (contextVNode) { + popWarningContext(); + } + if (throwInDev) { + throw err; + } else { + console.error(err); + } + } else { + console.error(err); + } +} +var isFlushing = false; +var isFlushPending = false; +var queue = []; +var flushIndex = 0; +var pendingPostFlushCbs = []; +var activePostFlushCbs = null; +var postFlushIndex = 0; +var resolvedPromise = Promise.resolve(); +var currentFlushPromise = null; +var RECURSION_LIMIT = 100; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex(id) { + let start = flushIndex + 1; + let end = queue.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJob = queue[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id || middleJobId === id && middleJob.pre) { + start = middle + 1; + } else { + end = middle; + } + } + return start; +} +function queueJob(job) { + if (!queue.length || !queue.includes( + job, + isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex + )) { + if (job.id == null) { + queue.push(job); + } else { + queue.splice(findInsertionIndex(job.id), 0, job); + } + queueFlush(); + } +} +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function invalidateJob(job) { + const i = queue.indexOf(job); + if (i > flushIndex) { + queue.splice(i, 1); + } +} +function queuePostFlushCb(cb) { + if (!isArray(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes( + cb, + cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex + )) { + pendingPostFlushCbs.push(cb); + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) { + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.pre) { + if (instance && cb.id !== instance.uid) { + continue; + } + if (checkRecursiveUpdates(seen, cb)) { + continue; + } + queue.splice(i, 1); + i--; + cb(); + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + const cb = activePostFlushCbs[postFlushIndex]; + if (checkRecursiveUpdates(seen, cb)) { + continue; + } + if (cb.active !== false) cb(); + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +var getId = (job) => job.id == null ? Infinity : job.id; +var comparator = (a, b) => { + const diff = getId(a) - getId(b); + if (diff === 0) { + if (a.pre && !b.pre) return -1; + if (b.pre && !a.pre) return 1; + } + return diff; +}; +function flushJobs(seen) { + isFlushPending = false; + isFlushing = true; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + queue.sort(comparator); + const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP; + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && job.active !== false) { + if (check(job)) { + continue; + } + callWithErrorHandling( + job, + job.i, + job.i ? 15 : 14 + ); + } + } + } finally { + flushIndex = 0; + queue.length = 0; + flushPostFlushCbs(seen); + isFlushing = false; + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(seen); + } + } +} +function checkRecursiveUpdates(seen, fn) { + if (!seen.has(fn)) { + seen.set(fn, 1); + } else { + const count = seen.get(fn); + if (count > RECURSION_LIMIT) { + const instance = fn.i; + const componentName = instance && getComponentName(instance.type); + handleError( + `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, + null, + 10 + ); + return true; + } else { + seen.set(fn, count + 1); + } + } +} +var isHmrUpdating = false; +var hmrDirtyComponents = /* @__PURE__ */ new Map(); +if (true) { + getGlobalThis().__VUE_HMR_RUNTIME__ = { + createRecord: tryWrap(createRecord), + rerender: tryWrap(rerender), + reload: tryWrap(reload) + }; +} +var map = /* @__PURE__ */ new Map(); +function registerHMR(instance) { + const id = instance.type.__hmrId; + let record = map.get(id); + if (!record) { + createRecord(id, instance.type); + record = map.get(id); + } + record.instances.add(instance); +} +function unregisterHMR(instance) { + map.get(instance.type.__hmrId).instances.delete(instance); +} +function createRecord(id, initialDef) { + if (map.has(id)) { + return false; + } + map.set(id, { + initialDef: normalizeClassComponent(initialDef), + instances: /* @__PURE__ */ new Set() + }); + return true; +} +function normalizeClassComponent(component) { + return isClassComponent(component) ? component.__vccOpts : component; +} +function rerender(id, newRender) { + const record = map.get(id); + if (!record) { + return; + } + record.initialDef.render = newRender; + [...record.instances].forEach((instance) => { + if (newRender) { + instance.render = newRender; + normalizeClassComponent(instance.type).render = newRender; + } + instance.renderCache = []; + isHmrUpdating = true; + instance.effect.dirty = true; + instance.update(); + isHmrUpdating = false; + }); +} +function reload(id, newComp) { + const record = map.get(id); + if (!record) return; + newComp = normalizeClassComponent(newComp); + updateComponentDef(record.initialDef, newComp); + const instances = [...record.instances]; + for (let i = 0; i < instances.length; i++) { + const instance = instances[i]; + const oldComp = normalizeClassComponent(instance.type); + let dirtyInstances = hmrDirtyComponents.get(oldComp); + if (!dirtyInstances) { + if (oldComp !== record.initialDef) { + updateComponentDef(oldComp, newComp); + } + hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set()); + } + dirtyInstances.add(instance); + instance.appContext.propsCache.delete(instance.type); + instance.appContext.emitsCache.delete(instance.type); + instance.appContext.optionsCache.delete(instance.type); + if (instance.ceReload) { + dirtyInstances.add(instance); + instance.ceReload(newComp.styles); + dirtyInstances.delete(instance); + } else if (instance.parent) { + instance.parent.effect.dirty = true; + queueJob(() => { + instance.parent.update(); + dirtyInstances.delete(instance); + }); + } else if (instance.appContext.reload) { + instance.appContext.reload(); + } else if (typeof window !== "undefined") { + window.location.reload(); + } else { + console.warn( + "[HMR] Root or manually mounted instance modified. Full reload required." + ); + } + } + queuePostFlushCb(() => { + hmrDirtyComponents.clear(); + }); +} +function updateComponentDef(oldComp, newComp) { + extend(oldComp, newComp); + for (const key in oldComp) { + if (key !== "__file" && !(key in newComp)) { + delete oldComp[key]; + } + } +} +function tryWrap(fn) { + return (id, arg) => { + try { + return fn(id, arg); + } catch (e) { + console.error(e); + console.warn( + `[HMR] Something went wrong during Vue component hot-reload. Full reload required.` + ); + } + }; +} +var devtools$1; +var buffer = []; +var devtoolsNotInstalled = false; +function emit$1(event, ...args) { + if (devtools$1) { + devtools$1.emit(event, ...args); + } else if (!devtoolsNotInstalled) { + buffer.push({ event, args }); + } +} +function setDevtoolsHook$1(hook, target) { + var _a, _b; + devtools$1 = hook; + if (devtools$1) { + devtools$1.enabled = true; + buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + // eslint-disable-next-line no-restricted-syntax + !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook$1(newHook, target); + }); + setTimeout(() => { + if (!devtools$1) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + devtoolsNotInstalled = true; + buffer = []; + } + }, 3e3); + } else { + devtoolsNotInstalled = true; + buffer = []; + } +} +function devtoolsInitApp(app, version2) { + emit$1("app:init", app, version2, { + Fragment, + Text, + Comment, + Static + }); +} +function devtoolsUnmountApp(app) { + emit$1("app:unmount", app); +} +var devtoolsComponentAdded = createDevtoolsComponentHook( + "component:added" + /* COMPONENT_ADDED */ +); +var devtoolsComponentUpdated = createDevtoolsComponentHook( + "component:updated" + /* COMPONENT_UPDATED */ +); +var _devtoolsComponentRemoved = createDevtoolsComponentHook( + "component:removed" + /* COMPONENT_REMOVED */ +); +var devtoolsComponentRemoved = (component) => { + if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered + !devtools$1.cleanupBuffer(component)) { + _devtoolsComponentRemoved(component); + } +}; +function createDevtoolsComponentHook(hook) { + return (component) => { + emit$1( + hook, + component.appContext.app, + component.uid, + component.parent ? component.parent.uid : void 0, + component + ); + }; +} +var devtoolsPerfStart = createDevtoolsPerformanceHook( + "perf:start" + /* PERFORMANCE_START */ +); +var devtoolsPerfEnd = createDevtoolsPerformanceHook( + "perf:end" + /* PERFORMANCE_END */ +); +function createDevtoolsPerformanceHook(hook) { + return (component, type, time) => { + emit$1(hook, component.appContext.app, component.uid, component, type, time); + }; +} +function devtoolsComponentEmit(component, event, params) { + emit$1( + "component:emit", + component.appContext.app, + component, + event, + params + ); +} +var currentRenderingInstance = null; +var currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function pushScopeId(id) { + currentScopeId = id; +} +function popScopeId() { + currentScopeId = null; +} +var withScopeId = (_id) => withCtx; +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + if (true) { + devtoolsComponentUpdated(ctx); + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +function validateDirectiveName(name) { + if (isBuiltInDirective(name)) { + warn$1("Do not use built-in directive ids as custom directive id: " + name); + } +} +function withDirectives(vnode, directives) { + if (currentRenderingInstance === null) { + warn$1(`withDirectives can only be used inside render functions.`); + return vnode; + } + const instance = getComponentPublicInstance(currentRenderingInstance); + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; + if (dir) { + if (isFunction(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +var leaveCbKey = Symbol("_leaveCb"); +var enterCbKey = Symbol("_enterCb"); +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +var TransitionHookValidator = [Function, Array]; +var BaseTransitionPropsValidators = { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator +}; +var recursiveGetSubtree = (instance) => { + const subTree = instance.subTree; + return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; +}; +var BaseTransitionImpl = { + name: `BaseTransition`, + props: BaseTransitionPropsValidators, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + let child = children[0]; + if (children.length > 1) { + let hasFound = false; + for (const c of children) { + if (c.type !== Comment) { + if (hasFound) { + warn$1( + "<transition> can only be used on a single element or component. Use <transition-group> for lists." + ); + break; + } + child = c; + hasFound = true; + if (false) break; + } + } + } + const rawProps = toRaw(props); + const { mode } = rawProps; + if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { + warn$1(`invalid <transition> mode: ${mode}`); + } + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getKeepAliveChild(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + let enterHooks = resolveTransitionHooks( + innerChild, + rawProps, + state, + instance, + // #11061, ensure enterHooks is fresh after clone + (hooks) => enterHooks = hooks + ); + setTransitionHooks(innerChild, enterHooks); + const oldChild = instance.subTree; + const oldInnerChild = oldChild && getKeepAliveChild(oldChild); + if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) { + const leavingHooks = resolveTransitionHooks( + oldInnerChild, + rawProps, + state, + instance + ); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in" && innerChild.type !== Comment) { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (instance.update.active !== false) { + instance.effect.dirty = true; + instance.update(); + } + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType( + state, + oldInnerChild + ); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el[leaveCbKey] = () => { + earlyRemove(); + el[leaveCbKey] = void 0; + delete enterHooks.delayedLeave; + }; + enterHooks.delayedLeave = delayedLeave; + }; + } + } + return child; + }; + } +}; +var BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance, postClone) { + const { + appear, + mode, + persisted = false, + onBeforeEnter, + onEnter, + onAfterEnter, + onEnterCancelled, + onBeforeLeave, + onLeave, + onAfterLeave, + onLeaveCancelled, + onBeforeAppear, + onAppear, + onAfterAppear, + onAppearCancelled + } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook3 = (hook, args) => { + hook && callWithAsyncErrorHandling( + hook, + instance, + 9, + args + ); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook3(hook, args); + if (isArray(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el[leaveCbKey]) { + el[leaveCbKey]( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { + leavingVNode.el[leaveCbKey](); + } + callHook3(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el[enterCbKey] = (cancelled) => { + if (called) return; + called = true; + if (cancelled) { + callHook3(cancelHook, [el]); + } else { + callHook3(afterHook, [el]); + } + if (hooks.delayedLeave) { + hooks.delayedLeave(); + } + el[enterCbKey] = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el[enterCbKey]) { + el[enterCbKey]( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook3(onBeforeLeave, [el]); + let called = false; + const done = el[leaveCbKey] = (cancelled) => { + if (called) return; + called = true; + remove2(); + if (cancelled) { + callHook3(onLeaveCancelled, [el]); + } else { + callHook3(onAfterLeave, [el]); + } + el[leaveCbKey] = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + const hooks2 = resolveTransitionHooks( + vnode2, + props, + state, + instance, + postClone + ); + if (postClone) postClone(hooks2); + return hooks2; + } + }; + return hooks; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getKeepAliveChild(vnode) { + if (!isKeepAlive(vnode)) { + return vnode; + } + if (vnode.component) { + return vnode.component.subTree; + } + const { shapeFlag, children } = vnode; + if (children) { + if (shapeFlag & 16) { + return children[0]; + } + if (shapeFlag & 32 && isFunction(children.default)) { + return children.default(); + } + } +} +function setTransitionHooks(vnode, hooks) { + if (vnode.shapeFlag & 6 && vnode.component) { + setTransitionHooks(vnode.component.subTree, hooks); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); + } else { + vnode.transition = hooks; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) keyedFragmentCount++; + ret = ret.concat( + getTransitionRawChildren(child.children, keepComment, key) + ); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +function defineComponent(options, extraOptions) { + return isFunction(options) ? ( + // #8326: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + (() => extend({ name: options.name }, extraOptions, { setup: options }))() + ) : options; +} +var isAsyncWrapper = (i) => !!i.type.__asyncLoader; +function defineAsyncComponent(source) { + if (isFunction(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay = 200, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = () => { + retries++; + pendingRequest = null; + return load(); + }; + const load = () => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject) => { + const userRetry = () => resolve2(retry()); + const userFail = () => reject(err); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (!comp) { + warn$1( + `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.` + ); + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; + } + if (comp && !isObject(comp) && !isFunction(comp)) { + throw new Error(`Invalid async component load result: ${comp}`); + } + resolvedComp = comp; + return comp; + })); + }; + return defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load, + get __asyncResolved() { + return resolvedComp; + }, + setup() { + const instance = currentInstance; + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = (err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + ); + }; + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded = ref(false); + const error = ref(); + const delayed = ref(!!delay); + if (delay) { + setTimeout(() => { + delayed.value = false; + }, delay); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded.value && !error.value) { + const err = new Error( + `Async component timed out after ${timeout}ms.` + ); + onError(err); + error.value = err; + } + }, timeout); + } + load().then(() => { + loaded.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + instance.parent.effect.dirty = true; + queueJob(instance.parent.update); + } + }).catch((err) => { + onError(err); + error.value = err; + }); + return () => { + if (loaded.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error.value && errorComponent) { + return createVNode(errorComponent, { + error: error.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; + } + }); +} +function createInnerComp(comp, parent) { + const { ref: ref2, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref2; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +var isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +var KeepAliveImpl = { + name: `KeepAlive`, + // Marker for special handling inside the renderer. We are not using a === + // check directly on KeepAlive in the renderer, because importing it directly + // would prevent it from being tree-shaken. + __isKeepAlive: true, + props: { + include: [String, RegExp, Array], + exclude: [String, RegExp, Array], + max: [String, Number] + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const sharedContext = instance.ctx; + if (!sharedContext.renderer) { + return () => { + const children = slots.default && slots.default(); + return children && children.length === 1 ? children[0] : children; + }; + } + const cache = /* @__PURE__ */ new Map(); + const keys = /* @__PURE__ */ new Set(); + let current = null; + if (true) { + instance.__v_cache = cache; + } + const parentSuspense = instance.suspense; + const { + renderer: { + p: patch, + m: move, + um: _unmount, + o: { createElement } + } + } = sharedContext; + const storageContainer = createElement("div"); + sharedContext.activate = (vnode, container, anchor, namespace, optimized) => { + const instance2 = vnode.component; + move(vnode, container, anchor, 0, parentSuspense); + patch( + instance2.vnode, + vnode, + container, + anchor, + instance2, + parentSuspense, + namespace, + vnode.slotScopeIds, + optimized + ); + queuePostRenderEffect(() => { + instance2.isDeactivated = false; + if (instance2.a) { + invokeArrayFns(instance2.a); + } + const vnodeHook = vnode.props && vnode.props.onVnodeMounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + sharedContext.deactivate = (vnode) => { + const instance2 = vnode.component; + invalidateMount(instance2.m); + invalidateMount(instance2.a); + move(vnode, storageContainer, null, 1, parentSuspense); + queuePostRenderEffect(() => { + if (instance2.da) { + invokeArrayFns(instance2.da); + } + const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + instance2.isDeactivated = true; + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + function unmount(vnode) { + resetShapeFlag(vnode); + _unmount(vnode, instance, parentSuspense, true); + } + function pruneCache(filter) { + cache.forEach((vnode, key) => { + const name = getComponentName(vnode.type); + if (name && (!filter || !filter(name))) { + pruneCacheEntry(key); + } + }); + } + function pruneCacheEntry(key) { + const cached = cache.get(key); + if (cached && (!current || !isSameVNodeType(cached, current))) { + unmount(cached); + } else if (current) { + resetShapeFlag(current); + } + cache.delete(key); + keys.delete(key); + } + watch( + () => [props.include, props.exclude], + ([include, exclude]) => { + include && pruneCache((name) => matches(include, name)); + exclude && pruneCache((name) => !matches(exclude, name)); + }, + // prune post-render after `current` has been updated + { flush: "post", deep: true } + ); + let pendingCacheKey = null; + const cacheSubtree = () => { + if (pendingCacheKey != null) { + if (isSuspense(instance.subTree.type)) { + queuePostRenderEffect(() => { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + }, instance.subTree.suspense); + } else { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + } + } + }; + onMounted(cacheSubtree); + onUpdated(cacheSubtree); + onBeforeUnmount(() => { + cache.forEach((cached) => { + const { subTree, suspense } = instance; + const vnode = getInnerChild(subTree); + if (cached.type === vnode.type && cached.key === vnode.key) { + resetShapeFlag(vnode); + const da = vnode.component.da; + da && queuePostRenderEffect(da, suspense); + return; + } + unmount(cached); + }); + }); + return () => { + pendingCacheKey = null; + if (!slots.default) { + return null; + } + const children = slots.default(); + const rawVNode = children[0]; + if (children.length > 1) { + if (true) { + warn$1(`KeepAlive should contain exactly one component child.`); + } + current = null; + return children; + } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { + current = null; + return rawVNode; + } + let vnode = getInnerChild(rawVNode); + if (vnode.type === Comment) { + current = null; + return vnode; + } + const comp = vnode.type; + const name = getComponentName( + isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp + ); + const { include, exclude, max } = props; + if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { + current = vnode; + return rawVNode; + } + const key = vnode.key == null ? comp : vnode.key; + const cachedVNode = cache.get(key); + if (vnode.el) { + vnode = cloneVNode(vnode); + if (rawVNode.shapeFlag & 128) { + rawVNode.ssContent = vnode; + } + } + pendingCacheKey = key; + if (cachedVNode) { + vnode.el = cachedVNode.el; + vnode.component = cachedVNode.component; + if (vnode.transition) { + setTransitionHooks(vnode, vnode.transition); + } + vnode.shapeFlag |= 512; + keys.delete(key); + keys.add(key); + } else { + keys.add(key); + if (max && keys.size > parseInt(max, 10)) { + pruneCacheEntry(keys.values().next().value); + } + } + vnode.shapeFlag |= 256; + current = vnode; + return isSuspense(rawVNode.type) ? rawVNode : vnode; + }; + } +}; +var KeepAlive = KeepAliveImpl; +function matches(pattern, name) { + if (isArray(pattern)) { + return pattern.some((p2) => matches(p2, name)); + } else if (isString(pattern)) { + return pattern.split(",").includes(name); + } else if (isRegExp(pattern)) { + return pattern.test(name); + } + return false; +} +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function resetShapeFlag(vnode) { + vnode.shapeFlag &= ~256; + vnode.shapeFlag &= ~512; +} +function getInnerChild(vnode) { + return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + pauseTracking(); + const reset = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } else if (true) { + const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, "")); + warn$1( + `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` + ); + } +} +var createHook = (lifecycle) => (hook, target = currentInstance) => { + if (!isInSSRComponentSetup || lifecycle === "sp") { + injectHook(lifecycle, (...args) => hook(...args), target); + } +}; +var onBeforeMount = createHook("bm"); +var onMounted = createHook("m"); +var onBeforeUpdate = createHook("bu"); +var onUpdated = createHook("u"); +var onBeforeUnmount = createHook("bum"); +var onUnmounted = createHook("um"); +var onServerPrefetch = createHook("sp"); +var onRenderTriggered = createHook( + "rtg" +); +var onRenderTracked = createHook( + "rtc" +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +var COMPONENTS = "components"; +var DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); +function resolveDynamicComponent(component) { + if (isString(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + if (warnMissing && !res) { + const extra = type === COMPONENTS ? ` +If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; + warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); + } + return res; + } else if (true) { + warn$1( + `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().` + ); + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache && cache[index]; + if (isArray(source) || isString(source)) { + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); + } + } else if (typeof source === "number") { + if (!Number.isInteger(source)) { + warn$1(`The v-for range expect an integer value but got ${source}.`); + } + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); + } + } else if (isObject(source)) { + if (source[Symbol.iterator]) { + ret = Array.from( + source, + (item, i) => renderItem(item, i, void 0, cached && cached[i]) + ); + } else { + const keys = Object.keys(source); + ret = new Array(keys.length); + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i]; + ret[i] = renderItem(source[key], key, i, cached && cached[i]); + } + } + } else { + ret = []; + } + if (cache) { + cache[index] = ret; + } + return ret; +} +function createSlots(slots, dynamicSlots) { + for (let i = 0; i < dynamicSlots.length; i++) { + const slot = dynamicSlots[i]; + if (isArray(slot)) { + for (let j = 0; j < slot.length; j++) { + slots[slot[j].name] = slot[j].fn; + } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) res.key = slot.key; + return res; + } : slot.fn; + } + } + return slots; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { + if (name !== "default") props.name = name; + return createVNode("slot", props, fallback && fallback()); + } + let slot = slots[name]; + if (slot && slot.length > 1) { + warn$1( + `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.` + ); + slot = () => []; + } + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const rendered = createBlock( + Fragment, + { + key: (props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key || `_${name}`) + // #7256 force differentiate fallback content from actual content + (!validSlotContent && fallback ? "_fb" : "") + }, + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) return true; + if (child.type === Comment) return false; + if (child.type === Fragment && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + if (!isObject(obj)) { + warn$1(`v-on with no argument expects an object value.`); + return ret; + } + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +var getPublicInstance = (i) => { + if (!i) return null; + if (isStatefulComponent(i)) return getComponentPublicInstance(i); + return getPublicInstance(i.parent); +}; +var publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + extend(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => true ? shallowReadonly(i.props) : i.props, + $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs, + $slots: (i) => true ? shallowReadonly(i.slots) : i.slots, + $refs: (i) => true ? shallowReadonly(i.refs) : i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $emit: (i) => i.emit, + $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type, + $forceUpdate: (i) => i.f || (i.f = () => { + i.effect.dirty = true; + queueJob(i.update); + }), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP + }) +); +var isReservedPrefix = (key) => key === "_" || key === "$"; +var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +var PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + if (key === "__v_skip") { + return true; + } + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + if (key === "__isVue") { + return true; + } + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance.attrs, "get", ""); + markAttrsAccessed(); + } else if (key === "$slots") { + track(instance, "get", key); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading + // to infinite warning loop + key.indexOf("__v") !== 0)) { + if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { + warn$1( + `Property ${JSON.stringify( + key + )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` + ); + } else if (instance === currentRenderingInstance) { + warn$1( + `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` + ); + } + } + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { + warn$1(`Cannot mutate <script setup> binding "${key}" from Options API.`); + return false; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + data[key] = value; + return true; + } else if (hasOwn(instance.props, key)) { + warn$1(`Attempting to mutate prop "${key}". Props are readonly.`); + return false; + } + if (key[0] === "$" && key.slice(1) in instance) { + warn$1( + `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.` + ); + return false; + } else { + if (key in instance.appContext.config.globalProperties) { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + value + }); + } else { + ctx[key] = value; + } + } + return true; + }, + has({ + _: { data, setupState, accessCache, ctx, appContext, propsOptions } + }, key) { + let normalizedProps; + return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key); + }, + defineProperty(target, key, descriptor) { + if (descriptor.get != null) { + target._.accessCache[key] = 0; + } else if (hasOwn(descriptor, "value")) { + this.set(target, key, descriptor.value, null); + } + return Reflect.defineProperty(target, key, descriptor); + } +}; +if (true) { + PublicInstanceProxyHandlers.ownKeys = (target) => { + warn$1( + `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.` + ); + return Reflect.ownKeys(target); + }; +} +var RuntimeCompiledPublicInstanceProxyHandlers = extend( + {}, + PublicInstanceProxyHandlers, + { + get(target, key) { + if (key === Symbol.unscopables) { + return; + } + return PublicInstanceProxyHandlers.get(target, key, target); + }, + has(_, key) { + const has2 = key[0] !== "_" && !isGloballyAllowed(key); + if (!has2 && PublicInstanceProxyHandlers.has(_, key)) { + warn$1( + `Property ${JSON.stringify( + key + )} should not start with _ which is a reserved prefix for Vue internals.` + ); + } + return has2; + } + } +); +function createDevRenderContext(instance) { + const target = {}; + Object.defineProperty(target, `_`, { + configurable: true, + enumerable: false, + get: () => instance + }); + Object.keys(publicPropertiesMap).forEach((key) => { + Object.defineProperty(target, key, { + configurable: true, + enumerable: false, + get: () => publicPropertiesMap[key](instance), + // intercepted by the proxy so no need for implementation, + // but needed to prevent set errors + set: NOOP + }); + }); + return target; +} +function exposePropsOnRenderContext(instance) { + const { + ctx, + propsOptions: [propsOptions] + } = instance; + if (propsOptions) { + Object.keys(propsOptions).forEach((key) => { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => instance.props[key], + set: NOOP + }); + }); + } +} +function exposeSetupStateOnRenderContext(instance) { + const { ctx, setupState } = instance; + Object.keys(toRaw(setupState)).forEach((key) => { + if (!setupState.__isScriptSetup) { + if (isReservedPrefix(key[0])) { + warn$1( + `setup() return property ${JSON.stringify( + key + )} should not start with "$" or "_" which are reserved prefixes for Vue internals.` + ); + return; + } + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => setupState[key], + set: NOOP + }); + } + }); +} +var warnRuntimeUsage = (method) => warn$1( + `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.` +); +function defineProps() { + if (true) { + warnRuntimeUsage(`defineProps`); + } + return null; +} +function defineEmits() { + if (true) { + warnRuntimeUsage(`defineEmits`); + } + return null; +} +function defineExpose(exposed) { + if (true) { + warnRuntimeUsage(`defineExpose`); + } +} +function defineOptions(options) { + if (true) { + warnRuntimeUsage(`defineOptions`); + } +} +function defineSlots() { + if (true) { + warnRuntimeUsage(`defineSlots`); + } + return null; +} +function defineModel() { + if (true) { + warnRuntimeUsage("defineModel"); + } +} +function withDefaults(props, defaults) { + if (true) { + warnRuntimeUsage(`withDefaults`); + } + return null; +} +function useSlots() { + return getContext().slots; +} +function useAttrs() { + return getContext().attrs; +} +function getContext() { + const i = getCurrentInstance(); + if (!i) { + warn$1(`useContext() called without active instance.`); + } + return i.setupContext || (i.setupContext = createSetupContext(i)); +} +function normalizePropsOrEmits(props) { + return isArray(props) ? props.reduce( + (normalized, p2) => (normalized[p2] = null, normalized), + {} + ) : props; +} +function mergeDefaults(raw, defaults) { + const props = normalizePropsOrEmits(raw); + for (const key in defaults) { + if (key.startsWith("__skip")) continue; + let opt = props[key]; + if (opt) { + if (isArray(opt) || isFunction(opt)) { + opt = props[key] = { type: opt, default: defaults[key] }; + } else { + opt.default = defaults[key]; + } + } else if (opt === null) { + opt = props[key] = { default: defaults[key] }; + } else if (true) { + warn$1(`props default key "${key}" has no corresponding declaration.`); + } + if (opt && defaults[`__skip_${key}`]) { + opt.skipFactory = true; + } + } + return props; +} +function mergeModels(a, b) { + if (!a || !b) return a || b; + if (isArray(a) && isArray(b)) return a.concat(b); + return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b)); +} +function createPropsRestProxy(props, excludedKeys) { + const ret = {}; + for (const key in props) { + if (!excludedKeys.includes(key)) { + Object.defineProperty(ret, key, { + enumerable: true, + get: () => props[key] + }); + } + } + return ret; +} +function withAsyncContext(getAwaitable) { + const ctx = getCurrentInstance(); + if (!ctx) { + warn$1( + `withAsyncContext called without active current instance. This is likely a bug.` + ); + } + let awaitable = getAwaitable(); + unsetCurrentInstance(); + if (isPromise(awaitable)) { + awaitable = awaitable.catch((e) => { + setCurrentInstance(ctx); + throw e; + }); + } + return [awaitable, () => setCurrentInstance(ctx)]; +} +function createDuplicateChecker() { + const cache = /* @__PURE__ */ Object.create(null); + return (type, key) => { + if (cache[key]) { + warn$1(`${type} property "${key}" is already defined in ${cache[key]}.`); + } else { + cache[key] = type; + } + }; +} +var shouldCacheAccess = true; +function applyOptions(instance) { + const options = resolveMergedOptions(instance); + const publicThis = instance.proxy; + const ctx = instance.ctx; + shouldCacheAccess = false; + if (options.beforeCreate) { + callHook(options.beforeCreate, instance, "bc"); + } + const { + // state + data: dataOptions, + computed: computedOptions, + methods, + watch: watchOptions, + provide: provideOptions, + inject: injectOptions, + // lifecycle + created, + beforeMount, + mounted, + beforeUpdate, + updated, + activated, + deactivated, + beforeDestroy, + beforeUnmount, + destroyed, + unmounted, + render: render2, + renderTracked, + renderTriggered, + errorCaptured, + serverPrefetch, + // public API + expose, + inheritAttrs, + // assets + components, + directives, + filters + } = options; + const checkDuplicateProperties = true ? createDuplicateChecker() : null; + if (true) { + const [propsOptions] = instance.propsOptions; + if (propsOptions) { + for (const key in propsOptions) { + checkDuplicateProperties("Props", key); + } + } + } + if (injectOptions) { + resolveInjections(injectOptions, ctx, checkDuplicateProperties); + } + if (methods) { + for (const key in methods) { + const methodHandler = methods[key]; + if (isFunction(methodHandler)) { + if (true) { + Object.defineProperty(ctx, key, { + value: methodHandler.bind(publicThis), + configurable: true, + enumerable: true, + writable: true + }); + } else { + ctx[key] = methodHandler.bind(publicThis); + } + if (true) { + checkDuplicateProperties("Methods", key); + } + } else if (true) { + warn$1( + `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?` + ); + } + } + } + if (dataOptions) { + if (!isFunction(dataOptions)) { + warn$1( + `The data option must be a function. Plain object usage is no longer supported.` + ); + } + const data = dataOptions.call(publicThis, publicThis); + if (isPromise(data)) { + warn$1( + `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.` + ); + } + if (!isObject(data)) { + warn$1(`data() should return an object.`); + } else { + instance.data = reactive(data); + if (true) { + for (const key in data) { + checkDuplicateProperties("Data", key); + if (!isReservedPrefix(key[0])) { + Object.defineProperty(ctx, key, { + configurable: true, + enumerable: true, + get: () => data[key], + set: NOOP + }); + } + } + } + } + } + shouldCacheAccess = true; + if (computedOptions) { + for (const key in computedOptions) { + const opt = computedOptions[key]; + const get2 = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; + if (get2 === NOOP) { + warn$1(`Computed property "${key}" has no getter.`); + } + const set2 = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : true ? () => { + warn$1( + `Write operation failed: computed property "${key}" is readonly.` + ); + } : NOOP; + const c = computed2({ + get: get2, + set: set2 + }); + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => c.value, + set: (v) => c.value = v + }); + if (true) { + checkDuplicateProperties("Computed", key); + } + } + } + if (watchOptions) { + for (const key in watchOptions) { + createWatcher(watchOptions[key], ctx, publicThis, key); + } + } + if (provideOptions) { + const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions; + Reflect.ownKeys(provides).forEach((key) => { + provide(key, provides[key]); + }); + } + if (created) { + callHook(created, instance, "c"); + } + function registerLifecycleHook(register, hook) { + if (isArray(hook)) { + hook.forEach((_hook) => register(_hook.bind(publicThis))); + } else if (hook) { + register(hook.bind(publicThis)); + } + } + registerLifecycleHook(onBeforeMount, beforeMount); + registerLifecycleHook(onMounted, mounted); + registerLifecycleHook(onBeforeUpdate, beforeUpdate); + registerLifecycleHook(onUpdated, updated); + registerLifecycleHook(onActivated, activated); + registerLifecycleHook(onDeactivated, deactivated); + registerLifecycleHook(onErrorCaptured, errorCaptured); + registerLifecycleHook(onRenderTracked, renderTracked); + registerLifecycleHook(onRenderTriggered, renderTriggered); + registerLifecycleHook(onBeforeUnmount, beforeUnmount); + registerLifecycleHook(onUnmounted, unmounted); + registerLifecycleHook(onServerPrefetch, serverPrefetch); + if (isArray(expose)) { + if (expose.length) { + const exposed = instance.exposed || (instance.exposed = {}); + expose.forEach((key) => { + Object.defineProperty(exposed, key, { + get: () => publicThis[key], + set: (val) => publicThis[key] = val + }); + }); + } else if (!instance.exposed) { + instance.exposed = {}; + } + } + if (render2 && instance.render === NOOP) { + instance.render = render2; + } + if (inheritAttrs != null) { + instance.inheritAttrs = inheritAttrs; + } + if (components) instance.components = components; + if (directives) instance.directives = directives; +} +function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { + if (isArray(injectOptions)) { + injectOptions = normalizeInject(injectOptions); + } + for (const key in injectOptions) { + const opt = injectOptions[key]; + let injected; + if (isObject(opt)) { + if ("default" in opt) { + injected = inject( + opt.from || key, + opt.default, + true + ); + } else { + injected = inject(opt.from || key); + } + } else { + injected = inject(opt); + } + if (isRef2(injected)) { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => injected.value, + set: (v) => injected.value = v + }); + } else { + ctx[key] = injected; + } + if (true) { + checkDuplicateProperties("Inject", key); + } + } +} +function callHook(hook, instance, type) { + callWithAsyncErrorHandling( + isArray(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), + instance, + type + ); +} +function createWatcher(raw, ctx, publicThis, key) { + const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; + if (isString(raw)) { + const handler = ctx[raw]; + if (isFunction(handler)) { + watch(getter, handler); + } else if (true) { + warn$1(`Invalid watch handler specified by key "${raw}"`, handler); + } + } else if (isFunction(raw)) { + watch(getter, raw.bind(publicThis)); + } else if (isObject(raw)) { + if (isArray(raw)) { + raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); + } else { + const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; + if (isFunction(handler)) { + watch(getter, handler, raw); + } else if (true) { + warn$1(`Invalid watch handler specified by key "${raw.handler}"`, handler); + } + } + } else if (true) { + warn$1(`Invalid watch option: "${key}"`, raw); + } +} +function resolveMergedOptions(instance) { + const base = instance.type; + const { mixins, extends: extendsOptions } = base; + const { + mixins: globalMixins, + optionsCache: cache, + config: { optionMergeStrategies } + } = instance.appContext; + const cached = cache.get(base); + let resolved; + if (cached) { + resolved = cached; + } else if (!globalMixins.length && !mixins && !extendsOptions) { + { + resolved = base; + } + } else { + resolved = {}; + if (globalMixins.length) { + globalMixins.forEach( + (m) => mergeOptions(resolved, m, optionMergeStrategies, true) + ); + } + mergeOptions(resolved, base, optionMergeStrategies); + } + if (isObject(base)) { + cache.set(base, resolved); + } + return resolved; +} +function mergeOptions(to, from, strats, asMixin = false) { + const { mixins, extends: extendsOptions } = from; + if (extendsOptions) { + mergeOptions(to, extendsOptions, strats, true); + } + if (mixins) { + mixins.forEach( + (m) => mergeOptions(to, m, strats, true) + ); + } + for (const key in from) { + if (asMixin && key === "expose") { + warn$1( + `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.` + ); + } else { + const strat = internalOptionMergeStrats[key] || strats && strats[key]; + to[key] = strat ? strat(to[key], from[key]) : from[key]; + } + } + return to; +} +var internalOptionMergeStrats = { + data: mergeDataFn, + props: mergeEmitsOrPropsOptions, + emits: mergeEmitsOrPropsOptions, + // objects + methods: mergeObjectOptions, + computed: mergeObjectOptions, + // lifecycle + beforeCreate: mergeAsArray, + created: mergeAsArray, + beforeMount: mergeAsArray, + mounted: mergeAsArray, + beforeUpdate: mergeAsArray, + updated: mergeAsArray, + beforeDestroy: mergeAsArray, + beforeUnmount: mergeAsArray, + destroyed: mergeAsArray, + unmounted: mergeAsArray, + activated: mergeAsArray, + deactivated: mergeAsArray, + errorCaptured: mergeAsArray, + serverPrefetch: mergeAsArray, + // assets + components: mergeObjectOptions, + directives: mergeObjectOptions, + // watch + watch: mergeWatchOptions, + // provide / inject + provide: mergeDataFn, + inject: mergeInject +}; +function mergeDataFn(to, from) { + if (!from) { + return to; + } + if (!to) { + return from; + } + return function mergedDataFn() { + return extend( + isFunction(to) ? to.call(this, this) : to, + isFunction(from) ? from.call(this, this) : from + ); + }; +} +function mergeInject(to, from) { + return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); +} +function normalizeInject(raw) { + if (isArray(raw)) { + const res = {}; + for (let i = 0; i < raw.length; i++) { + res[raw[i]] = raw[i]; + } + return res; + } + return raw; +} +function mergeAsArray(to, from) { + return to ? [...new Set([].concat(to, from))] : from; +} +function mergeObjectOptions(to, from) { + return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from; +} +function mergeEmitsOrPropsOptions(to, from) { + if (to) { + if (isArray(to) && isArray(from)) { + return [.../* @__PURE__ */ new Set([...to, ...from])]; + } + return extend( + /* @__PURE__ */ Object.create(null), + normalizePropsOrEmits(to), + normalizePropsOrEmits(from != null ? from : {}) + ); + } else { + return from; + } +} +function mergeWatchOptions(to, from) { + if (!to) return from; + if (!from) return to; + const merged = extend(/* @__PURE__ */ Object.create(null), to); + for (const key in from) { + merged[key] = mergeAsArray(to[key], from[key]); + } + return merged; +} +function createAppContext() { + return { + app: null, + config: { + isNativeTag: NO, + performance: false, + globalProperties: {}, + optionMergeStrategies: {}, + errorHandler: void 0, + warnHandler: void 0, + compilerOptions: {} + }, + mixins: [], + components: {}, + directives: {}, + provides: /* @__PURE__ */ Object.create(null), + optionsCache: /* @__PURE__ */ new WeakMap(), + propsCache: /* @__PURE__ */ new WeakMap(), + emitsCache: /* @__PURE__ */ new WeakMap() + }; +} +var uid$1 = 0; +function createAppAPI(render2, hydrate2) { + return function createApp2(rootComponent, rootProps = null) { + if (!isFunction(rootComponent)) { + rootComponent = extend({}, rootComponent); + } + if (rootProps != null && !isObject(rootProps)) { + warn$1(`root props passed to app.mount() must be an object.`); + rootProps = null; + } + const context = createAppContext(); + const installedPlugins = /* @__PURE__ */ new WeakSet(); + let isMounted = false; + const app = context.app = { + _uid: uid$1++, + _component: rootComponent, + _props: rootProps, + _container: null, + _context: context, + _instance: null, + version, + get config() { + return context.config; + }, + set config(v) { + if (true) { + warn$1( + `app.config cannot be replaced. Modify individual options instead.` + ); + } + }, + use(plugin, ...options) { + if (installedPlugins.has(plugin)) { + warn$1(`Plugin has already been applied to target app.`); + } else if (plugin && isFunction(plugin.install)) { + installedPlugins.add(plugin); + plugin.install(app, ...options); + } else if (isFunction(plugin)) { + installedPlugins.add(plugin); + plugin(app, ...options); + } else if (true) { + warn$1( + `A plugin must either be a function or an object with an "install" function.` + ); + } + return app; + }, + mixin(mixin) { + if (__VUE_OPTIONS_API__) { + if (!context.mixins.includes(mixin)) { + context.mixins.push(mixin); + } else if (true) { + warn$1( + "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "") + ); + } + } else if (true) { + warn$1("Mixins are only available in builds supporting Options API"); + } + return app; + }, + component(name, component) { + if (true) { + validateComponentName(name, context.config); + } + if (!component) { + return context.components[name]; + } + if (context.components[name]) { + warn$1(`Component "${name}" has already been registered in target app.`); + } + context.components[name] = component; + return app; + }, + directive(name, directive) { + if (true) { + validateDirectiveName(name); + } + if (!directive) { + return context.directives[name]; + } + if (context.directives[name]) { + warn$1(`Directive "${name}" has already been registered in target app.`); + } + context.directives[name] = directive; + return app; + }, + mount(rootContainer, isHydrate, namespace) { + if (!isMounted) { + if (rootContainer.__vue_app__) { + warn$1( + `There is already an app instance mounted on the host container. + If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.` + ); + } + const vnode = createVNode(rootComponent, rootProps); + vnode.appContext = context; + if (namespace === true) { + namespace = "svg"; + } else if (namespace === false) { + namespace = void 0; + } + if (true) { + context.reload = () => { + render2( + cloneVNode(vnode), + rootContainer, + namespace + ); + }; + } + if (isHydrate && hydrate2) { + hydrate2(vnode, rootContainer); + } else { + render2(vnode, rootContainer, namespace); + } + isMounted = true; + app._container = rootContainer; + rootContainer.__vue_app__ = app; + if (true) { + app._instance = vnode.component; + devtoolsInitApp(app, version); + } + return getComponentPublicInstance(vnode.component); + } else if (true) { + warn$1( + `App has already been mounted. +If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\`` + ); + } + }, + unmount() { + if (isMounted) { + render2(null, app._container); + if (true) { + app._instance = null; + devtoolsUnmountApp(app); + } + delete app._container.__vue_app__; + } else if (true) { + warn$1(`Cannot unmount an app that is not mounted.`); + } + }, + provide(key, value) { + if (key in context.provides) { + warn$1( + `App already provides property with key "${String(key)}". It will be overwritten with the new value.` + ); + } + context.provides[key] = value; + return app; + }, + runWithContext(fn) { + const lastApp = currentApp; + currentApp = app; + try { + return fn(); + } finally { + currentApp = lastApp; + } + } + }; + return app; + }; +} +var currentApp = null; +function provide(key, value) { + if (!currentInstance) { + if (true) { + warn$1(`provide() can only be used inside setup().`); + } + } else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance || currentApp) { + const provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; + } else if (true) { + warn$1(`injection "${String(key)}" not found.`); + } + } else if (true) { + warn$1(`inject() can only be used inside setup() or functional components.`); + } +} +function hasInjectionContext() { + return !!(currentInstance || currentRenderingInstance || currentApp); +} +var internalObjectProto = {}; +var createInternalObject = () => Object.create(internalObjectProto); +var isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; +function initProps(instance, rawProps, isStateful, isSSR = false) { + const props = {}; + const attrs = createInternalObject(); + instance.propsDefaults = /* @__PURE__ */ Object.create(null); + setFullProps(instance, rawProps, props, attrs); + for (const key in instance.propsOptions[0]) { + if (!(key in props)) { + props[key] = void 0; + } + } + if (true) { + validateProps(rawProps || {}, props, instance); + } + if (isStateful) { + instance.props = isSSR ? props : shallowReactive(props); + } else { + if (!instance.type.props) { + instance.props = attrs; + } else { + instance.props = props; + } + } + instance.attrs = attrs; +} +function isInHmrContext(instance) { + while (instance) { + if (instance.type.__hmrId) return true; + instance = instance.parent; + } +} +function updateProps(instance, rawProps, rawPrevProps, optimized) { + const { + props, + attrs, + vnode: { patchFlag } + } = instance; + const rawCurrentProps = toRaw(props); + const [options] = instance.propsOptions; + let hasAttrsChanged = false; + if ( + // always force full diff in dev + // - #1942 if hmr is enabled with sfc component + // - vite#872 non-sfc component used by sfc component + !isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16) + ) { + if (patchFlag & 8) { + const propsToUpdate = instance.vnode.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + let key = propsToUpdate[i]; + if (isEmitListener(instance.emitsOptions, key)) { + continue; + } + const value = rawProps[key]; + if (options) { + if (hasOwn(attrs, key)) { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } else { + const camelizedKey = camelize(key); + props[camelizedKey] = resolvePropValue( + options, + rawCurrentProps, + camelizedKey, + value, + instance, + false + ); + } + } else { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + } else { + if (setFullProps(instance, rawProps, props, attrs)) { + hasAttrsChanged = true; + } + let kebabKey; + for (const key in rawCurrentProps) { + if (!rawProps || // for camelCase + !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case + // and converted to camelCase (#955) + ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { + if (options) { + if (rawPrevProps && // for camelCase + (rawPrevProps[key] !== void 0 || // for kebab-case + rawPrevProps[kebabKey] !== void 0)) { + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + void 0, + instance, + true + ); + } + } else { + delete props[key]; + } + } + } + if (attrs !== rawCurrentProps) { + for (const key in attrs) { + if (!rawProps || !hasOwn(rawProps, key) && true) { + delete attrs[key]; + hasAttrsChanged = true; + } + } + } + } + if (hasAttrsChanged) { + trigger(instance.attrs, "set", ""); + } + if (true) { + validateProps(rawProps || {}, props, instance); + } +} +function setFullProps(instance, rawProps, props, attrs) { + const [options, needCastKeys] = instance.propsOptions; + let hasAttrsChanged = false; + let rawCastValues; + if (rawProps) { + for (let key in rawProps) { + if (isReservedProp(key)) { + continue; + } + const value = rawProps[key]; + let camelKey; + if (options && hasOwn(options, camelKey = camelize(key))) { + if (!needCastKeys || !needCastKeys.includes(camelKey)) { + props[camelKey] = value; + } else { + (rawCastValues || (rawCastValues = {}))[camelKey] = value; + } + } else if (!isEmitListener(instance.emitsOptions, key)) { + if (!(key in attrs) || value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + if (needCastKeys) { + const rawCurrentProps = toRaw(props); + const castValues = rawCastValues || EMPTY_OBJ; + for (let i = 0; i < needCastKeys.length; i++) { + const key = needCastKeys[i]; + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + castValues[key], + instance, + !hasOwn(castValues, key) + ); + } + } + return hasAttrsChanged; +} +function resolvePropValue(options, props, key, value, instance, isAbsent) { + const opt = options[key]; + if (opt != null) { + const hasDefault = hasOwn(opt, "default"); + if (hasDefault && value === void 0) { + const defaultValue = opt.default; + if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) { + const { propsDefaults } = instance; + if (key in propsDefaults) { + value = propsDefaults[key]; + } else { + const reset = setCurrentInstance(instance); + value = propsDefaults[key] = defaultValue.call( + null, + props + ); + reset(); + } + } else { + value = defaultValue; + } + } + if (opt[ + 0 + /* shouldCast */ + ]) { + if (isAbsent && !hasDefault) { + value = false; + } else if (opt[ + 1 + /* shouldCastTrue */ + ] && (value === "" || value === hyphenate(key))) { + value = true; + } + } + } + return value; +} +var mixinPropsCache = /* @__PURE__ */ new WeakMap(); +function normalizePropsOptions(comp, appContext, asMixin = false) { + const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache; + const cached = cache.get(comp); + if (cached) { + return cached; + } + const raw = comp.props; + const normalized = {}; + const needCastKeys = []; + let hasExtends = false; + if (__VUE_OPTIONS_API__ && !isFunction(comp)) { + const extendProps = (raw2) => { + hasExtends = true; + const [props, keys] = normalizePropsOptions(raw2, appContext, true); + extend(normalized, props); + if (keys) needCastKeys.push(...keys); + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendProps); + } + if (comp.extends) { + extendProps(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendProps); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, EMPTY_ARR); + } + return EMPTY_ARR; + } + if (isArray(raw)) { + for (let i = 0; i < raw.length; i++) { + if (!isString(raw[i])) { + warn$1(`props must be strings when using array syntax.`, raw[i]); + } + const normalizedKey = camelize(raw[i]); + if (validatePropName(normalizedKey)) { + normalized[normalizedKey] = EMPTY_OBJ; + } + } + } else if (raw) { + if (!isObject(raw)) { + warn$1(`invalid props options`, raw); + } + for (const key in raw) { + const normalizedKey = camelize(key); + if (validatePropName(normalizedKey)) { + const opt = raw[key]; + const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt); + const propType = prop.type; + let shouldCast = false; + let shouldCastTrue = true; + if (isArray(propType)) { + for (let index = 0; index < propType.length; ++index) { + const type = propType[index]; + const typeName = isFunction(type) && type.name; + if (typeName === "Boolean") { + shouldCast = true; + break; + } else if (typeName === "String") { + shouldCastTrue = false; + } + } + } else { + shouldCast = isFunction(propType) && propType.name === "Boolean"; + } + prop[ + 0 + /* shouldCast */ + ] = shouldCast; + prop[ + 1 + /* shouldCastTrue */ + ] = shouldCastTrue; + if (shouldCast || hasOwn(prop, "default")) { + needCastKeys.push(normalizedKey); + } + } + } + } + const res = [normalized, needCastKeys]; + if (isObject(comp)) { + cache.set(comp, res); + } + return res; +} +function validatePropName(key) { + if (key[0] !== "$" && !isReservedProp(key)) { + return true; + } else if (true) { + warn$1(`Invalid prop name: "${key}" is a reserved property.`); + } + return false; +} +function getType(ctor) { + if (ctor === null) { + return "null"; + } + if (typeof ctor === "function") { + return ctor.name || ""; + } else if (typeof ctor === "object") { + const name = ctor.constructor && ctor.constructor.name; + return name || ""; + } + return ""; +} +function validateProps(rawProps, props, instance) { + const resolvedValues = toRaw(props); + const options = instance.propsOptions[0]; + for (const key in options) { + let opt = options[key]; + if (opt == null) continue; + validateProp( + key, + resolvedValues[key], + opt, + true ? shallowReadonly(resolvedValues) : resolvedValues, + !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key)) + ); + } +} +function validateProp(name, value, prop, props, isAbsent) { + const { type, required, validator, skipCheck } = prop; + if (required && isAbsent) { + warn$1('Missing required prop: "' + name + '"'); + return; + } + if (value == null && !required) { + return; + } + if (type != null && type !== true && !skipCheck) { + let isValid = false; + const types = isArray(type) ? type : [type]; + const expectedTypes = []; + for (let i = 0; i < types.length && !isValid; i++) { + const { valid, expectedType } = assertType(value, types[i]); + expectedTypes.push(expectedType || ""); + isValid = valid; + } + if (!isValid) { + warn$1(getInvalidTypeMessage(name, value, expectedTypes)); + return; + } + } + if (validator && !validator(value, props)) { + warn$1('Invalid prop: custom validator check failed for prop "' + name + '".'); + } +} +var isSimpleType = makeMap( + "String,Number,Boolean,Function,Symbol,BigInt" +); +function assertType(value, type) { + let valid; + const expectedType = getType(type); + if (isSimpleType(expectedType)) { + const t = typeof value; + valid = t === expectedType.toLowerCase(); + if (!valid && t === "object") { + valid = value instanceof type; + } + } else if (expectedType === "Object") { + valid = isObject(value); + } else if (expectedType === "Array") { + valid = isArray(value); + } else if (expectedType === "null") { + valid = value === null; + } else { + valid = value instanceof type; + } + return { + valid, + expectedType + }; +} +function getInvalidTypeMessage(name, value, expectedTypes) { + if (expectedTypes.length === 0) { + return `Prop type [] for prop "${name}" won't match anything. Did you mean to use type Array instead?`; + } + let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`; + const expectedType = expectedTypes[0]; + const receivedType = toRawType(value); + const expectedValue = styleValue(value, expectedType); + const receivedValue = styleValue(value, receivedType); + if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) { + message += ` with value ${expectedValue}`; + } + message += `, got ${receivedType} `; + if (isExplicable(receivedType)) { + message += `with value ${receivedValue}.`; + } + return message; +} +function styleValue(value, type) { + if (type === "String") { + return `"${value}"`; + } else if (type === "Number") { + return `${Number(value)}`; + } else { + return `${value}`; + } +} +function isExplicable(type) { + const explicitTypes = ["string", "number", "boolean"]; + return explicitTypes.some((elem) => type.toLowerCase() === elem); +} +function isBoolean(...args) { + return args.some((elem) => elem.toLowerCase() === "boolean"); +} +var isInternalKey = (key) => key[0] === "_" || key === "$stable"; +var normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; +var normalizeSlot = (key, rawSlot, ctx) => { + if (rawSlot._n) { + return rawSlot; + } + const normalized = withCtx((...args) => { + if (currentInstance && (!ctx || ctx.root === currentInstance.root)) { + warn$1( + `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.` + ); + } + return normalizeSlotValue(rawSlot(...args)); + }, ctx); + normalized._c = false; + return normalized; +}; +var normalizeObjectSlots = (rawSlots, slots, instance) => { + const ctx = rawSlots._ctx; + for (const key in rawSlots) { + if (isInternalKey(key)) continue; + const value = rawSlots[key]; + if (isFunction(value)) { + slots[key] = normalizeSlot(key, value, ctx); + } else if (value != null) { + if (true) { + warn$1( + `Non-function value encountered for slot "${key}". Prefer function slots for better performance.` + ); + } + const normalized = normalizeSlotValue(value); + slots[key] = () => normalized; + } + } +}; +var normalizeVNodeSlots = (instance, children) => { + if (!isKeepAlive(instance.vnode) && true) { + warn$1( + `Non-function value encountered for default slot. Prefer function slots for better performance.` + ); + } + const normalized = normalizeSlotValue(children); + instance.slots.default = () => normalized; +}; +var assignSlots = (slots, children, optimized) => { + for (const key in children) { + if (optimized || key !== "_") { + slots[key] = children[key]; + } + } +}; +var initSlots = (instance, children, optimized) => { + const slots = instance.slots = createInternalObject(); + if (instance.vnode.shapeFlag & 32) { + const type = children._; + if (type) { + assignSlots(slots, children, optimized); + if (optimized) { + def(slots, "_", type, true); + } + } else { + normalizeObjectSlots(children, slots); + } + } else if (children) { + normalizeVNodeSlots(instance, children); + } +}; +var updateSlots = (instance, children, optimized) => { + const { vnode, slots } = instance; + let needDeletionCheck = true; + let deletionComparisonTarget = EMPTY_OBJ; + if (vnode.shapeFlag & 32) { + const type = children._; + if (type) { + if (isHmrUpdating) { + assignSlots(slots, children, optimized); + trigger(instance, "set", "$slots"); + } else if (optimized && type === 1) { + needDeletionCheck = false; + } else { + assignSlots(slots, children, optimized); + } + } else { + needDeletionCheck = !children.$stable; + normalizeObjectSlots(children, slots); + } + deletionComparisonTarget = children; + } else if (children) { + normalizeVNodeSlots(instance, children); + deletionComparisonTarget = { default: 1 }; + } + if (needDeletionCheck) { + for (const key in slots) { + if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { + delete slots[key]; + } + } + } +}; +function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { + if (isArray(rawRef)) { + rawRef.forEach( + (r, i) => setRef( + r, + oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), + parentSuspense, + vnode, + isUnmount + ) + ); + return; + } + if (isAsyncWrapper(vnode) && !isUnmount) { + return; + } + const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; + const value = isUnmount ? null : refValue; + const { i: owner, r: ref2 } = rawRef; + if (!owner) { + warn$1( + `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.` + ); + return; + } + const oldRef = oldRawRef && oldRawRef.r; + const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; + const setupState = owner.setupState; + if (oldRef != null && oldRef !== ref2) { + if (isString(oldRef)) { + refs[oldRef] = null; + if (hasOwn(setupState, oldRef)) { + setupState[oldRef] = null; + } + } else if (isRef2(oldRef)) { + oldRef.value = null; + } + } + if (isFunction(ref2)) { + callWithErrorHandling(ref2, owner, 12, [value, refs]); + } else { + const _isString = isString(ref2); + const _isRef = isRef2(ref2); + if (_isString || _isRef) { + const doSet = () => { + if (rawRef.f) { + const existing = _isString ? hasOwn(setupState, ref2) ? setupState[ref2] : refs[ref2] : ref2.value; + if (isUnmount) { + isArray(existing) && remove(existing, refValue); + } else { + if (!isArray(existing)) { + if (_isString) { + refs[ref2] = [refValue]; + if (hasOwn(setupState, ref2)) { + setupState[ref2] = refs[ref2]; + } + } else { + ref2.value = [refValue]; + if (rawRef.k) refs[rawRef.k] = ref2.value; + } + } else if (!existing.includes(refValue)) { + existing.push(refValue); + } + } + } else if (_isString) { + refs[ref2] = value; + if (hasOwn(setupState, ref2)) { + setupState[ref2] = value; + } + } else if (_isRef) { + ref2.value = value; + if (rawRef.k) refs[rawRef.k] = value; + } else if (true) { + warn$1("Invalid template ref type:", ref2, `(${typeof ref2})`); + } + }; + if (value) { + doSet.id = -1; + queuePostRenderEffect(doSet, parentSuspense); + } else { + doSet(); + } + } else if (true) { + warn$1("Invalid template ref type:", ref2, `(${typeof ref2})`); + } + } +} +var TeleportEndKey = Symbol("_vte"); +var isTeleport = (type) => type.__isTeleport; +var isTeleportDisabled = (props) => props && (props.disabled || props.disabled === ""); +var isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement; +var isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement; +var resolveTarget = (props, select) => { + const targetSelector = props && props.to; + if (isString(targetSelector)) { + if (!select) { + warn$1( + `Current renderer does not support string target for Teleports. (missing querySelector renderer option)` + ); + return null; + } else { + const target = select(targetSelector); + if (!target && !isTeleportDisabled(props)) { + warn$1( + `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.` + ); + } + return target; + } + } else { + if (!targetSelector && !isTeleportDisabled(props)) { + warn$1(`Invalid Teleport target: ${targetSelector}`); + } + return targetSelector; + } +}; +var TeleportImpl = { + name: "Teleport", + __isTeleport: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) { + const { + mc: mountChildren, + pc: patchChildren, + pbc: patchBlockChildren, + o: { insert, querySelector, createText, createComment } + } = internals; + const disabled = isTeleportDisabled(n2.props); + let { shapeFlag, children, dynamicChildren } = n2; + if (isHmrUpdating) { + optimized = false; + dynamicChildren = null; + } + if (n1 == null) { + const placeholder = n2.el = true ? createComment("teleport start") : createText(""); + const mainAnchor = n2.anchor = true ? createComment("teleport end") : createText(""); + insert(placeholder, container, anchor); + insert(mainAnchor, container, anchor); + const target = n2.target = resolveTarget(n2.props, querySelector); + const targetAnchor = prepareAnchor(target, n2, createText, insert); + if (target) { + if (namespace === "svg" || isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace === "mathml" || isTargetMathML(target)) { + namespace = "mathml"; + } + } else if (!disabled) { + warn$1("Invalid Teleport target on mount:", target, `(${typeof target})`); + } + const mount = (container2, anchor2) => { + if (shapeFlag & 16) { + mountChildren( + children, + container2, + anchor2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + if (disabled) { + mount(container, mainAnchor); + } else if (target) { + mount(target, targetAnchor); + } + } else { + n2.el = n1.el; + n2.targetStart = n1.targetStart; + const mainAnchor = n2.anchor = n1.anchor; + const target = n2.target = n1.target; + const targetAnchor = n2.targetAnchor = n1.targetAnchor; + const wasDisabled = isTeleportDisabled(n1.props); + const currentContainer = wasDisabled ? container : target; + const currentAnchor = wasDisabled ? mainAnchor : targetAnchor; + if (namespace === "svg" || isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace === "mathml" || isTargetMathML(target)) { + namespace = "mathml"; + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + currentContainer, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + traverseStaticChildren(n1, n2, true); + } else if (!optimized) { + patchChildren( + n1, + n2, + currentContainer, + currentAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + false + ); + } + if (disabled) { + if (!wasDisabled) { + moveTeleport( + n2, + container, + mainAnchor, + internals, + 1 + ); + } else { + if (n2.props && n1.props && n2.props.to !== n1.props.to) { + n2.props.to = n1.props.to; + } + } + } else { + if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) { + const nextTarget = n2.target = resolveTarget( + n2.props, + querySelector + ); + if (nextTarget) { + moveTeleport( + n2, + nextTarget, + null, + internals, + 0 + ); + } else if (true) { + warn$1( + "Invalid Teleport target on update:", + target, + `(${typeof target})` + ); + } + } else if (wasDisabled) { + moveTeleport( + n2, + target, + targetAnchor, + internals, + 1 + ); + } + } + } + updateCssVars(n2); + }, + remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) { + const { + shapeFlag, + children, + anchor, + targetStart, + targetAnchor, + target, + props + } = vnode; + if (target) { + hostRemove(targetStart); + hostRemove(targetAnchor); + } + doRemove && hostRemove(anchor); + if (shapeFlag & 16) { + const shouldRemove = doRemove || !isTeleportDisabled(props); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + unmount( + child, + parentComponent, + parentSuspense, + shouldRemove, + !!child.dynamicChildren + ); + } + } + }, + move: moveTeleport, + hydrate: hydrateTeleport +}; +function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) { + if (moveType === 0) { + insert(vnode.targetAnchor, container, parentAnchor); + } + const { el, anchor, shapeFlag, children, props } = vnode; + const isReorder = moveType === 2; + if (isReorder) { + insert(el, container, parentAnchor); + } + if (!isReorder || isTeleportDisabled(props)) { + if (shapeFlag & 16) { + for (let i = 0; i < children.length; i++) { + move( + children[i], + container, + parentAnchor, + 2 + ); + } + } + } + if (isReorder) { + insert(anchor, container, parentAnchor); + } +} +function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { + o: { nextSibling, parentNode, querySelector, insert, createText } +}, hydrateChildren) { + const target = vnode.target = resolveTarget( + vnode.props, + querySelector + ); + if (target) { + const targetNode = target._lpa || target.firstChild; + if (vnode.shapeFlag & 16) { + if (isTeleportDisabled(vnode.props)) { + vnode.anchor = hydrateChildren( + nextSibling(node), + vnode, + parentNode(node), + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + vnode.targetStart = targetNode; + vnode.targetAnchor = targetNode && nextSibling(targetNode); + } else { + vnode.anchor = nextSibling(node); + let targetAnchor = targetNode; + while (targetAnchor) { + if (targetAnchor && targetAnchor.nodeType === 8) { + if (targetAnchor.data === "teleport start anchor") { + vnode.targetStart = targetAnchor; + } else if (targetAnchor.data === "teleport anchor") { + vnode.targetAnchor = targetAnchor; + target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor); + break; + } + } + targetAnchor = nextSibling(targetAnchor); + } + if (!vnode.targetAnchor) { + prepareAnchor(target, vnode, createText, insert); + } + hydrateChildren( + targetNode && nextSibling(targetNode), + vnode, + target, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } + updateCssVars(vnode); + } + return vnode.anchor && nextSibling(vnode.anchor); +} +var Teleport = TeleportImpl; +function updateCssVars(vnode) { + const ctx = vnode.ctx; + if (ctx && ctx.ut) { + let node = vnode.children[0].el; + while (node && node !== vnode.targetAnchor) { + if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid); + node = node.nextSibling; + } + ctx.ut(); + } +} +function prepareAnchor(target, vnode, createText, insert) { + const targetStart = vnode.targetStart = createText(""); + const targetAnchor = vnode.targetAnchor = createText(""); + targetStart[TeleportEndKey] = targetAnchor; + if (target) { + insert(targetStart, target); + insert(targetAnchor, target); + } + return targetAnchor; +} +var hasLoggedMismatchError = false; +var logMismatchError = () => { + if (hasLoggedMismatchError) { + return; + } + console.error("Hydration completed but contains mismatches."); + hasLoggedMismatchError = true; +}; +var isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject"; +var isMathMLContainer = (container) => container.namespaceURI.includes("MathML"); +var getContainerType = (container) => { + if (isSVGContainer(container)) return "svg"; + if (isMathMLContainer(container)) return "mathml"; + return void 0; +}; +var isComment = (node) => node.nodeType === 8; +function createHydrationFunctions(rendererInternals) { + const { + mt: mountComponent, + p: patch, + o: { + patchProp: patchProp2, + createText, + nextSibling, + parentNode, + remove: remove2, + insert, + createComment + } + } = rendererInternals; + const hydrate2 = (vnode, container) => { + if (!container.hasChildNodes()) { + warn$1( + `Attempting to hydrate existing markup but container is empty. Performing full mount instead.` + ); + patch(null, vnode, container); + flushPostFlushCbs(); + container._vnode = vnode; + return; + } + hydrateNode(container.firstChild, vnode, null, null, null); + flushPostFlushCbs(); + container._vnode = vnode; + }; + const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => { + optimized = optimized || !!vnode.dynamicChildren; + const isFragmentStart = isComment(node) && node.data === "["; + const onMismatch = () => handleMismatch( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + isFragmentStart + ); + const { type, ref: ref2, shapeFlag, patchFlag } = vnode; + let domType = node.nodeType; + vnode.el = node; + if (true) { + def(node, "__vnode", vnode, true); + def(node, "__vueParentComponent", parentComponent, true); + } + if (patchFlag === -2) { + optimized = false; + vnode.dynamicChildren = null; + } + let nextNode = null; + switch (type) { + case Text: + if (domType !== 3) { + if (vnode.children === "") { + insert(vnode.el = createText(""), parentNode(node), node); + nextNode = node; + } else { + nextNode = onMismatch(); + } + } else { + if (node.data !== vnode.children) { + warn$1( + `Hydration text mismatch in`, + node.parentNode, + ` + - rendered on server: ${JSON.stringify( + node.data + )} + - expected on client: ${JSON.stringify(vnode.children)}` + ); + logMismatchError(); + node.data = vnode.children; + } + nextNode = nextSibling(node); + } + break; + case Comment: + if (isTemplateNode(node)) { + nextNode = nextSibling(node); + replaceNode( + vnode.el = node.content.firstChild, + node, + parentComponent + ); + } else if (domType !== 8 || isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = nextSibling(node); + } + break; + case Static: + if (isFragmentStart) { + node = nextSibling(node); + domType = node.nodeType; + } + if (domType === 1 || domType === 3) { + nextNode = node; + const needToAdoptContent = !vnode.children.length; + for (let i = 0; i < vnode.staticCount; i++) { + if (needToAdoptContent) + vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data; + if (i === vnode.staticCount - 1) { + vnode.anchor = nextNode; + } + nextNode = nextSibling(nextNode); + } + return isFragmentStart ? nextSibling(nextNode) : nextNode; + } else { + onMismatch(); + } + break; + case Fragment: + if (!isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = hydrateFragment( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + break; + default: + if (shapeFlag & 1) { + if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) { + nextNode = onMismatch(); + } else { + nextNode = hydrateElement( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } else if (shapeFlag & 6) { + vnode.slotScopeIds = slotScopeIds; + const container = parentNode(node); + if (isFragmentStart) { + nextNode = locateClosingAnchor(node); + } else if (isComment(node) && node.data === "teleport start") { + nextNode = locateClosingAnchor(node, node.data, "teleport end"); + } else { + nextNode = nextSibling(node); + } + mountComponent( + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + optimized + ); + if (isAsyncWrapper(vnode)) { + let subTree; + if (isFragmentStart) { + subTree = createVNode(Fragment); + subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild; + } else { + subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div"); + } + subTree.el = node; + vnode.component.subTree = subTree; + } + } else if (shapeFlag & 64) { + if (domType !== 8) { + nextNode = onMismatch(); + } else { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized, + rendererInternals, + hydrateChildren + ); + } + } else if (shapeFlag & 128) { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + getContainerType(parentNode(node)), + slotScopeIds, + optimized, + rendererInternals, + hydrateNode + ); + } else if (true) { + warn$1("Invalid HostVNode type:", type, `(${typeof type})`); + } + } + if (ref2 != null) { + setRef(ref2, null, parentSuspense, vnode); + } + return nextNode; + }; + const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!vnode.dynamicChildren; + const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode; + const forcePatch = type === "input" || type === "option"; + if (true) { + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + let needCallTransitionHooks = false; + if (isTemplateNode(el)) { + needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear; + const content = el.content.firstChild; + if (needCallTransitionHooks) { + transition.beforeEnter(content); + } + replaceNode(content, el, parentComponent); + vnode.el = el = content; + } + if (shapeFlag & 16 && // skip if element has innerHTML / textContent + !(props && (props.innerHTML || props.textContent))) { + let next = hydrateChildren( + el.firstChild, + vnode, + el, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + let hasWarned2 = false; + while (next) { + if (!hasWarned2) { + warn$1( + `Hydration children mismatch on`, + el, + ` +Server rendered element contains more child nodes than client vdom.` + ); + hasWarned2 = true; + } + logMismatchError(); + const cur = next; + next = next.nextSibling; + remove2(cur); + } + } else if (shapeFlag & 8) { + if (el.textContent !== vnode.children) { + warn$1( + `Hydration text content mismatch on`, + el, + ` + - rendered on server: ${el.textContent} + - expected on client: ${vnode.children}` + ); + logMismatchError(); + el.textContent = vnode.children; + } + } + if (props) { + if (true) { + const isCustomElement = el.tagName.includes("-"); + for (const key in props) { + if (// #11189 skip if this node has directives that have created hooks + // as it could have mutated the DOM in any possible way + !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) { + logMismatchError(); + } + if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers + key[0] === "." || isCustomElement) { + patchProp2(el, key, null, props[key], void 0, parentComponent); + } + } + } else if (props.onClick) { + patchProp2( + el, + "onClick", + null, + props.onClick, + void 0, + parentComponent + ); + } else if (patchFlag & 4 && isReactive(props.style)) { + for (const key in props.style) props.style[key]; + } + } + let vnodeHooks; + if (vnodeHooks = props && props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHooks, parentComponent, vnode); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) { + queueEffectWithSuspense(() => { + vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + } + return el.nextSibling; + }; + const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!parentVNode.dynamicChildren; + const children = parentVNode.children; + const l = children.length; + let hasWarned2 = false; + for (let i = 0; i < l; i++) { + const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]); + const isText = vnode.type === Text; + if (node) { + if (isText && !optimized) { + let next = children[i + 1]; + if (next && (next = normalizeVNode(next)).type === Text) { + insert( + createText( + node.data.slice(vnode.children.length) + ), + container, + nextSibling(node) + ); + node.data = vnode.children; + } + } + node = hydrateNode( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } else if (isText && !vnode.children) { + insert(vnode.el = createText(""), container); + } else { + if (!hasWarned2) { + warn$1( + `Hydration children mismatch on`, + container, + ` +Server rendered element contains fewer child nodes than client vdom.` + ); + hasWarned2 = true; + } + logMismatchError(); + patch( + null, + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + } + } + return node; + }; + const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + const { slotScopeIds: fragmentSlotScopeIds } = vnode; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + const container = parentNode(node); + const next = hydrateChildren( + nextSibling(node), + vnode, + container, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + if (next && isComment(next) && next.data === "]") { + return nextSibling(vnode.anchor = next); + } else { + logMismatchError(); + insert(vnode.anchor = createComment(`]`), container, next); + return next; + } + }; + const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => { + warn$1( + `Hydration node mismatch: +- rendered on server:`, + node, + node.nodeType === 3 ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``, + ` +- expected on client:`, + vnode.type + ); + logMismatchError(); + vnode.el = null; + if (isFragment) { + const end = locateClosingAnchor(node); + while (true) { + const next2 = nextSibling(node); + if (next2 && next2 !== end) { + remove2(next2); + } else { + break; + } + } + } + const next = nextSibling(node); + const container = parentNode(node); + remove2(node); + patch( + null, + vnode, + container, + next, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + return next; + }; + const locateClosingAnchor = (node, open = "[", close = "]") => { + let match = 0; + while (node) { + node = nextSibling(node); + if (node && isComment(node)) { + if (node.data === open) match++; + if (node.data === close) { + if (match === 0) { + return nextSibling(node); + } else { + match--; + } + } + } + } + return node; + }; + const replaceNode = (newNode, oldNode, parentComponent) => { + const parentNode2 = oldNode.parentNode; + if (parentNode2) { + parentNode2.replaceChild(newNode, oldNode); + } + let parent = parentComponent; + while (parent) { + if (parent.vnode.el === oldNode) { + parent.vnode.el = parent.subTree.el = newNode; + } + parent = parent.parent; + } + }; + const isTemplateNode = (node) => { + return node.nodeType === 1 && node.tagName.toLowerCase() === "template"; + }; + return [hydrate2, hydrateNode]; +} +function propHasMismatch(el, key, clientValue, vnode, instance) { + let mismatchType; + let mismatchKey; + let actual; + let expected; + if (key === "class") { + actual = el.getAttribute("class"); + expected = normalizeClass(clientValue); + if (!isSetEqual(toClassSet(actual || ""), toClassSet(expected))) { + mismatchType = mismatchKey = `class`; + } + } else if (key === "style") { + actual = el.getAttribute("style") || ""; + expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue)); + const actualMap = toStyleMap(actual); + const expectedMap = toStyleMap(expected); + if (vnode.dirs) { + for (const { dir, value } of vnode.dirs) { + if (dir.name === "show" && !value) { + expectedMap.set("display", "none"); + } + } + } + if (instance) { + resolveCssVars(instance, vnode, expectedMap); + } + if (!isMapEqual(actualMap, expectedMap)) { + mismatchType = mismatchKey = "style"; + } + } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) { + if (isBooleanAttr(key)) { + actual = el.hasAttribute(key); + expected = includeBooleanAttr(clientValue); + } else if (clientValue == null) { + actual = el.hasAttribute(key); + expected = false; + } else { + if (el.hasAttribute(key)) { + actual = el.getAttribute(key); + } else if (key === "value" && el.tagName === "TEXTAREA") { + actual = el.value; + } else { + actual = false; + } + expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false; + } + if (actual !== expected) { + mismatchType = `attribute`; + mismatchKey = key; + } + } + if (mismatchType) { + const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}="${v}"`; + const preSegment = `Hydration ${mismatchType} mismatch on`; + const postSegment = ` + - rendered on server: ${format(actual)} + - expected on client: ${format(expected)} + Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead. + You should fix the source of the mismatch.`; + { + warn$1(preSegment, el, postSegment); + } + return true; + } + return false; +} +function toClassSet(str) { + return new Set(str.trim().split(/\s+/)); +} +function isSetEqual(a, b) { + if (a.size !== b.size) { + return false; + } + for (const s of a) { + if (!b.has(s)) { + return false; + } + } + return true; +} +function toStyleMap(str) { + const styleMap = /* @__PURE__ */ new Map(); + for (const item of str.split(";")) { + let [key, value] = item.split(":"); + key = key.trim(); + value = value && value.trim(); + if (key && value) { + styleMap.set(key, value); + } + } + return styleMap; +} +function isMapEqual(a, b) { + if (a.size !== b.size) { + return false; + } + for (const [key, value] of a) { + if (value !== b.get(key)) { + return false; + } + } + return true; +} +function resolveCssVars(instance, vnode, expectedMap) { + const root = instance.subTree; + if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) { + const cssVars = instance.getCssVars(); + for (const key in cssVars) { + expectedMap.set(`--${key}`, String(cssVars[key])); + } + } + if (vnode === root && instance.parent) { + resolveCssVars(instance.parent, instance.vnode, expectedMap); + } +} +var supported; +var perf; +function startMeasure(instance, type) { + if (instance.appContext.config.performance && isSupported()) { + perf.mark(`vue-${type}-${instance.uid}`); + } + if (true) { + devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now()); + } +} +function endMeasure(instance, type) { + if (instance.appContext.config.performance && isSupported()) { + const startTag = `vue-${type}-${instance.uid}`; + const endTag = startTag + `:end`; + perf.mark(endTag); + perf.measure( + `<${formatComponentName(instance, instance.type)}> ${type}`, + startTag, + endTag + ); + perf.clearMarks(startTag); + perf.clearMarks(endTag); + } + if (true) { + devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now()); + } +} +function isSupported() { + if (supported !== void 0) { + return supported; + } + if (typeof window !== "undefined" && window.performance) { + supported = true; + perf = window.performance; + } else { + supported = false; + } + return supported; +} +function initFeatureFlags() { + const needWarn = []; + if (typeof __VUE_OPTIONS_API__ !== "boolean") { + needWarn.push(`__VUE_OPTIONS_API__`); + getGlobalThis().__VUE_OPTIONS_API__ = true; + } + if (typeof __VUE_PROD_DEVTOOLS__ !== "boolean") { + needWarn.push(`__VUE_PROD_DEVTOOLS__`); + getGlobalThis().__VUE_PROD_DEVTOOLS__ = false; + } + if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== "boolean") { + needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`); + getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false; + } + if (needWarn.length) { + const multi = needWarn.length > 1; + console.warn( + `Feature flag${multi ? `s` : ``} ${needWarn.join(", ")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle. + +For more details, see https://link.vuejs.org/feature-flags.` + ); + } +} +var queuePostRenderEffect = queueEffectWithSuspense; +function createRenderer(options) { + return baseCreateRenderer(options); +} +function createHydrationRenderer(options) { + return baseCreateRenderer(options, createHydrationFunctions); +} +function baseCreateRenderer(options, createHydrationFns) { + { + initFeatureFlags(); + } + const target = getGlobalThis(); + target.__VUE__ = true; + if (true) { + setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target); + } + const { + insert: hostInsert, + remove: hostRemove, + patchProp: hostPatchProp, + createElement: hostCreateElement, + createText: hostCreateText, + createComment: hostCreateComment, + setText: hostSetText, + setElementText: hostSetElementText, + parentNode: hostParentNode, + nextSibling: hostNextSibling, + setScopeId: hostSetScopeId = NOOP, + insertStaticContent: hostInsertStaticContent + } = options; + const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = isHmrUpdating ? false : !!n2.dynamicChildren) => { + if (n1 === n2) { + return; + } + if (n1 && !isSameVNodeType(n1, n2)) { + anchor = getNextHostNode(n1); + unmount(n1, parentComponent, parentSuspense, true); + n1 = null; + } + if (n2.patchFlag === -2) { + optimized = false; + n2.dynamicChildren = null; + } + const { type, ref: ref2, shapeFlag } = n2; + switch (type) { + case Text: + processText(n1, n2, container, anchor); + break; + case Comment: + processCommentNode(n1, n2, container, anchor); + break; + case Static: + if (n1 == null) { + mountStaticNode(n2, container, anchor, namespace); + } else if (true) { + patchStaticNode(n1, n2, container, namespace); + } + break; + case Fragment: + processFragment( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + break; + default: + if (shapeFlag & 1) { + processElement( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 6) { + processComponent( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 64) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else if (shapeFlag & 128) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else if (true) { + warn$1("Invalid VNode type:", type, `(${typeof type})`); + } + } + if (ref2 != null && parentComponent) { + setRef(ref2, n1 && n1.ref, parentSuspense, n2 || n1, !n2); + } + }; + const processText = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateText(n2.children), + container, + anchor + ); + } else { + const el = n2.el = n1.el; + if (n2.children !== n1.children) { + hostSetText(el, n2.children); + } + } + }; + const processCommentNode = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateComment(n2.children || ""), + container, + anchor + ); + } else { + n2.el = n1.el; + } + }; + const mountStaticNode = (n2, container, anchor, namespace) => { + [n2.el, n2.anchor] = hostInsertStaticContent( + n2.children, + container, + anchor, + namespace, + n2.el, + n2.anchor + ); + }; + const patchStaticNode = (n1, n2, container, namespace) => { + if (n2.children !== n1.children) { + const anchor = hostNextSibling(n1.anchor); + removeStaticNode(n1); + [n2.el, n2.anchor] = hostInsertStaticContent( + n2.children, + container, + anchor, + namespace + ); + } else { + n2.el = n1.el; + n2.anchor = n1.anchor; + } + }; + const moveStaticNode = ({ el, anchor }, container, nextSibling) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostInsert(el, container, nextSibling); + el = next; + } + hostInsert(anchor, container, nextSibling); + }; + const removeStaticNode = ({ el, anchor }) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostRemove(el); + el = next; + } + hostRemove(anchor); + }; + const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + if (n2.type === "svg") { + namespace = "svg"; + } else if (n2.type === "math") { + namespace = "mathml"; + } + if (n1 == null) { + mountElement( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + patchElement( + n1, + n2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + let el; + let vnodeHook; + const { props, shapeFlag, transition, dirs } = vnode; + el = vnode.el = hostCreateElement( + vnode.type, + namespace, + props && props.is, + props + ); + if (shapeFlag & 8) { + hostSetElementText(el, vnode.children); + } else if (shapeFlag & 16) { + mountChildren( + vnode.children, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(vnode, namespace), + slotScopeIds, + optimized + ); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); + if (props) { + for (const key in props) { + if (key !== "value" && !isReservedProp(key)) { + hostPatchProp(el, key, null, props[key], namespace, parentComponent); + } + } + if ("value" in props) { + hostPatchProp(el, "value", null, props.value, namespace); + } + if (vnodeHook = props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHook, parentComponent, vnode); + } + } + if (true) { + def(el, "__vnode", vnode, true); + def(el, "__vueParentComponent", parentComponent, true); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + const needCallTransitionHooks = needTransition(parentSuspense, transition); + if (needCallTransitionHooks) { + transition.beforeEnter(el); + } + hostInsert(el, container, anchor); + if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + }; + const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { + if (scopeId) { + hostSetScopeId(el, scopeId); + } + if (slotScopeIds) { + for (let i = 0; i < slotScopeIds.length; i++) { + hostSetScopeId(el, slotScopeIds[i]); + } + } + if (parentComponent) { + let subTree = parentComponent.subTree; + if (subTree.patchFlag > 0 && subTree.patchFlag & 2048) { + subTree = filterSingleRoot(subTree.children) || subTree; + } + if (vnode === subTree) { + const parentVNode = parentComponent.vnode; + setScopeId( + el, + parentVNode, + parentVNode.scopeId, + parentVNode.slotScopeIds, + parentComponent.parent + ); + } + } + }; + const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { + for (let i = start; i < children.length; i++) { + const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); + patch( + null, + child, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const el = n2.el = n1.el; + if (true) { + el.__vnode = n2; + } + let { patchFlag, dynamicChildren, dirs } = n2; + patchFlag |= n1.patchFlag & 16; + const oldProps = n1.props || EMPTY_OBJ; + const newProps = n2.props || EMPTY_OBJ; + let vnodeHook; + parentComponent && toggleRecurse(parentComponent, false); + if (vnodeHook = newProps.onVnodeBeforeUpdate) { + invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + } + if (dirs) { + invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); + } + parentComponent && toggleRecurse(parentComponent, true); + if (isHmrUpdating) { + patchFlag = 0; + optimized = false; + dynamicChildren = null; + } + if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { + hostSetElementText(el, ""); + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + el, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds + ); + if (true) { + traverseStaticChildren(n1, n2); + } + } else if (!optimized) { + patchChildren( + n1, + n2, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds, + false + ); + } + if (patchFlag > 0) { + if (patchFlag & 16) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } else { + if (patchFlag & 2) { + if (oldProps.class !== newProps.class) { + hostPatchProp(el, "class", null, newProps.class, namespace); + } + } + if (patchFlag & 4) { + hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); + } + if (patchFlag & 8) { + const propsToUpdate = n2.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + const key = propsToUpdate[i]; + const prev = oldProps[key]; + const next = newProps[key]; + if (next !== prev || key === "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + } + } + if (patchFlag & 1) { + if (n1.children !== n2.children) { + hostSetElementText(el, n2.children); + } + } + } else if (!optimized && dynamicChildren == null) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } + if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); + }, parentSuspense); + } + }; + const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { + for (let i = 0; i < newChildren.length; i++) { + const oldVNode = oldChildren[i]; + const newVNode = newChildren[i]; + const container = ( + // oldVNode may be an errored async setup() component inside Suspense + // which will not have a mounted element + oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. + (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement + // which also requires the correct parent container + !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. + oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : ( + // In other cases, the parent container is not actually used so we + // just pass the block element here to avoid a DOM parentNode call. + fallbackContainer + ) + ); + patch( + oldVNode, + newVNode, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + true + ); + } + }; + const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { + if (oldProps !== newProps) { + if (oldProps !== EMPTY_OBJ) { + for (const key in oldProps) { + if (!isReservedProp(key) && !(key in newProps)) { + hostPatchProp( + el, + key, + oldProps[key], + null, + namespace, + parentComponent + ); + } + } + } + for (const key in newProps) { + if (isReservedProp(key)) continue; + const next = newProps[key]; + const prev = oldProps[key]; + if (next !== prev && key !== "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + if ("value" in newProps) { + hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); + } + } + }; + const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); + const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); + let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; + if ( + // #5523 dev root fragment may inherit directives + isHmrUpdating || patchFlag & 2048 + ) { + patchFlag = 0; + optimized = false; + dynamicChildren = null; + } + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + if (n1 == null) { + hostInsert(fragmentStartAnchor, container, anchor); + hostInsert(fragmentEndAnchor, container, anchor); + mountChildren( + // #10007 + // such fragment like `<></>` will be compiled into + // a fragment which doesn't have a children. + // In this case fallback to an empty array + n2.children || [], + container, + fragmentEndAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result + // of renderSlot() with no valid children + n1.dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + container, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + if (true) { + traverseStaticChildren(n1, n2); + } else if ( + // #2080 if the stable fragment has a key, it's a <template v-for> that may + // get moved around. Make sure all root level vnodes inherit el. + // #2134 or if it's a component root, it may also get moved around + // as the component is being moved. + n2.key != null || parentComponent && n2 === parentComponent.subTree + ) { + traverseStaticChildren( + n1, + n2, + true + /* shallow */ + ); + } + } else { + patchChildren( + n1, + n2, + container, + fragmentEndAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + } + }; + const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + n2.slotScopeIds = slotScopeIds; + if (n1 == null) { + if (n2.shapeFlag & 512) { + parentComponent.ctx.activate( + n2, + container, + anchor, + namespace, + optimized + ); + } else { + mountComponent( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + optimized + ); + } + } else { + updateComponent(n1, n2, optimized); + } + }; + const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => { + const instance = initialVNode.component = createComponentInstance( + initialVNode, + parentComponent, + parentSuspense + ); + if (instance.type.__hmrId) { + registerHMR(instance); + } + if (true) { + pushWarningContext(initialVNode); + startMeasure(instance, `mount`); + } + if (isKeepAlive(initialVNode)) { + instance.ctx.renderer = internals; + } + { + if (true) { + startMeasure(instance, `init`); + } + setupComponent(instance, false, optimized); + if (true) { + endMeasure(instance, `init`); + } + } + if (instance.asyncDep) { + parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized); + if (!initialVNode.el) { + const placeholder = instance.subTree = createVNode(Comment); + processCommentNode(null, placeholder, container, anchor); + } + } else { + setupRenderEffect( + instance, + initialVNode, + container, + anchor, + parentSuspense, + namespace, + optimized + ); + } + if (true) { + popWarningContext(); + endMeasure(instance, `mount`); + } + }; + const updateComponent = (n1, n2, optimized) => { + const instance = n2.component = n1.component; + if (shouldUpdateComponent(n1, n2, optimized)) { + if (instance.asyncDep && !instance.asyncResolved) { + if (true) { + pushWarningContext(n2); + } + updateComponentPreRender(instance, n2, optimized); + if (true) { + popWarningContext(); + } + return; + } else { + instance.next = n2; + invalidateJob(instance.update); + instance.effect.dirty = true; + instance.update(); + } + } else { + n2.el = n1.el; + instance.vnode = n2; + } + }; + const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => { + const componentUpdateFn = () => { + if (!instance.isMounted) { + let vnodeHook; + const { el, props } = initialVNode; + const { bm, m, parent } = instance; + const isAsyncWrapperVNode = isAsyncWrapper(initialVNode); + toggleRecurse(instance, false); + if (bm) { + invokeArrayFns(bm); + } + if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) { + invokeVNodeHook(vnodeHook, parent, initialVNode); + } + toggleRecurse(instance, true); + if (el && hydrateNode) { + const hydrateSubTree = () => { + if (true) { + startMeasure(instance, `render`); + } + instance.subTree = renderComponentRoot(instance); + if (true) { + endMeasure(instance, `render`); + } + if (true) { + startMeasure(instance, `hydrate`); + } + hydrateNode( + el, + instance.subTree, + instance, + parentSuspense, + null + ); + if (true) { + endMeasure(instance, `hydrate`); + } + }; + if (isAsyncWrapperVNode) { + initialVNode.type.__asyncLoader().then( + // note: we are moving the render call into an async callback, + // which means it won't track dependencies - but it's ok because + // a server-rendered async wrapper is already in resolved state + // and it will never need to change. + () => !instance.isUnmounted && hydrateSubTree() + ); + } else { + hydrateSubTree(); + } + } else { + if (true) { + startMeasure(instance, `render`); + } + const subTree = instance.subTree = renderComponentRoot(instance); + if (true) { + endMeasure(instance, `render`); + } + if (true) { + startMeasure(instance, `patch`); + } + patch( + null, + subTree, + container, + anchor, + instance, + parentSuspense, + namespace + ); + if (true) { + endMeasure(instance, `patch`); + } + initialVNode.el = subTree.el; + } + if (m) { + queuePostRenderEffect(m, parentSuspense); + } + if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) { + const scopedInitialVNode = initialVNode; + queuePostRenderEffect( + () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), + parentSuspense + ); + } + if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) { + instance.a && queuePostRenderEffect(instance.a, parentSuspense); + } + instance.isMounted = true; + if (true) { + devtoolsComponentAdded(instance); + } + initialVNode = container = anchor = null; + } else { + let { next, bu, u, parent, vnode } = instance; + { + const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance); + if (nonHydratedAsyncRoot) { + if (next) { + next.el = vnode.el; + updateComponentPreRender(instance, next, optimized); + } + nonHydratedAsyncRoot.asyncDep.then(() => { + if (!instance.isUnmounted) { + componentUpdateFn(); + } + }); + return; + } + } + let originNext = next; + let vnodeHook; + if (true) { + pushWarningContext(next || instance.vnode); + } + toggleRecurse(instance, false); + if (next) { + next.el = vnode.el; + updateComponentPreRender(instance, next, optimized); + } else { + next = vnode; + } + if (bu) { + invokeArrayFns(bu); + } + if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) { + invokeVNodeHook(vnodeHook, parent, next, vnode); + } + toggleRecurse(instance, true); + if (true) { + startMeasure(instance, `render`); + } + const nextTree = renderComponentRoot(instance); + if (true) { + endMeasure(instance, `render`); + } + const prevTree = instance.subTree; + instance.subTree = nextTree; + if (true) { + startMeasure(instance, `patch`); + } + patch( + prevTree, + nextTree, + // parent may have changed if it's in a teleport + hostParentNode(prevTree.el), + // anchor may have changed if it's in a fragment + getNextHostNode(prevTree), + instance, + parentSuspense, + namespace + ); + if (true) { + endMeasure(instance, `patch`); + } + next.el = nextTree.el; + if (originNext === null) { + updateHOCHostEl(instance, nextTree.el); + } + if (u) { + queuePostRenderEffect(u, parentSuspense); + } + if (vnodeHook = next.props && next.props.onVnodeUpdated) { + queuePostRenderEffect( + () => invokeVNodeHook(vnodeHook, parent, next, vnode), + parentSuspense + ); + } + if (true) { + devtoolsComponentUpdated(instance); + } + if (true) { + popWarningContext(); + } + } + }; + const effect2 = instance.effect = new ReactiveEffect( + componentUpdateFn, + NOOP, + () => queueJob(update), + instance.scope + // track it in component's effect scope + ); + const update = instance.update = () => { + if (effect2.dirty) { + effect2.run(); + } + }; + update.i = instance; + update.id = instance.uid; + toggleRecurse(instance, true); + if (true) { + effect2.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0; + effect2.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0; + } + update(); + }; + const updateComponentPreRender = (instance, nextVNode, optimized) => { + nextVNode.component = instance; + const prevProps = instance.vnode.props; + instance.vnode = nextVNode; + instance.next = null; + updateProps(instance, nextVNode.props, prevProps, optimized); + updateSlots(instance, nextVNode.children, optimized); + pauseTracking(); + flushPreFlushCbs(instance); + resetTracking(); + }; + const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => { + const c1 = n1 && n1.children; + const prevShapeFlag = n1 ? n1.shapeFlag : 0; + const c2 = n2.children; + const { patchFlag, shapeFlag } = n2; + if (patchFlag > 0) { + if (patchFlag & 128) { + patchKeyedChildren( + c1, + c2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + return; + } else if (patchFlag & 256) { + patchUnkeyedChildren( + c1, + c2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + return; + } + } + if (shapeFlag & 8) { + if (prevShapeFlag & 16) { + unmountChildren(c1, parentComponent, parentSuspense); + } + if (c2 !== c1) { + hostSetElementText(container, c2); + } + } else { + if (prevShapeFlag & 16) { + if (shapeFlag & 16) { + patchKeyedChildren( + c1, + c2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + unmountChildren(c1, parentComponent, parentSuspense, true); + } + } else { + if (prevShapeFlag & 8) { + hostSetElementText(container, ""); + } + if (shapeFlag & 16) { + mountChildren( + c2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + } + } + }; + const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + c1 = c1 || EMPTY_ARR; + c2 = c2 || EMPTY_ARR; + const oldLength = c1.length; + const newLength = c2.length; + const commonLength = Math.min(oldLength, newLength); + let i; + for (i = 0; i < commonLength; i++) { + const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); + patch( + c1[i], + nextChild, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + if (oldLength > newLength) { + unmountChildren( + c1, + parentComponent, + parentSuspense, + true, + false, + commonLength + ); + } else { + mountChildren( + c2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + commonLength + ); + } + }; + const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + let i = 0; + const l2 = c2.length; + let e1 = c1.length - 1; + let e2 = l2 - 1; + while (i <= e1 && i <= e2) { + const n1 = c1[i]; + const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); + if (isSameVNodeType(n1, n2)) { + patch( + n1, + n2, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + break; + } + i++; + } + while (i <= e1 && i <= e2) { + const n1 = c1[e1]; + const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]); + if (isSameVNodeType(n1, n2)) { + patch( + n1, + n2, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + break; + } + e1--; + e2--; + } + if (i > e1) { + if (i <= e2) { + const nextPos = e2 + 1; + const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor; + while (i <= e2) { + patch( + null, + c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + i++; + } + } + } else if (i > e2) { + while (i <= e1) { + unmount(c1[i], parentComponent, parentSuspense, true); + i++; + } + } else { + const s1 = i; + const s2 = i; + const keyToNewIndexMap = /* @__PURE__ */ new Map(); + for (i = s2; i <= e2; i++) { + const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); + if (nextChild.key != null) { + if (keyToNewIndexMap.has(nextChild.key)) { + warn$1( + `Duplicate keys found during update:`, + JSON.stringify(nextChild.key), + `Make sure keys are unique.` + ); + } + keyToNewIndexMap.set(nextChild.key, i); + } + } + let j; + let patched = 0; + const toBePatched = e2 - s2 + 1; + let moved = false; + let maxNewIndexSoFar = 0; + const newIndexToOldIndexMap = new Array(toBePatched); + for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0; + for (i = s1; i <= e1; i++) { + const prevChild = c1[i]; + if (patched >= toBePatched) { + unmount(prevChild, parentComponent, parentSuspense, true); + continue; + } + let newIndex; + if (prevChild.key != null) { + newIndex = keyToNewIndexMap.get(prevChild.key); + } else { + for (j = s2; j <= e2; j++) { + if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) { + newIndex = j; + break; + } + } + } + if (newIndex === void 0) { + unmount(prevChild, parentComponent, parentSuspense, true); + } else { + newIndexToOldIndexMap[newIndex - s2] = i + 1; + if (newIndex >= maxNewIndexSoFar) { + maxNewIndexSoFar = newIndex; + } else { + moved = true; + } + patch( + prevChild, + c2[newIndex], + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + patched++; + } + } + const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR; + j = increasingNewIndexSequence.length - 1; + for (i = toBePatched - 1; i >= 0; i--) { + const nextIndex = s2 + i; + const nextChild = c2[nextIndex]; + const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor; + if (newIndexToOldIndexMap[i] === 0) { + patch( + null, + nextChild, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (moved) { + if (j < 0 || i !== increasingNewIndexSequence[j]) { + move(nextChild, container, anchor, 2); + } else { + j--; + } + } + } + } + }; + const move = (vnode, container, anchor, moveType, parentSuspense = null) => { + const { el, type, transition, children, shapeFlag } = vnode; + if (shapeFlag & 6) { + move(vnode.component.subTree, container, anchor, moveType); + return; + } + if (shapeFlag & 128) { + vnode.suspense.move(container, anchor, moveType); + return; + } + if (shapeFlag & 64) { + type.move(vnode, container, anchor, internals); + return; + } + if (type === Fragment) { + hostInsert(el, container, anchor); + for (let i = 0; i < children.length; i++) { + move(children[i], container, anchor, moveType); + } + hostInsert(vnode.anchor, container, anchor); + return; + } + if (type === Static) { + moveStaticNode(vnode, container, anchor); + return; + } + const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition; + if (needTransition2) { + if (moveType === 0) { + transition.beforeEnter(el); + hostInsert(el, container, anchor); + queuePostRenderEffect(() => transition.enter(el), parentSuspense); + } else { + const { leave, delayLeave, afterLeave } = transition; + const remove22 = () => hostInsert(el, container, anchor); + const performLeave = () => { + leave(el, () => { + remove22(); + afterLeave && afterLeave(); + }); + }; + if (delayLeave) { + delayLeave(el, remove22, performLeave); + } else { + performLeave(); + } + } + } else { + hostInsert(el, container, anchor); + } + }; + const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => { + const { + type, + props, + ref: ref2, + children, + dynamicChildren, + shapeFlag, + patchFlag, + dirs, + cacheIndex + } = vnode; + if (patchFlag === -2) { + optimized = false; + } + if (ref2 != null) { + setRef(ref2, null, parentSuspense, vnode, true); + } + if (cacheIndex != null) { + parentComponent.renderCache[cacheIndex] = void 0; + } + if (shapeFlag & 256) { + parentComponent.ctx.deactivate(vnode); + return; + } + const shouldInvokeDirs = shapeFlag & 1 && dirs; + const shouldInvokeVnodeHook = !isAsyncWrapper(vnode); + let vnodeHook; + if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) { + invokeVNodeHook(vnodeHook, parentComponent, vnode); + } + if (shapeFlag & 6) { + unmountComponent(vnode.component, parentSuspense, doRemove); + } else { + if (shapeFlag & 128) { + vnode.suspense.unmount(parentSuspense, doRemove); + return; + } + if (shouldInvokeDirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount"); + } + if (shapeFlag & 64) { + vnode.type.remove( + vnode, + parentComponent, + parentSuspense, + internals, + doRemove + ); + } else if (dynamicChildren && // #5154 + // when v-once is used inside a block, setBlockTracking(-1) marks the + // parent block with hasOnce: true + // so that it doesn't take the fast path during unmount - otherwise + // components nested in v-once are never unmounted. + !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments + (type !== Fragment || patchFlag > 0 && patchFlag & 64)) { + unmountChildren( + dynamicChildren, + parentComponent, + parentSuspense, + false, + true + ); + } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) { + unmountChildren(children, parentComponent, parentSuspense); + } + if (doRemove) { + remove2(vnode); + } + } + if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); + shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted"); + }, parentSuspense); + } + }; + const remove2 = (vnode) => { + const { type, el, anchor, transition } = vnode; + if (type === Fragment) { + if (vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) { + vnode.children.forEach((child) => { + if (child.type === Comment) { + hostRemove(child.el); + } else { + remove2(child); + } + }); + } else { + removeFragment(el, anchor); + } + return; + } + if (type === Static) { + removeStaticNode(vnode); + return; + } + const performRemove = () => { + hostRemove(el); + if (transition && !transition.persisted && transition.afterLeave) { + transition.afterLeave(); + } + }; + if (vnode.shapeFlag & 1 && transition && !transition.persisted) { + const { leave, delayLeave } = transition; + const performLeave = () => leave(el, performRemove); + if (delayLeave) { + delayLeave(vnode.el, performRemove, performLeave); + } else { + performLeave(); + } + } else { + performRemove(); + } + }; + const removeFragment = (cur, end) => { + let next; + while (cur !== end) { + next = hostNextSibling(cur); + hostRemove(cur); + cur = next; + } + hostRemove(end); + }; + const unmountComponent = (instance, parentSuspense, doRemove) => { + if (instance.type.__hmrId) { + unregisterHMR(instance); + } + const { bum, scope, update, subTree, um, m, a } = instance; + invalidateMount(m); + invalidateMount(a); + if (bum) { + invokeArrayFns(bum); + } + scope.stop(); + if (update) { + update.active = false; + unmount(subTree, instance, parentSuspense, doRemove); + } + if (um) { + queuePostRenderEffect(um, parentSuspense); + } + queuePostRenderEffect(() => { + instance.isUnmounted = true; + }, parentSuspense); + if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) { + parentSuspense.deps--; + if (parentSuspense.deps === 0) { + parentSuspense.resolve(); + } + } + if (true) { + devtoolsComponentRemoved(instance); + } + }; + const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => { + for (let i = start; i < children.length; i++) { + unmount(children[i], parentComponent, parentSuspense, doRemove, optimized); + } + }; + const getNextHostNode = (vnode) => { + if (vnode.shapeFlag & 6) { + return getNextHostNode(vnode.component.subTree); + } + if (vnode.shapeFlag & 128) { + return vnode.suspense.next(); + } + const el = hostNextSibling(vnode.anchor || vnode.el); + const teleportEnd = el && el[TeleportEndKey]; + return teleportEnd ? hostNextSibling(teleportEnd) : el; + }; + let isFlushing2 = false; + const render2 = (vnode, container, namespace) => { + if (vnode == null) { + if (container._vnode) { + unmount(container._vnode, null, null, true); + } + } else { + patch( + container._vnode || null, + vnode, + container, + null, + null, + null, + namespace + ); + } + container._vnode = vnode; + if (!isFlushing2) { + isFlushing2 = true; + flushPreFlushCbs(); + flushPostFlushCbs(); + isFlushing2 = false; + } + }; + const internals = { + p: patch, + um: unmount, + m: move, + r: remove2, + mt: mountComponent, + mc: mountChildren, + pc: patchChildren, + pbc: patchBlockChildren, + n: getNextHostNode, + o: options + }; + let hydrate2; + let hydrateNode; + if (createHydrationFns) { + [hydrate2, hydrateNode] = createHydrationFns( + internals + ); + } + return { + render: render2, + hydrate: hydrate2, + createApp: createAppAPI(render2, hydrate2) + }; +} +function resolveChildrenNamespace({ type, props }, currentNamespace) { + return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace; +} +function toggleRecurse({ effect: effect2, update }, allowed) { + effect2.allowRecurse = update.allowRecurse = allowed; +} +function needTransition(parentSuspense, transition) { + return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted; +} +function traverseStaticChildren(n1, n2, shallow = false) { + const ch1 = n1.children; + const ch2 = n2.children; + if (isArray(ch1) && isArray(ch2)) { + for (let i = 0; i < ch1.length; i++) { + const c1 = ch1[i]; + let c2 = ch2[i]; + if (c2.shapeFlag & 1 && !c2.dynamicChildren) { + if (c2.patchFlag <= 0 || c2.patchFlag === 32) { + c2 = ch2[i] = cloneIfMounted(ch2[i]); + c2.el = c1.el; + } + if (!shallow && c2.patchFlag !== -2) + traverseStaticChildren(c1, c2); + } + if (c2.type === Text) { + c2.el = c1.el; + } + if (c2.type === Comment && !c2.el) { + c2.el = c1.el; + } + } + } +} +function getSequence(arr) { + const p2 = arr.slice(); + const result = [0]; + let i, j, u, v, c; + const len = arr.length; + for (i = 0; i < len; i++) { + const arrI = arr[i]; + if (arrI !== 0) { + j = result[result.length - 1]; + if (arr[j] < arrI) { + p2[i] = j; + result.push(i); + continue; + } + u = 0; + v = result.length - 1; + while (u < v) { + c = u + v >> 1; + if (arr[result[c]] < arrI) { + u = c + 1; + } else { + v = c; + } + } + if (arrI < arr[result[u]]) { + if (u > 0) { + p2[i] = result[u - 1]; + } + result[u] = i; + } + } + } + u = result.length; + v = result[u - 1]; + while (u-- > 0) { + result[u] = v; + v = p2[v]; + } + return result; +} +function locateNonHydratedAsyncRoot(instance) { + const subComponent = instance.subTree.component; + if (subComponent) { + if (subComponent.asyncDep && !subComponent.asyncResolved) { + return subComponent; + } else { + return locateNonHydratedAsyncRoot(subComponent); + } + } +} +function invalidateMount(hooks) { + if (hooks) { + for (let i = 0; i < hooks.length; i++) hooks[i].active = false; + } +} +var ssrContextKey = Symbol.for("v-scx"); +var useSSRContext = () => { + { + const ctx = inject(ssrContextKey); + if (!ctx) { + warn$1( + `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.` + ); + } + return ctx; + } +}; +function watchEffect(effect2, options) { + return doWatch(effect2, null, options); +} +function watchPostEffect(effect2, options) { + return doWatch( + effect2, + null, + true ? extend({}, options, { flush: "post" }) : { flush: "post" } + ); +} +function watchSyncEffect(effect2, options) { + return doWatch( + effect2, + null, + true ? extend({}, options, { flush: "sync" }) : { flush: "sync" } + ); +} +var INITIAL_WATCHER_VALUE = {}; +function watch(source, cb, options) { + if (!isFunction(cb)) { + warn$1( + `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.` + ); + } + return doWatch(source, cb, options); +} +function doWatch(source, cb, { + immediate, + deep, + flush, + once, + onTrack, + onTrigger +} = EMPTY_OBJ) { + if (cb && once) { + const _cb = cb; + cb = (...args) => { + _cb(...args); + unwatch(); + }; + } + if (deep !== void 0 && typeof deep === "number") { + warn$1( + `watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.` + ); + } + if (!cb) { + if (immediate !== void 0) { + warn$1( + `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + if (deep !== void 0) { + warn$1( + `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + if (once !== void 0) { + warn$1( + `watch() "once" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + } + const warnInvalidSource = (s) => { + warn$1( + `Invalid watch source: `, + s, + `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.` + ); + }; + const instance = currentInstance; + const reactiveGetter = (source2) => deep === true ? source2 : ( + // for deep: false, only traverse root-level properties + traverse(source2, deep === false ? 1 : void 0) + ); + let getter; + let forceTrigger = false; + let isMultiSource = false; + if (isRef2(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => reactiveGetter(source); + forceTrigger = true; + } else if (isArray(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef2(s)) { + return s.value; + } else if (isReactive(s)) { + return reactiveGetter(s); + } else if (isFunction(s)) { + return callWithErrorHandling(s, instance, 2); + } else { + warnInvalidSource(s); + } + }); + } else if (isFunction(source)) { + if (cb) { + getter = () => callWithErrorHandling(source, instance, 2); + } else { + getter = () => { + if (cleanup) { + cleanup(); + } + return callWithAsyncErrorHandling( + source, + instance, + 3, + [onCleanup] + ); + }; + } + } else { + getter = NOOP; + warnInvalidSource(source); + } + if (cb && deep) { + const baseGetter = getter; + getter = () => traverse(baseGetter()); + } + let cleanup; + let onCleanup = (fn) => { + cleanup = effect2.onStop = () => { + callWithErrorHandling(fn, instance, 4); + cleanup = effect2.onStop = void 0; + }; + }; + let ssrCleanup; + if (isInSSRComponentSetup) { + onCleanup = NOOP; + if (!cb) { + getter(); + } else if (immediate) { + callWithAsyncErrorHandling(cb, instance, 3, [ + getter(), + isMultiSource ? [] : void 0, + onCleanup + ]); + } + if (flush === "sync") { + const ctx = useSSRContext(); + ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); + } else { + return NOOP; + } + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = () => { + if (!effect2.active || !effect2.dirty) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) { + if (cleanup) { + cleanup(); + } + callWithAsyncErrorHandling(cb, instance, 3, [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + onCleanup + ]); + oldValue = newValue; + } + } else { + effect2.run(); + } + }; + job.allowRecurse = !!cb; + let scheduler; + if (flush === "sync") { + scheduler = job; + } else if (flush === "post") { + scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); + } else { + job.pre = true; + if (instance) job.id = instance.uid; + scheduler = () => queueJob(job); + } + const effect2 = new ReactiveEffect(getter, NOOP, scheduler); + const scope = getCurrentScope(); + const unwatch = () => { + effect2.stop(); + if (scope) { + remove(scope.effects, effect2); + } + }; + if (true) { + effect2.onTrack = onTrack; + effect2.onTrigger = onTrigger; + } + if (cb) { + if (immediate) { + job(); + } else { + oldValue = effect2.run(); + } + } else if (flush === "post") { + queuePostRenderEffect( + effect2.run.bind(effect2), + instance && instance.suspense + ); + } else { + effect2.run(); + } + if (ssrCleanup) ssrCleanup.push(unwatch); + return unwatch; +} +function instanceWatch(source, value, options) { + const publicThis = this.proxy; + const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); + let cb; + if (isFunction(value)) { + cb = value; + } else { + cb = value.handler; + options = value; + } + const reset = setCurrentInstance(this); + const res = doWatch(getter, cb.bind(publicThis), options); + reset(); + return res; +} +function createPathGetter(ctx, path) { + const segments = path.split("."); + return () => { + let cur = ctx; + for (let i = 0; i < segments.length && cur; i++) { + cur = cur[segments[i]]; + } + return cur; + }; +} +function traverse(value, depth = Infinity, seen) { + if (depth <= 0 || !isObject(value) || value["__v_skip"]) { + return value; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + depth--; + if (isRef2(value)) { + traverse(value.value, depth, seen); + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], depth, seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, depth, seen); + }); + } else if (isPlainObject(value)) { + for (const key in value) { + traverse(value[key], depth, seen); + } + for (const key of Object.getOwnPropertySymbols(value)) { + if (Object.prototype.propertyIsEnumerable.call(value, key)) { + traverse(value[key], depth, seen); + } + } + } + return value; +} +function useModel(props, name, options = EMPTY_OBJ) { + const i = getCurrentInstance(); + if (!i) { + warn$1(`useModel() called without active instance.`); + return ref(); + } + if (!i.propsOptions[0][name]) { + warn$1(`useModel() called with prop "${name}" which is not declared.`); + return ref(); + } + const camelizedName = camelize(name); + const hyphenatedName = hyphenate(name); + const modifiers = getModelModifiers(props, name); + const res = customRef((track2, trigger2) => { + let localValue; + let prevSetValue = EMPTY_OBJ; + let prevEmittedValue; + watchSyncEffect(() => { + const propValue = props[name]; + if (hasChanged(localValue, propValue)) { + localValue = propValue; + trigger2(); + } + }); + return { + get() { + track2(); + return options.get ? options.get(localValue) : localValue; + }, + set(value) { + const emittedValue = options.set ? options.set(value) : value; + if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) { + return; + } + const rawProps = i.vnode.props; + if (!(rawProps && // check if parent has passed v-model + (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) { + localValue = value; + trigger2(); + } + i.emit(`update:${name}`, emittedValue); + if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) { + trigger2(); + } + prevSetValue = value; + prevEmittedValue = emittedValue; + } + }; + }); + res[Symbol.iterator] = () => { + let i2 = 0; + return { + next() { + if (i2 < 2) { + return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false }; + } else { + return { done: true }; + } + } + }; + }; + return res; +} +var getModelModifiers = (props, modelName) => { + return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`]; +}; +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) return; + const props = instance.vnode.props || EMPTY_OBJ; + if (true) { + const { + emitsOptions, + propsOptions: [propsOptions] + } = instance; + if (emitsOptions) { + if (!(event in emitsOptions) && true) { + if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) { + warn$1( + `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(camelize(event))}" prop.` + ); + } + } else { + const validator = emitsOptions[event]; + if (isFunction(validator)) { + const isValid = validator(...rawArgs); + if (!isValid) { + warn$1( + `Invalid event arguments: event validation failed for event "${event}".` + ); + } + } + } + } + } + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modifiers = isModelListener2 && getModelModifiers(props, event.slice(7)); + if (modifiers) { + if (modifiers.trim) { + args = rawArgs.map((a) => isString(a) ? a.trim() : a); + } + if (modifiers.number) { + args = rawArgs.map(looseToNumber); + } + } + if (true) { + devtoolsComponentEmit(instance, event, args); + } + if (true) { + const lowerCaseEvent = event.toLowerCase(); + if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { + warn$1( + `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName( + instance, + instance.type + )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate( + event + )}" instead of "${event}".` + ); + } + } + let handlerName; + let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize(event))]; + if (!handler && isModelListener2) { + handler = props[handlerName = toHandlerKey(hyphenate(event))]; + } + if (handler) { + callWithAsyncErrorHandling( + handler, + instance, + 6, + args + ); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; + } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling( + onceHandler, + instance, + 6, + args + ); + } +} +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache = appContext.emitsCache; + const cached = cache.get(comp); + if (cached !== void 0) { + return cached; + } + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (__VUE_OPTIONS_API__ && !isFunction(comp)) { + const extendEmits = (raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend(normalized, normalizedFromExtend); + } + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); + } + if (comp.extends) { + extendEmits(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendEmits); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, null); + } + return null; + } + if (isArray(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend(normalized, raw); + } + if (isObject(comp)) { + cache.set(comp, normalized); + } + return normalized; +} +function isEmitListener(options, key) { + if (!options || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); +} +var accessedAttrs = false; +function markAttrsAccessed() { + accessedAttrs = true; +} +function renderComponentRoot(instance) { + const { + type: Component, + vnode, + proxy, + withProxy, + propsOptions: [propsOptions], + slots, + attrs, + emit: emit2, + render: render2, + renderCache, + props, + data, + setupState, + ctx, + inheritAttrs + } = instance; + const prev = setCurrentRenderingInstance(instance); + let result; + let fallthroughAttrs; + if (true) { + accessedAttrs = false; + } + try { + if (vnode.shapeFlag & 4) { + const proxyToUse = withProxy || proxy; + const thisProxy = setupState.__isScriptSetup ? new Proxy(proxyToUse, { + get(target, key, receiver) { + warn$1( + `Property '${String( + key + )}' was accessed via 'this'. Avoid using 'this' in templates.` + ); + return Reflect.get(target, key, receiver); + } + }) : proxyToUse; + result = normalizeVNode( + render2.call( + thisProxy, + proxyToUse, + renderCache, + true ? shallowReadonly(props) : props, + setupState, + data, + ctx + ) + ); + fallthroughAttrs = attrs; + } else { + const render22 = Component; + if (attrs === props) { + markAttrsAccessed(); + } + result = normalizeVNode( + render22.length > 1 ? render22( + true ? shallowReadonly(props) : props, + true ? { + get attrs() { + markAttrsAccessed(); + return shallowReadonly(attrs); + }, + slots, + emit: emit2 + } : { attrs, slots, emit: emit2 } + ) : render22( + true ? shallowReadonly(props) : props, + null + ) + ); + fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); + } + } catch (err) { + blockStack.length = 0; + handleError(err, instance, 1); + result = createVNode(Comment); + } + let root = result; + let setRoot = void 0; + if (result.patchFlag > 0 && result.patchFlag & 2048) { + [root, setRoot] = getChildRoot(result); + } + if (fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs); + const { shapeFlag } = root; + if (keys.length) { + if (shapeFlag & (1 | 6)) { + if (propsOptions && keys.some(isModelListener)) { + fallthroughAttrs = filterModelListeners( + fallthroughAttrs, + propsOptions + ); + } + root = cloneVNode(root, fallthroughAttrs, false, true); + } else if (!accessedAttrs && root.type !== Comment) { + const allAttrs = Object.keys(attrs); + const eventAttrs = []; + const extraAttrs = []; + for (let i = 0, l = allAttrs.length; i < l; i++) { + const key = allAttrs[i]; + if (isOn(key)) { + if (!isModelListener(key)) { + eventAttrs.push(key[2].toLowerCase() + key.slice(3)); + } + } else { + extraAttrs.push(key); + } + } + if (extraAttrs.length) { + warn$1( + `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.` + ); + } + if (eventAttrs.length) { + warn$1( + `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.` + ); + } + } + } + } + if (vnode.dirs) { + if (!isElementRoot(root)) { + warn$1( + `Runtime directive used on component with non-element root node. The directives will not function as intended.` + ); + } + root = cloneVNode(root, null, false, true); + root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; + } + if (vnode.transition) { + if (!isElementRoot(root)) { + warn$1( + `Component inside <Transition> renders non-element root node that cannot be animated.` + ); + } + root.transition = vnode.transition; + } + if (setRoot) { + setRoot(root); + } else { + result = root; + } + setCurrentRenderingInstance(prev); + return result; +} +var getChildRoot = (vnode) => { + const rawChildren = vnode.children; + const dynamicChildren = vnode.dynamicChildren; + const childRoot = filterSingleRoot(rawChildren, false); + if (!childRoot) { + return [vnode, void 0]; + } else if (childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) { + return getChildRoot(childRoot); + } + const index = rawChildren.indexOf(childRoot); + const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; + const setRoot = (updatedRoot) => { + rawChildren[index] = updatedRoot; + if (dynamicChildren) { + if (dynamicIndex > -1) { + dynamicChildren[dynamicIndex] = updatedRoot; + } else if (updatedRoot.patchFlag > 0) { + vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; + } + } + }; + return [normalizeVNode(childRoot), setRoot]; +}; +function filterSingleRoot(children, recurse = true) { + let singleRoot; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (isVNode(child)) { + if (child.type !== Comment || child.children === "v-if") { + if (singleRoot) { + return; + } else { + singleRoot = child; + if (recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) { + return filterSingleRoot(singleRoot.children); + } + } + } + } else { + return; + } + } + return singleRoot; +} +var getFunctionalFallthrough = (attrs) => { + let res; + for (const key in attrs) { + if (key === "class" || key === "style" || isOn(key)) { + (res || (res = {}))[key] = attrs[key]; + } + } + return res; +}; +var filterModelListeners = (attrs, props) => { + const res = {}; + for (const key in attrs) { + if (!isModelListener(key) || !(key.slice(9) in props)) { + res[key] = attrs[key]; + } + } + return res; +}; +var isElementRoot = (vnode) => { + return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; +}; +function shouldUpdateComponent(prevVNode, nextVNode, optimized) { + const { props: prevProps, children: prevChildren, component } = prevVNode; + const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; + const emits = component.emitsOptions; + if ((prevChildren || nextChildren) && isHmrUpdating) { + return true; + } + if (nextVNode.dirs || nextVNode.transition) { + return true; + } + if (optimized && patchFlag >= 0) { + if (patchFlag & 1024) { + return true; + } + if (patchFlag & 16) { + if (!prevProps) { + return !!nextProps; + } + return hasPropsChanged(prevProps, nextProps, emits); + } else if (patchFlag & 8) { + const dynamicProps = nextVNode.dynamicProps; + for (let i = 0; i < dynamicProps.length; i++) { + const key = dynamicProps[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { + return true; + } + } + } + } else { + if (prevChildren || nextChildren) { + if (!nextChildren || !nextChildren.$stable) { + return true; + } + } + if (prevProps === nextProps) { + return false; + } + if (!prevProps) { + return !!nextProps; + } + if (!nextProps) { + return true; + } + return hasPropsChanged(prevProps, nextProps, emits); + } + return false; +} +function hasPropsChanged(prevProps, nextProps, emitsOptions) { + const nextKeys = Object.keys(nextProps); + if (nextKeys.length !== Object.keys(prevProps).length) { + return true; + } + for (let i = 0; i < nextKeys.length; i++) { + const key = nextKeys[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { + return true; + } + } + return false; +} +function updateHOCHostEl({ vnode, parent }, el) { + while (parent) { + const root = parent.subTree; + if (root.suspense && root.suspense.activeBranch === vnode) { + root.el = vnode.el; + } + if (root === vnode) { + (vnode = parent.vnode).el = el; + parent = parent.parent; + } else { + break; + } + } +} +var isSuspense = (type) => type.__isSuspense; +var suspenseId = 0; +var SuspenseImpl = { + name: "Suspense", + // In order to make Suspense tree-shakable, we need to avoid importing it + // directly in the renderer. The renderer checks for the __isSuspense flag + // on a vnode's type and calls the `process` method, passing in renderer + // internals. + __isSuspense: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { + if (n1 == null) { + mountSuspense( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + } else { + if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) { + n2.suspense = n1.suspense; + n2.suspense.vnode = n2; + n2.el = n1.el; + return; + } + patchSuspense( + n1, + n2, + container, + anchor, + parentComponent, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + } + }, + hydrate: hydrateSuspense, + normalize: normalizeSuspenseChildren +}; +var Suspense = SuspenseImpl; +function triggerEvent(vnode, name) { + const eventListener = vnode.props && vnode.props[name]; + if (isFunction(eventListener)) { + eventListener(); + } +} +function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { + const { + p: patch, + o: { createElement } + } = rendererInternals; + const hiddenContainer = createElement("div"); + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + container, + hiddenContainer, + anchor, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + patch( + null, + suspense.pendingBranch = vnode.ssContent, + hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds + ); + if (suspense.deps > 0) { + triggerEvent(vnode, "onPending"); + triggerEvent(vnode, "onFallback"); + patch( + null, + vnode.ssFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds + ); + setActiveBranch(suspense, vnode.ssFallback); + } else { + suspense.resolve(false, true); + } +} +function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) { + const suspense = n2.suspense = n1.suspense; + suspense.vnode = n2; + n2.el = n1.el; + const newBranch = n2.ssContent; + const newFallback = n2.ssFallback; + const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; + if (pendingBranch) { + suspense.pendingBranch = newBranch; + if (isSameVNodeType(newBranch, pendingBranch)) { + patch( + pendingBranch, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else if (isInFallback) { + if (!isHydrating) { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } + } else { + suspense.pendingId = suspenseId++; + if (isHydrating) { + suspense.isHydrating = false; + suspense.activeBranch = pendingBranch; + } else { + unmount(pendingBranch, parentComponent, suspense); + } + suspense.deps = 0; + suspense.effects.length = 0; + suspense.hiddenContainer = createElement("div"); + if (isInFallback) { + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + suspense.resolve(true); + } else { + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } + } + } + } else { + if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newBranch); + } else { + triggerEvent(n2, "onPending"); + suspense.pendingBranch = newBranch; + if (newBranch.shapeFlag & 512) { + suspense.pendingId = newBranch.component.suspenseId; + } else { + suspense.pendingId = suspenseId++; + } + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + const { timeout, pendingId } = suspense; + if (timeout > 0) { + setTimeout(() => { + if (suspense.pendingId === pendingId) { + suspense.fallback(newFallback); + } + }, timeout); + } else if (timeout === 0) { + suspense.fallback(newFallback); + } + } + } + } +} +var hasWarned = false; +function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) { + if (!hasWarned) { + hasWarned = true; + console[console.info ? "info" : "log"]( + `<Suspense> is an experimental feature and its API will likely change.` + ); + } + const { + p: patch, + m: move, + um: unmount, + n: next, + o: { parentNode, remove: remove2 } + } = rendererInternals; + let parentSuspenseId; + const isSuspensible = isVNodeSuspensible(vnode); + if (isSuspensible) { + if (parentSuspense && parentSuspense.pendingBranch) { + parentSuspenseId = parentSuspense.pendingId; + parentSuspense.deps++; + } + } + const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0; + if (true) { + assertNumber(timeout, `Suspense timeout`); + } + const initialAnchor = anchor; + const suspense = { + vnode, + parent: parentSuspense, + parentComponent, + namespace, + container, + hiddenContainer, + deps: 0, + pendingId: suspenseId++, + timeout: typeof timeout === "number" ? timeout : -1, + activeBranch: null, + pendingBranch: null, + isInFallback: !isHydrating, + isHydrating, + isUnmounted: false, + effects: [], + resolve(resume = false, sync = false) { + if (true) { + if (!resume && !suspense.pendingBranch) { + throw new Error( + `suspense.resolve() is called without a pending branch.` + ); + } + if (suspense.isUnmounted) { + throw new Error( + `suspense.resolve() is called on an already unmounted suspense boundary.` + ); + } + } + const { + vnode: vnode2, + activeBranch, + pendingBranch, + pendingId, + effects, + parentComponent: parentComponent2, + container: container2 + } = suspense; + let delayEnter = false; + if (suspense.isHydrating) { + suspense.isHydrating = false; + } else if (!resume) { + delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = () => { + if (pendingId === suspense.pendingId) { + move( + pendingBranch, + container2, + anchor === initialAnchor ? next(activeBranch) : anchor, + 0 + ); + queuePostFlushCb(effects); + } + }; + } + if (activeBranch) { + if (parentNode(activeBranch.el) !== suspense.hiddenContainer) { + anchor = next(activeBranch); + } + unmount(activeBranch, parentComponent2, suspense, true); + } + if (!delayEnter) { + move(pendingBranch, container2, anchor, 0); + } + } + setActiveBranch(suspense, pendingBranch); + suspense.pendingBranch = null; + suspense.isInFallback = false; + let parent = suspense.parent; + let hasUnresolvedAncestor = false; + while (parent) { + if (parent.pendingBranch) { + parent.effects.push(...effects); + hasUnresolvedAncestor = true; + break; + } + parent = parent.parent; + } + if (!hasUnresolvedAncestor && !delayEnter) { + queuePostFlushCb(effects); + } + suspense.effects = []; + if (isSuspensible) { + if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) { + parentSuspense.deps--; + if (parentSuspense.deps === 0 && !sync) { + parentSuspense.resolve(); + } + } + } + triggerEvent(vnode2, "onResolve"); + }, + fallback(fallbackVNode) { + if (!suspense.pendingBranch) { + return; + } + const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense; + triggerEvent(vnode2, "onFallback"); + const anchor2 = next(activeBranch); + const mountFallback = () => { + if (!suspense.isInFallback) { + return; + } + patch( + null, + fallbackVNode, + container2, + anchor2, + parentComponent2, + null, + // fallback tree will not have suspense context + namespace2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, fallbackVNode); + }; + const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = mountFallback; + } + suspense.isInFallback = true; + unmount( + activeBranch, + parentComponent2, + null, + // no suspense so unmount hooks fire now + true + // shouldRemove + ); + if (!delayEnter) { + mountFallback(); + } + }, + move(container2, anchor2, type) { + suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); + suspense.container = container2; + }, + next() { + return suspense.activeBranch && next(suspense.activeBranch); + }, + registerDep(instance, setupRenderEffect, optimized2) { + const isInPendingSuspense = !!suspense.pendingBranch; + if (isInPendingSuspense) { + suspense.deps++; + } + const hydratedEl = instance.vnode.el; + instance.asyncDep.catch((err) => { + handleError(err, instance, 0); + }).then((asyncSetupResult) => { + if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { + return; + } + instance.asyncResolved = true; + const { vnode: vnode2 } = instance; + if (true) { + pushWarningContext(vnode2); + } + handleSetupResult(instance, asyncSetupResult, false); + if (hydratedEl) { + vnode2.el = hydratedEl; + } + const placeholder = !hydratedEl && instance.subTree.el; + setupRenderEffect( + instance, + vnode2, + // component may have been moved before resolve. + // if this is not a hydration, instance.subTree will be the comment + // placeholder. + parentNode(hydratedEl || instance.subTree.el), + // anchor will not be used if this is hydration, so only need to + // consider the comment placeholder case. + hydratedEl ? null : next(instance.subTree), + suspense, + namespace, + optimized2 + ); + if (placeholder) { + remove2(placeholder); + } + updateHOCHostEl(instance, vnode2.el); + if (true) { + popWarningContext(); + } + if (isInPendingSuspense && --suspense.deps === 0) { + suspense.resolve(); + } + }); + }, + unmount(parentSuspense2, doRemove) { + suspense.isUnmounted = true; + if (suspense.activeBranch) { + unmount( + suspense.activeBranch, + parentComponent, + parentSuspense2, + doRemove + ); + } + if (suspense.pendingBranch) { + unmount( + suspense.pendingBranch, + parentComponent, + parentSuspense2, + doRemove + ); + } + } + }; + return suspense; +} +function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) { + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + node.parentNode, + // eslint-disable-next-line no-restricted-globals + document.createElement("div"), + null, + namespace, + slotScopeIds, + optimized, + rendererInternals, + true + ); + const result = hydrateNode( + node, + suspense.pendingBranch = vnode.ssContent, + parentComponent, + suspense, + slotScopeIds, + optimized + ); + if (suspense.deps === 0) { + suspense.resolve(false, true); + } + return result; +} +function normalizeSuspenseChildren(vnode) { + const { shapeFlag, children } = vnode; + const isSlotChildren = shapeFlag & 32; + vnode.ssContent = normalizeSuspenseSlot( + isSlotChildren ? children.default : children + ); + vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); +} +function normalizeSuspenseSlot(s) { + let block; + if (isFunction(s)) { + const trackBlock = isBlockTreeEnabled && s._c; + if (trackBlock) { + s._d = false; + openBlock(); + } + s = s(); + if (trackBlock) { + s._d = true; + block = currentBlock; + closeBlock(); + } + } + if (isArray(s)) { + const singleChild = filterSingleRoot(s); + if (!singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) { + warn$1(`<Suspense> slots expect a single root node.`); + } + s = singleChild; + } + s = normalizeVNode(s); + if (block && !s.dynamicChildren) { + s.dynamicChildren = block.filter((c) => c !== s); + } + return s; +} +function queueEffectWithSuspense(fn, suspense) { + if (suspense && suspense.pendingBranch) { + if (isArray(fn)) { + suspense.effects.push(...fn); + } else { + suspense.effects.push(fn); + } + } else { + queuePostFlushCb(fn); + } +} +function setActiveBranch(suspense, branch) { + suspense.activeBranch = branch; + const { vnode, parentComponent } = suspense; + let el = branch.el; + while (!el && branch.component) { + branch = branch.component.subTree; + el = branch.el; + } + vnode.el = el; + if (parentComponent && parentComponent.subTree === vnode) { + parentComponent.vnode.el = el; + updateHOCHostEl(parentComponent, el); + } +} +function isVNodeSuspensible(vnode) { + const suspensible = vnode.props && vnode.props.suspensible; + return suspensible != null && suspensible !== false; +} +var Fragment = Symbol.for("v-fgt"); +var Text = Symbol.for("v-txt"); +var Comment = Symbol.for("v-cmt"); +var Static = Symbol.for("v-stc"); +var blockStack = []; +var currentBlock = null; +function openBlock(disableTracking = false) { + blockStack.push(currentBlock = disableTracking ? null : []); +} +function closeBlock() { + blockStack.pop(); + currentBlock = blockStack[blockStack.length - 1] || null; +} +var isBlockTreeEnabled = 1; +function setBlockTracking(value) { + isBlockTreeEnabled += value; + if (value < 0 && currentBlock) { + currentBlock.hasOnce = true; + } +} +function setupBlock(vnode) { + vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null; + closeBlock(); + if (isBlockTreeEnabled > 0 && currentBlock) { + currentBlock.push(vnode); + } + return vnode; +} +function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) { + return setupBlock( + createBaseVNode( + type, + props, + children, + patchFlag, + dynamicProps, + shapeFlag, + true + ) + ); +} +function createBlock(type, props, children, patchFlag, dynamicProps) { + return setupBlock( + createVNode( + type, + props, + children, + patchFlag, + dynamicProps, + true + ) + ); +} +function isVNode(value) { + return value ? value.__v_isVNode === true : false; +} +function isSameVNodeType(n1, n2) { + if (n2.shapeFlag & 6 && n1.component) { + const dirtyInstances = hmrDirtyComponents.get(n2.type); + if (dirtyInstances && dirtyInstances.has(n1.component)) { + n1.shapeFlag &= ~256; + n2.shapeFlag &= ~512; + return false; + } + } + return n1.type === n2.type && n1.key === n2.key; +} +var vnodeArgsTransformer; +function transformVNodeArgs(transformer) { + vnodeArgsTransformer = transformer; +} +var createVNodeWithArgsTransform = (...args) => { + return _createVNode( + ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args + ); +}; +var normalizeKey = ({ key }) => key != null ? key : null; +var normalizeRef = ({ + ref: ref2, + ref_key, + ref_for +}) => { + if (typeof ref2 === "number") { + ref2 = "" + ref2; + } + return ref2 != null ? isString(ref2) || isRef2(ref2) || isFunction(ref2) ? { i: currentRenderingInstance, r: ref2, k: ref_key, f: !!ref_for } : ref2 : null; +}; +function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) { + const vnode = { + __v_isVNode: true, + __v_skip: true, + type, + props, + key: props && normalizeKey(props), + ref: props && normalizeRef(props), + scopeId: currentScopeId, + slotScopeIds: null, + children, + component: null, + suspense: null, + ssContent: null, + ssFallback: null, + dirs: null, + transition: null, + el: null, + anchor: null, + target: null, + targetStart: null, + targetAnchor: null, + staticCount: 0, + shapeFlag, + patchFlag, + dynamicProps, + dynamicChildren: null, + appContext: null, + ctx: currentRenderingInstance + }; + if (needFullChildrenNormalization) { + normalizeChildren(vnode, children); + if (shapeFlag & 128) { + type.normalize(vnode); + } + } else if (children) { + vnode.shapeFlag |= isString(children) ? 8 : 16; + } + if (vnode.key !== vnode.key) { + warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type); + } + if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself + !isBlockNode && // has current parent block + currentBlock && // presence of a patch flag indicates this node needs patching on updates. + // component nodes also should always be patched, because even if the + // component doesn't need to update, it needs to persist the instance on to + // the next vnode so that it can be properly unmounted later. + (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the + // vnode should not be considered dynamic due to handler caching. + vnode.patchFlag !== 32) { + currentBlock.push(vnode); + } + return vnode; +} +var createVNode = true ? createVNodeWithArgsTransform : _createVNode; +function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) { + if (!type || type === NULL_DYNAMIC_COMPONENT) { + if (!type) { + warn$1(`Invalid vnode type when creating vnode: ${type}.`); + } + type = Comment; + } + if (isVNode(type)) { + const cloned = cloneVNode( + type, + props, + true + /* mergeRef: true */ + ); + if (children) { + normalizeChildren(cloned, children); + } + if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) { + if (cloned.shapeFlag & 6) { + currentBlock[currentBlock.indexOf(type)] = cloned; + } else { + currentBlock.push(cloned); + } + } + cloned.patchFlag = -2; + return cloned; + } + if (isClassComponent(type)) { + type = type.__vccOpts; + } + if (props) { + props = guardReactiveProps(props); + let { class: klass, style } = props; + if (klass && !isString(klass)) { + props.class = normalizeClass(klass); + } + if (isObject(style)) { + if (isProxy(style) && !isArray(style)) { + style = extend({}, style); + } + props.style = normalizeStyle(style); + } + } + const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0; + if (shapeFlag & 4 && isProxy(type)) { + type = toRaw(type); + warn$1( + `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`, + ` +Component that was made reactive: `, + type + ); + } + return createBaseVNode( + type, + props, + children, + patchFlag, + dynamicProps, + shapeFlag, + isBlockNode, + true + ); +} +function guardReactiveProps(props) { + if (!props) return null; + return isProxy(props) || isInternalObject(props) ? extend({}, props) : props; +} +function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) { + const { props, ref: ref2, patchFlag, children, transition } = vnode; + const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props; + const cloned = { + __v_isVNode: true, + __v_skip: true, + type: vnode.type, + props: mergedProps, + key: mergedProps && normalizeKey(mergedProps), + ref: extraProps && extraProps.ref ? ( + // #2078 in the case of <component :is="vnode" ref="extra"/> + // if the vnode itself already has a ref, cloneVNode will need to merge + // the refs so the single vnode can be set on multiple refs + mergeRef && ref2 ? isArray(ref2) ? ref2.concat(normalizeRef(extraProps)) : [ref2, normalizeRef(extraProps)] : normalizeRef(extraProps) + ) : ref2, + scopeId: vnode.scopeId, + slotScopeIds: vnode.slotScopeIds, + children: patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children, + target: vnode.target, + targetStart: vnode.targetStart, + targetAnchor: vnode.targetAnchor, + staticCount: vnode.staticCount, + shapeFlag: vnode.shapeFlag, + // if the vnode is cloned with extra props, we can no longer assume its + // existing patch flag to be reliable and need to add the FULL_PROPS flag. + // note: preserve flag for fragments since they use the flag for children + // fast paths only. + patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag, + dynamicProps: vnode.dynamicProps, + dynamicChildren: vnode.dynamicChildren, + appContext: vnode.appContext, + dirs: vnode.dirs, + transition, + // These should technically only be non-null on mounted VNodes. However, + // they *should* be copied for kept-alive vnodes. So we just always copy + // them since them being non-null during a mount doesn't affect the logic as + // they will simply be overwritten. + component: vnode.component, + suspense: vnode.suspense, + ssContent: vnode.ssContent && cloneVNode(vnode.ssContent), + ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback), + el: vnode.el, + anchor: vnode.anchor, + ctx: vnode.ctx, + ce: vnode.ce + }; + if (transition && cloneTransition) { + setTransitionHooks( + cloned, + transition.clone(cloned) + ); + } + return cloned; +} +function deepCloneVNode(vnode) { + const cloned = cloneVNode(vnode); + if (isArray(vnode.children)) { + cloned.children = vnode.children.map(deepCloneVNode); + } + return cloned; +} +function createTextVNode(text = " ", flag = 0) { + return createVNode(Text, null, text, flag); +} +function createStaticVNode(content, numberOfNodes) { + const vnode = createVNode(Static, null, content); + vnode.staticCount = numberOfNodes; + return vnode; +} +function createCommentVNode(text = "", asBlock = false) { + return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text); +} +function normalizeVNode(child) { + if (child == null || typeof child === "boolean") { + return createVNode(Comment); + } else if (isArray(child)) { + return createVNode( + Fragment, + null, + // #3666, avoid reference pollution when reusing vnode + child.slice() + ); + } else if (typeof child === "object") { + return cloneIfMounted(child); + } else { + return createVNode(Text, null, String(child)); + } +} +function cloneIfMounted(child) { + return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child); +} +function normalizeChildren(vnode, children) { + let type = 0; + const { shapeFlag } = vnode; + if (children == null) { + children = null; + } else if (isArray(children)) { + type = 16; + } else if (typeof children === "object") { + if (shapeFlag & (1 | 64)) { + const slot = children.default; + if (slot) { + slot._c && (slot._d = false); + normalizeChildren(vnode, slot()); + slot._c && (slot._d = true); + } + return; + } else { + type = 32; + const slotFlag = children._; + if (!slotFlag && !isInternalObject(children)) { + children._ctx = currentRenderingInstance; + } else if (slotFlag === 3 && currentRenderingInstance) { + if (currentRenderingInstance.slots._ === 1) { + children._ = 1; + } else { + children._ = 2; + vnode.patchFlag |= 1024; + } + } + } + } else if (isFunction(children)) { + children = { default: children, _ctx: currentRenderingInstance }; + type = 32; + } else { + children = String(children); + if (shapeFlag & 64) { + type = 16; + children = [createTextVNode(children)]; + } else { + type = 8; + } + } + vnode.children = children; + vnode.shapeFlag |= type; +} +function mergeProps(...args) { + const ret = {}; + for (let i = 0; i < args.length; i++) { + const toMerge = args[i]; + for (const key in toMerge) { + if (key === "class") { + if (ret.class !== toMerge.class) { + ret.class = normalizeClass([ret.class, toMerge.class]); + } + } else if (key === "style") { + ret.style = normalizeStyle([ret.style, toMerge.style]); + } else if (isOn(key)) { + const existing = ret[key]; + const incoming = toMerge[key]; + if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) { + ret[key] = existing ? [].concat(existing, incoming) : incoming; + } + } else if (key !== "") { + ret[key] = toMerge[key]; + } + } + } + return ret; +} +function invokeVNodeHook(hook, instance, vnode, prevVNode = null) { + callWithAsyncErrorHandling(hook, instance, 7, [ + vnode, + prevVNode + ]); +} +var emptyAppContext = createAppContext(); +var uid = 0; +function createComponentInstance(vnode, parent, suspense) { + const type = vnode.type; + const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext; + const instance = { + uid: uid++, + vnode, + type, + parent, + appContext, + root: null, + // to be immediately set + next: null, + subTree: null, + // will be set synchronously right after creation + effect: null, + update: null, + // will be set synchronously right after creation + scope: new EffectScope( + true + /* detached */ + ), + render: null, + proxy: null, + exposed: null, + exposeProxy: null, + withProxy: null, + provides: parent ? parent.provides : Object.create(appContext.provides), + accessCache: null, + renderCache: [], + // local resolved assets + components: null, + directives: null, + // resolved props and emits options + propsOptions: normalizePropsOptions(type, appContext), + emitsOptions: normalizeEmitsOptions(type, appContext), + // emit + emit: null, + // to be set immediately + emitted: null, + // props default value + propsDefaults: EMPTY_OBJ, + // inheritAttrs + inheritAttrs: type.inheritAttrs, + // state + ctx: EMPTY_OBJ, + data: EMPTY_OBJ, + props: EMPTY_OBJ, + attrs: EMPTY_OBJ, + slots: EMPTY_OBJ, + refs: EMPTY_OBJ, + setupState: EMPTY_OBJ, + setupContext: null, + // suspense related + suspense, + suspenseId: suspense ? suspense.pendingId : 0, + asyncDep: null, + asyncResolved: false, + // lifecycle hooks + // not using enums here because it results in computed properties + isMounted: false, + isUnmounted: false, + isDeactivated: false, + bc: null, + c: null, + bm: null, + m: null, + bu: null, + u: null, + um: null, + bum: null, + da: null, + a: null, + rtg: null, + rtc: null, + ec: null, + sp: null + }; + if (true) { + instance.ctx = createDevRenderContext(instance); + } else { + instance.ctx = { _: instance }; + } + instance.root = parent ? parent.root : instance; + instance.emit = emit.bind(null, instance); + if (vnode.ce) { + vnode.ce(instance); + } + return instance; +} +var currentInstance = null; +var getCurrentInstance = () => currentInstance || currentRenderingInstance; +var internalSetCurrentInstance; +var setInSSRSetupState; +{ + const g = getGlobalThis(); + const registerGlobalSetter = (key, setter) => { + let setters; + if (!(setters = g[key])) setters = g[key] = []; + setters.push(setter); + return (v) => { + if (setters.length > 1) setters.forEach((set2) => set2(v)); + else setters[0](v); + }; + }; + internalSetCurrentInstance = registerGlobalSetter( + `__VUE_INSTANCE_SETTERS__`, + (v) => currentInstance = v + ); + setInSSRSetupState = registerGlobalSetter( + `__VUE_SSR_SETTERS__`, + (v) => isInSSRComponentSetup = v + ); +} +var setCurrentInstance = (instance) => { + const prev = currentInstance; + internalSetCurrentInstance(instance); + instance.scope.on(); + return () => { + instance.scope.off(); + internalSetCurrentInstance(prev); + }; +}; +var unsetCurrentInstance = () => { + currentInstance && currentInstance.scope.off(); + internalSetCurrentInstance(null); +}; +var isBuiltInTag = makeMap("slot,component"); +function validateComponentName(name, { isNativeTag }) { + if (isBuiltInTag(name) || isNativeTag(name)) { + warn$1( + "Do not use built-in or reserved HTML elements as component id: " + name + ); + } +} +function isStatefulComponent(instance) { + return instance.vnode.shapeFlag & 4; +} +var isInSSRComponentSetup = false; +function setupComponent(instance, isSSR = false, optimized = false) { + isSSR && setInSSRSetupState(isSSR); + const { props, children } = instance.vnode; + const isStateful = isStatefulComponent(instance); + initProps(instance, props, isStateful, isSSR); + initSlots(instance, children, optimized); + const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0; + isSSR && setInSSRSetupState(false); + return setupResult; +} +function setupStatefulComponent(instance, isSSR) { + var _a; + const Component = instance.type; + if (true) { + if (Component.name) { + validateComponentName(Component.name, instance.appContext.config); + } + if (Component.components) { + const names = Object.keys(Component.components); + for (let i = 0; i < names.length; i++) { + validateComponentName(names[i], instance.appContext.config); + } + } + if (Component.directives) { + const names = Object.keys(Component.directives); + for (let i = 0; i < names.length; i++) { + validateDirectiveName(names[i]); + } + } + if (Component.compilerOptions && isRuntimeOnly()) { + warn$1( + `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.` + ); + } + } + instance.accessCache = /* @__PURE__ */ Object.create(null); + instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers); + if (true) { + exposePropsOnRenderContext(instance); + } + const { setup } = Component; + if (setup) { + const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null; + const reset = setCurrentInstance(instance); + pauseTracking(); + const setupResult = callWithErrorHandling( + setup, + instance, + 0, + [ + true ? shallowReadonly(instance.props) : instance.props, + setupContext + ] + ); + resetTracking(); + reset(); + if (isPromise(setupResult)) { + setupResult.then(unsetCurrentInstance, unsetCurrentInstance); + if (isSSR) { + return setupResult.then((resolvedResult) => { + handleSetupResult(instance, resolvedResult, isSSR); + }).catch((e) => { + handleError(e, instance, 0); + }); + } else { + instance.asyncDep = setupResult; + if (!instance.suspense) { + const name = (_a = Component.name) != null ? _a : "Anonymous"; + warn$1( + `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.` + ); + } + } + } else { + handleSetupResult(instance, setupResult, isSSR); + } + } else { + finishComponentSetup(instance, isSSR); + } +} +function handleSetupResult(instance, setupResult, isSSR) { + if (isFunction(setupResult)) { + if (instance.type.__ssrInlineRender) { + instance.ssrRender = setupResult; + } else { + instance.render = setupResult; + } + } else if (isObject(setupResult)) { + if (isVNode(setupResult)) { + warn$1( + `setup() should not return VNodes directly - return a render function instead.` + ); + } + if (true) { + instance.devtoolsRawSetupState = setupResult; + } + instance.setupState = proxyRefs(setupResult); + if (true) { + exposeSetupStateOnRenderContext(instance); + } + } else if (setupResult !== void 0) { + warn$1( + `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}` + ); + } + finishComponentSetup(instance, isSSR); +} +var compile; +var installWithProxy; +function registerRuntimeCompiler(_compile) { + compile = _compile; + installWithProxy = (i) => { + if (i.render._rc) { + i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers); + } + }; +} +var isRuntimeOnly = () => !compile; +function finishComponentSetup(instance, isSSR, skipOptions) { + const Component = instance.type; + if (!instance.render) { + if (!isSSR && compile && !Component.render) { + const template = Component.template || resolveMergedOptions(instance).template; + if (template) { + if (true) { + startMeasure(instance, `compile`); + } + const { isCustomElement, compilerOptions } = instance.appContext.config; + const { delimiters, compilerOptions: componentCompilerOptions } = Component; + const finalCompilerOptions = extend( + extend( + { + isCustomElement, + delimiters + }, + compilerOptions + ), + componentCompilerOptions + ); + Component.render = compile(template, finalCompilerOptions); + if (true) { + endMeasure(instance, `compile`); + } + } + } + instance.render = Component.render || NOOP; + if (installWithProxy) { + installWithProxy(instance); + } + } + if (__VUE_OPTIONS_API__ && true) { + const reset = setCurrentInstance(instance); + pauseTracking(); + try { + applyOptions(instance); + } finally { + resetTracking(); + reset(); + } + } + if (!Component.render && instance.render === NOOP && !isSSR) { + if (!compile && Component.template) { + warn$1( + `Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".` + ); + } else { + warn$1(`Component is missing template or render function: `, Component); + } + } +} +var attrsProxyHandlers = true ? { + get(target, key) { + markAttrsAccessed(); + track(target, "get", ""); + return target[key]; + }, + set() { + warn$1(`setupContext.attrs is readonly.`); + return false; + }, + deleteProperty() { + warn$1(`setupContext.attrs is readonly.`); + return false; + } +} : { + get(target, key) { + track(target, "get", ""); + return target[key]; + } +}; +function getSlotsProxy(instance) { + return new Proxy(instance.slots, { + get(target, key) { + track(instance, "get", "$slots"); + return target[key]; + } + }); +} +function createSetupContext(instance) { + const expose = (exposed) => { + if (true) { + if (instance.exposed) { + warn$1(`expose() should be called only once per setup().`); + } + if (exposed != null) { + let exposedType = typeof exposed; + if (exposedType === "object") { + if (isArray(exposed)) { + exposedType = "array"; + } else if (isRef2(exposed)) { + exposedType = "ref"; + } + } + if (exposedType !== "object") { + warn$1( + `expose() should be passed a plain object, received ${exposedType}.` + ); + } + } + } + instance.exposed = exposed || {}; + }; + if (true) { + let attrsProxy; + let slotsProxy; + return Object.freeze({ + get attrs() { + return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers)); + }, + get slots() { + return slotsProxy || (slotsProxy = getSlotsProxy(instance)); + }, + get emit() { + return (event, ...args) => instance.emit(event, ...args); + }, + expose + }); + } else { + return { + attrs: new Proxy(instance.attrs, attrsProxyHandlers), + slots: instance.slots, + emit: instance.emit, + expose + }; + } +} +function getComponentPublicInstance(instance) { + if (instance.exposed) { + return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), { + get(target, key) { + if (key in target) { + return target[key]; + } else if (key in publicPropertiesMap) { + return publicPropertiesMap[key](instance); + } + }, + has(target, key) { + return key in target || key in publicPropertiesMap; + } + })); + } else { + return instance.proxy; + } +} +var classifyRE = /(?:^|[-_])(\w)/g; +var classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); +function getComponentName(Component, includeInferred = true) { + return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; +} +function formatComponentName(instance, Component, isRoot = false) { + let name = getComponentName(Component); + if (!name && Component.__file) { + const match = Component.__file.match(/([^/\\]+)\.\w+$/); + if (match) { + name = match[1]; + } + } + if (!name && instance && instance.parent) { + const inferFromRegistry = (registry) => { + for (const key in registry) { + if (registry[key] === Component) { + return key; + } + } + }; + name = inferFromRegistry( + instance.components || instance.parent.type.components + ) || inferFromRegistry(instance.appContext.components); + } + return name ? classify(name) : isRoot ? `App` : `Anonymous`; +} +function isClassComponent(value) { + return isFunction(value) && "__vccOpts" in value; +} +var computed2 = (getterOrOptions, debugOptions) => { + const c = computed(getterOrOptions, debugOptions, isInSSRComponentSetup); + if (true) { + const i = getCurrentInstance(); + if (i && i.appContext.config.warnRecursiveComputed) { + c._warnRecursive = true; + } + } + return c; +}; +function h(type, propsOrChildren, children) { + const l = arguments.length; + if (l === 2) { + if (isObject(propsOrChildren) && !isArray(propsOrChildren)) { + if (isVNode(propsOrChildren)) { + return createVNode(type, null, [propsOrChildren]); + } + return createVNode(type, propsOrChildren); + } else { + return createVNode(type, null, propsOrChildren); + } + } else { + if (l > 3) { + children = Array.prototype.slice.call(arguments, 2); + } else if (l === 3 && isVNode(children)) { + children = [children]; + } + return createVNode(type, propsOrChildren, children); + } +} +function initCustomFormatter() { + if (typeof window === "undefined") { + return; + } + const vueStyle = { style: "color:#3ba776" }; + const numberStyle = { style: "color:#1677ff" }; + const stringStyle = { style: "color:#f5222d" }; + const keywordStyle = { style: "color:#eb2f96" }; + const formatter = { + __vue_custom_formatter: true, + header(obj) { + if (!isObject(obj)) { + return null; + } + if (obj.__isVue) { + return ["div", vueStyle, `VueInstance`]; + } else if (isRef2(obj)) { + return [ + "div", + {}, + ["span", vueStyle, genRefFlag(obj)], + "<", + formatValue(obj.value), + `>` + ]; + } else if (isReactive(obj)) { + return [ + "div", + {}, + ["span", vueStyle, isShallow(obj) ? "ShallowReactive" : "Reactive"], + "<", + formatValue(obj), + `>${isReadonly(obj) ? ` (readonly)` : ``}` + ]; + } else if (isReadonly(obj)) { + return [ + "div", + {}, + ["span", vueStyle, isShallow(obj) ? "ShallowReadonly" : "Readonly"], + "<", + formatValue(obj), + ">" + ]; + } + return null; + }, + hasBody(obj) { + return obj && obj.__isVue; + }, + body(obj) { + if (obj && obj.__isVue) { + return [ + "div", + {}, + ...formatInstance(obj.$) + ]; + } + } + }; + function formatInstance(instance) { + const blocks = []; + if (instance.type.props && instance.props) { + blocks.push(createInstanceBlock("props", toRaw(instance.props))); + } + if (instance.setupState !== EMPTY_OBJ) { + blocks.push(createInstanceBlock("setup", instance.setupState)); + } + if (instance.data !== EMPTY_OBJ) { + blocks.push(createInstanceBlock("data", toRaw(instance.data))); + } + const computed3 = extractKeys(instance, "computed"); + if (computed3) { + blocks.push(createInstanceBlock("computed", computed3)); + } + const injected = extractKeys(instance, "inject"); + if (injected) { + blocks.push(createInstanceBlock("injected", injected)); + } + blocks.push([ + "div", + {}, + [ + "span", + { + style: keywordStyle.style + ";opacity:0.66" + }, + "$ (internal): " + ], + ["object", { object: instance }] + ]); + return blocks; + } + function createInstanceBlock(type, target) { + target = extend({}, target); + if (!Object.keys(target).length) { + return ["span", {}]; + } + return [ + "div", + { style: "line-height:1.25em;margin-bottom:0.6em" }, + [ + "div", + { + style: "color:#476582" + }, + type + ], + [ + "div", + { + style: "padding-left:1.25em" + }, + ...Object.keys(target).map((key) => { + return [ + "div", + {}, + ["span", keywordStyle, key + ": "], + formatValue(target[key], false) + ]; + }) + ] + ]; + } + function formatValue(v, asRaw = true) { + if (typeof v === "number") { + return ["span", numberStyle, v]; + } else if (typeof v === "string") { + return ["span", stringStyle, JSON.stringify(v)]; + } else if (typeof v === "boolean") { + return ["span", keywordStyle, v]; + } else if (isObject(v)) { + return ["object", { object: asRaw ? toRaw(v) : v }]; + } else { + return ["span", stringStyle, String(v)]; + } + } + function extractKeys(instance, type) { + const Comp = instance.type; + if (isFunction(Comp)) { + return; + } + const extracted = {}; + for (const key in instance.ctx) { + if (isKeyOfType(Comp, key, type)) { + extracted[key] = instance.ctx[key]; + } + } + return extracted; + } + function isKeyOfType(Comp, key, type) { + const opts = Comp[type]; + if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) { + return true; + } + if (Comp.extends && isKeyOfType(Comp.extends, key, type)) { + return true; + } + if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) { + return true; + } + } + function genRefFlag(v) { + if (isShallow(v)) { + return `ShallowRef`; + } + if (v.effect) { + return `ComputedRef`; + } + return `Ref`; + } + if (window.devtoolsFormatters) { + window.devtoolsFormatters.push(formatter); + } else { + window.devtoolsFormatters = [formatter]; + } +} +function withMemo(memo, render2, cache, index) { + const cached = cache[index]; + if (cached && isMemoSame(cached, memo)) { + return cached; + } + const ret = render2(); + ret.memo = memo.slice(); + ret.cacheIndex = index; + return cache[index] = ret; +} +function isMemoSame(cached, memo) { + const prev = cached.memo; + if (prev.length != memo.length) { + return false; + } + for (let i = 0; i < prev.length; i++) { + if (hasChanged(prev[i], memo[i])) { + return false; + } + } + if (isBlockTreeEnabled > 0 && currentBlock) { + currentBlock.push(cached); + } + return true; +} +var version = "3.4.38"; +var warn2 = true ? warn$1 : NOOP; +var ErrorTypeStrings = ErrorTypeStrings$1; +var devtools = true ? devtools$1 : void 0; +var setDevtoolsHook = true ? setDevtoolsHook$1 : NOOP; +var _ssrUtils = { + createComponentInstance, + setupComponent, + renderComponentRoot, + setCurrentRenderingInstance, + isVNode, + normalizeVNode, + getComponentPublicInstance, + ensureValidVNode +}; +var ssrUtils = _ssrUtils; +var resolveFilter = null; +var compatUtils = null; +var DeprecationTypes = null; + +// node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +var svgNS = "http://www.w3.org/2000/svg"; +var mathmlNS = "http://www.w3.org/1998/Math/MathML"; +var doc = typeof document !== "undefined" ? document : null; +var templateContainer = doc && doc.createElement("template"); +var nodeOps = { + insert: (child, parent, anchor) => { + parent.insertBefore(child, anchor || null); + }, + remove: (child) => { + const parent = child.parentNode; + if (parent) { + parent.removeChild(child); + } + }, + createElement: (tag, namespace, is, props) => { + const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag); + if (tag === "select" && props && props.multiple != null) { + el.setAttribute("multiple", props.multiple); + } + return el; + }, + createText: (text) => doc.createTextNode(text), + createComment: (text) => doc.createComment(text), + setText: (node, text) => { + node.nodeValue = text; + }, + setElementText: (el, text) => { + el.textContent = text; + }, + parentNode: (node) => node.parentNode, + nextSibling: (node) => node.nextSibling, + querySelector: (selector) => doc.querySelector(selector), + setScopeId(el, id) { + el.setAttribute(id, ""); + }, + // __UNSAFE__ + // Reason: innerHTML. + // Static content here can only come from compiled templates. + // As long as the user only uses trusted templates, this is safe. + insertStaticContent(content, parent, anchor, namespace, start, end) { + const before = anchor ? anchor.previousSibling : parent.lastChild; + if (start && (start === end || start.nextSibling)) { + while (true) { + parent.insertBefore(start.cloneNode(true), anchor); + if (start === end || !(start = start.nextSibling)) break; + } + } else { + templateContainer.innerHTML = namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content; + const template = templateContainer.content; + if (namespace === "svg" || namespace === "mathml") { + const wrapper = template.firstChild; + while (wrapper.firstChild) { + template.appendChild(wrapper.firstChild); + } + template.removeChild(wrapper); + } + parent.insertBefore(template, anchor); + } + return [ + // first + before ? before.nextSibling : parent.firstChild, + // last + anchor ? anchor.previousSibling : parent.lastChild + ]; + } +}; +var TRANSITION = "transition"; +var ANIMATION = "animation"; +var vtcKey = Symbol("_vtc"); +var Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots); +Transition.displayName = "Transition"; +var DOMTransitionPropsValidators = { + name: String, + type: String, + css: { + type: Boolean, + default: true + }, + duration: [String, Number, Object], + enterFromClass: String, + enterActiveClass: String, + enterToClass: String, + appearFromClass: String, + appearActiveClass: String, + appearToClass: String, + leaveFromClass: String, + leaveActiveClass: String, + leaveToClass: String +}; +var TransitionPropsValidators = Transition.props = extend( + {}, + BaseTransitionPropsValidators, + DOMTransitionPropsValidators +); +var callHook2 = (hook, args = []) => { + if (isArray(hook)) { + hook.forEach((h2) => h2(...args)); + } else if (hook) { + hook(...args); + } +}; +var hasExplicitCallback = (hook) => { + return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false; +}; +function resolveTransitionProps(rawProps) { + const baseProps = {}; + for (const key in rawProps) { + if (!(key in DOMTransitionPropsValidators)) { + baseProps[key] = rawProps[key]; + } + } + if (rawProps.css === false) { + return baseProps; + } + const { + name = "v", + type, + duration, + enterFromClass = `${name}-enter-from`, + enterActiveClass = `${name}-enter-active`, + enterToClass = `${name}-enter-to`, + appearFromClass = enterFromClass, + appearActiveClass = enterActiveClass, + appearToClass = enterToClass, + leaveFromClass = `${name}-leave-from`, + leaveActiveClass = `${name}-leave-active`, + leaveToClass = `${name}-leave-to` + } = rawProps; + const durations = normalizeDuration(duration); + const enterDuration = durations && durations[0]; + const leaveDuration = durations && durations[1]; + const { + onBeforeEnter, + onEnter, + onEnterCancelled, + onLeave, + onLeaveCancelled, + onBeforeAppear = onBeforeEnter, + onAppear = onEnter, + onAppearCancelled = onEnterCancelled + } = baseProps; + const finishEnter = (el, isAppear, done) => { + removeTransitionClass(el, isAppear ? appearToClass : enterToClass); + removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass); + done && done(); + }; + const finishLeave = (el, done) => { + el._isLeaving = false; + removeTransitionClass(el, leaveFromClass); + removeTransitionClass(el, leaveToClass); + removeTransitionClass(el, leaveActiveClass); + done && done(); + }; + const makeEnterHook = (isAppear) => { + return (el, done) => { + const hook = isAppear ? onAppear : onEnter; + const resolve2 = () => finishEnter(el, isAppear, done); + callHook2(hook, [el, resolve2]); + nextFrame(() => { + removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass); + addTransitionClass(el, isAppear ? appearToClass : enterToClass); + if (!hasExplicitCallback(hook)) { + whenTransitionEnds(el, type, enterDuration, resolve2); + } + }); + }; + }; + return extend(baseProps, { + onBeforeEnter(el) { + callHook2(onBeforeEnter, [el]); + addTransitionClass(el, enterFromClass); + addTransitionClass(el, enterActiveClass); + }, + onBeforeAppear(el) { + callHook2(onBeforeAppear, [el]); + addTransitionClass(el, appearFromClass); + addTransitionClass(el, appearActiveClass); + }, + onEnter: makeEnterHook(false), + onAppear: makeEnterHook(true), + onLeave(el, done) { + el._isLeaving = true; + const resolve2 = () => finishLeave(el, done); + addTransitionClass(el, leaveFromClass); + addTransitionClass(el, leaveActiveClass); + forceReflow(); + nextFrame(() => { + if (!el._isLeaving) { + return; + } + removeTransitionClass(el, leaveFromClass); + addTransitionClass(el, leaveToClass); + if (!hasExplicitCallback(onLeave)) { + whenTransitionEnds(el, type, leaveDuration, resolve2); + } + }); + callHook2(onLeave, [el, resolve2]); + }, + onEnterCancelled(el) { + finishEnter(el, false); + callHook2(onEnterCancelled, [el]); + }, + onAppearCancelled(el) { + finishEnter(el, true); + callHook2(onAppearCancelled, [el]); + }, + onLeaveCancelled(el) { + finishLeave(el); + callHook2(onLeaveCancelled, [el]); + } + }); +} +function normalizeDuration(duration) { + if (duration == null) { + return null; + } else if (isObject(duration)) { + return [NumberOf(duration.enter), NumberOf(duration.leave)]; + } else { + const n = NumberOf(duration); + return [n, n]; + } +} +function NumberOf(val) { + const res = toNumber(val); + if (true) { + assertNumber(res, "<transition> explicit duration"); + } + return res; +} +function addTransitionClass(el, cls) { + cls.split(/\s+/).forEach((c) => c && el.classList.add(c)); + (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls); +} +function removeTransitionClass(el, cls) { + cls.split(/\s+/).forEach((c) => c && el.classList.remove(c)); + const _vtc = el[vtcKey]; + if (_vtc) { + _vtc.delete(cls); + if (!_vtc.size) { + el[vtcKey] = void 0; + } + } +} +function nextFrame(cb) { + requestAnimationFrame(() => { + requestAnimationFrame(cb); + }); +} +var endId = 0; +function whenTransitionEnds(el, expectedType, explicitTimeout, resolve2) { + const id = el._endId = ++endId; + const resolveIfNotStale = () => { + if (id === el._endId) { + resolve2(); + } + }; + if (explicitTimeout) { + return setTimeout(resolveIfNotStale, explicitTimeout); + } + const { type, timeout, propCount } = getTransitionInfo(el, expectedType); + if (!type) { + return resolve2(); + } + const endEvent = type + "end"; + let ended = 0; + const end = () => { + el.removeEventListener(endEvent, onEnd); + resolveIfNotStale(); + }; + const onEnd = (e) => { + if (e.target === el && ++ended >= propCount) { + end(); + } + }; + setTimeout(() => { + if (ended < propCount) { + end(); + } + }, timeout + 1); + el.addEventListener(endEvent, onEnd); +} +function getTransitionInfo(el, expectedType) { + const styles = window.getComputedStyle(el); + const getStyleProperties = (key) => (styles[key] || "").split(", "); + const transitionDelays = getStyleProperties(`${TRANSITION}Delay`); + const transitionDurations = getStyleProperties(`${TRANSITION}Duration`); + const transitionTimeout = getTimeout(transitionDelays, transitionDurations); + const animationDelays = getStyleProperties(`${ANIMATION}Delay`); + const animationDurations = getStyleProperties(`${ANIMATION}Duration`); + const animationTimeout = getTimeout(animationDelays, animationDurations); + let type = null; + let timeout = 0; + let propCount = 0; + if (expectedType === TRANSITION) { + if (transitionTimeout > 0) { + type = TRANSITION; + timeout = transitionTimeout; + propCount = transitionDurations.length; + } + } else if (expectedType === ANIMATION) { + if (animationTimeout > 0) { + type = ANIMATION; + timeout = animationTimeout; + propCount = animationDurations.length; + } + } else { + timeout = Math.max(transitionTimeout, animationTimeout); + type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null; + propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0; + } + const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/.test( + getStyleProperties(`${TRANSITION}Property`).toString() + ); + return { + type, + timeout, + propCount, + hasTransform + }; +} +function getTimeout(delays, durations) { + while (delays.length < durations.length) { + delays = delays.concat(delays); + } + return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i]))); +} +function toMs(s) { + if (s === "auto") return 0; + return Number(s.slice(0, -1).replace(",", ".")) * 1e3; +} +function forceReflow() { + return document.body.offsetHeight; +} +function patchClass(el, value, isSVG) { + const transitionClasses = el[vtcKey]; + if (transitionClasses) { + value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" "); + } + if (value == null) { + el.removeAttribute("class"); + } else if (isSVG) { + el.setAttribute("class", value); + } else { + el.className = value; + } +} +var vShowOriginalDisplay = Symbol("_vod"); +var vShowHidden = Symbol("_vsh"); +var vShow = { + beforeMount(el, { value }, { transition }) { + el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display; + if (transition && value) { + transition.beforeEnter(el); + } else { + setDisplay(el, value); + } + }, + mounted(el, { value }, { transition }) { + if (transition && value) { + transition.enter(el); + } + }, + updated(el, { value, oldValue }, { transition }) { + if (!value === !oldValue) return; + if (transition) { + if (value) { + transition.beforeEnter(el); + setDisplay(el, true); + transition.enter(el); + } else { + transition.leave(el, () => { + setDisplay(el, false); + }); + } + } else { + setDisplay(el, value); + } + }, + beforeUnmount(el, { value }) { + setDisplay(el, value); + } +}; +if (true) { + vShow.name = "show"; +} +function setDisplay(el, value) { + el.style.display = value ? el[vShowOriginalDisplay] : "none"; + el[vShowHidden] = !value; +} +function initVShowForSSR() { + vShow.getSSRProps = ({ value }) => { + if (!value) { + return { style: { display: "none" } }; + } + }; +} +var CSS_VAR_TEXT = Symbol(true ? "CSS_VAR_TEXT" : ""); +function useCssVars(getter) { + const instance = getCurrentInstance(); + if (!instance) { + warn2(`useCssVars is called without current active component instance.`); + return; + } + const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => { + Array.from( + document.querySelectorAll(`[data-v-owner="${instance.uid}"]`) + ).forEach((node) => setVarsOnNode(node, vars)); + }; + if (true) { + instance.getCssVars = () => getter(instance.proxy); + } + const setVars = () => { + const vars = getter(instance.proxy); + setVarsOnVNode(instance.subTree, vars); + updateTeleports(vars); + }; + onBeforeMount(() => { + watchPostEffect(setVars); + }); + onMounted(() => { + const ob = new MutationObserver(setVars); + ob.observe(instance.subTree.el.parentNode, { childList: true }); + onUnmounted(() => ob.disconnect()); + }); +} +function setVarsOnVNode(vnode, vars) { + if (vnode.shapeFlag & 128) { + const suspense = vnode.suspense; + vnode = suspense.activeBranch; + if (suspense.pendingBranch && !suspense.isHydrating) { + suspense.effects.push(() => { + setVarsOnVNode(suspense.activeBranch, vars); + }); + } + } + while (vnode.component) { + vnode = vnode.component.subTree; + } + if (vnode.shapeFlag & 1 && vnode.el) { + setVarsOnNode(vnode.el, vars); + } else if (vnode.type === Fragment) { + vnode.children.forEach((c) => setVarsOnVNode(c, vars)); + } else if (vnode.type === Static) { + let { el, anchor } = vnode; + while (el) { + setVarsOnNode(el, vars); + if (el === anchor) break; + el = el.nextSibling; + } + } +} +function setVarsOnNode(el, vars) { + if (el.nodeType === 1) { + const style = el.style; + let cssText = ""; + for (const key in vars) { + style.setProperty(`--${key}`, vars[key]); + cssText += `--${key}: ${vars[key]};`; + } + style[CSS_VAR_TEXT] = cssText; + } +} +var displayRE = /(^|;)\s*display\s*:/; +function patchStyle(el, prev, next) { + const style = el.style; + const isCssString = isString(next); + let hasControlledDisplay = false; + if (next && !isCssString) { + if (prev) { + if (!isString(prev)) { + for (const key in prev) { + if (next[key] == null) { + setStyle(style, key, ""); + } + } + } else { + for (const prevStyle of prev.split(";")) { + const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim(); + if (next[key] == null) { + setStyle(style, key, ""); + } + } + } + } + for (const key in next) { + if (key === "display") { + hasControlledDisplay = true; + } + setStyle(style, key, next[key]); + } + } else { + if (isCssString) { + if (prev !== next) { + const cssVarText = style[CSS_VAR_TEXT]; + if (cssVarText) { + next += ";" + cssVarText; + } + style.cssText = next; + hasControlledDisplay = displayRE.test(next); + } + } else if (prev) { + el.removeAttribute("style"); + } + } + if (vShowOriginalDisplay in el) { + el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : ""; + if (el[vShowHidden]) { + style.display = "none"; + } + } +} +var semicolonRE = /[^\\];\s*$/; +var importantRE = /\s*!important$/; +function setStyle(style, name, val) { + if (isArray(val)) { + val.forEach((v) => setStyle(style, name, v)); + } else { + if (val == null) val = ""; + if (true) { + if (semicolonRE.test(val)) { + warn2( + `Unexpected semicolon at the end of '${name}' style value: '${val}'` + ); + } + } + if (name.startsWith("--")) { + style.setProperty(name, val); + } else { + const prefixed = autoPrefix(style, name); + if (importantRE.test(val)) { + style.setProperty( + hyphenate(prefixed), + val.replace(importantRE, ""), + "important" + ); + } else { + style[prefixed] = val; + } + } + } +} +var prefixes = ["Webkit", "Moz", "ms"]; +var prefixCache = {}; +function autoPrefix(style, rawName) { + const cached = prefixCache[rawName]; + if (cached) { + return cached; + } + let name = camelize(rawName); + if (name !== "filter" && name in style) { + return prefixCache[rawName] = name; + } + name = capitalize(name); + for (let i = 0; i < prefixes.length; i++) { + const prefixed = prefixes[i] + name; + if (prefixed in style) { + return prefixCache[rawName] = prefixed; + } + } + return rawName; +} +var xlinkNS = "http://www.w3.org/1999/xlink"; +function patchAttr(el, key, value, isSVG, instance, isBoolean2 = isSpecialBooleanAttr(key)) { + if (isSVG && key.startsWith("xlink:")) { + if (value == null) { + el.removeAttributeNS(xlinkNS, key.slice(6, key.length)); + } else { + el.setAttributeNS(xlinkNS, key, value); + } + } else { + if (value == null || isBoolean2 && !includeBooleanAttr(value)) { + el.removeAttribute(key); + } else { + el.setAttribute( + key, + isBoolean2 ? "" : isSymbol(value) ? String(value) : value + ); + } + } +} +function patchDOMProp(el, key, value, parentComponent) { + if (key === "innerHTML" || key === "textContent") { + if (value == null) return; + el[key] = value; + return; + } + const tag = el.tagName; + if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally + !tag.includes("-")) { + const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value; + const newValue = value == null ? "" : String(value); + if (oldValue !== newValue || !("_value" in el)) { + el.value = newValue; + } + if (value == null) { + el.removeAttribute(key); + } + el._value = value; + return; + } + let needRemove = false; + if (value === "" || value == null) { + const type = typeof el[key]; + if (type === "boolean") { + value = includeBooleanAttr(value); + } else if (value == null && type === "string") { + value = ""; + needRemove = true; + } else if (type === "number") { + value = 0; + needRemove = true; + } + } + try { + el[key] = value; + } catch (e) { + if (!needRemove) { + warn2( + `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`, + e + ); + } + } + needRemove && el.removeAttribute(key); +} +function addEventListener(el, event, handler, options) { + el.addEventListener(event, handler, options); +} +function removeEventListener(el, event, handler, options) { + el.removeEventListener(event, handler, options); +} +var veiKey = Symbol("_vei"); +function patchEvent(el, rawName, prevValue, nextValue, instance = null) { + const invokers = el[veiKey] || (el[veiKey] = {}); + const existingInvoker = invokers[rawName]; + if (nextValue && existingInvoker) { + existingInvoker.value = true ? sanitizeEventValue(nextValue, rawName) : nextValue; + } else { + const [name, options] = parseName(rawName); + if (nextValue) { + const invoker = invokers[rawName] = createInvoker( + true ? sanitizeEventValue(nextValue, rawName) : nextValue, + instance + ); + addEventListener(el, name, invoker, options); + } else if (existingInvoker) { + removeEventListener(el, name, existingInvoker, options); + invokers[rawName] = void 0; + } + } +} +var optionsModifierRE = /(?:Once|Passive|Capture)$/; +function parseName(name) { + let options; + if (optionsModifierRE.test(name)) { + options = {}; + let m; + while (m = name.match(optionsModifierRE)) { + name = name.slice(0, name.length - m[0].length); + options[m[0].toLowerCase()] = true; + } + } + const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2)); + return [event, options]; +} +var cachedNow = 0; +var p = Promise.resolve(); +var getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now()); +function createInvoker(initialValue, instance) { + const invoker = (e) => { + if (!e._vts) { + e._vts = Date.now(); + } else if (e._vts <= invoker.attached) { + return; + } + callWithAsyncErrorHandling( + patchStopImmediatePropagation(e, invoker.value), + instance, + 5, + [e] + ); + }; + invoker.value = initialValue; + invoker.attached = getNow(); + return invoker; +} +function sanitizeEventValue(value, propName) { + if (isFunction(value) || isArray(value)) { + return value; + } + warn2( + `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop? +Expected function or array of functions, received type ${typeof value}.` + ); + return NOOP; +} +function patchStopImmediatePropagation(e, value) { + if (isArray(value)) { + const originalStop = e.stopImmediatePropagation; + e.stopImmediatePropagation = () => { + originalStop.call(e); + e._stopped = true; + }; + return value.map( + (fn) => (e2) => !e2._stopped && fn && fn(e2) + ); + } else { + return value; + } +} +var isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter +key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123; +var patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => { + const isSVG = namespace === "svg"; + if (key === "class") { + patchClass(el, nextValue, isSVG); + } else if (key === "style") { + patchStyle(el, prevValue, nextValue); + } else if (isOn(key)) { + if (!isModelListener(key)) { + patchEvent(el, key, prevValue, nextValue, parentComponent); + } + } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) { + patchDOMProp(el, key, nextValue); + if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) { + patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value"); + } + } else { + if (key === "true-value") { + el._trueValue = nextValue; + } else if (key === "false-value") { + el._falseValue = nextValue; + } + patchAttr(el, key, nextValue, isSVG); + } +}; +function shouldSetAsProp(el, key, value, isSVG) { + if (isSVG) { + if (key === "innerHTML" || key === "textContent") { + return true; + } + if (key in el && isNativeOn(key) && isFunction(value)) { + return true; + } + return false; + } + if (key === "spellcheck" || key === "draggable" || key === "translate") { + return false; + } + if (key === "form") { + return false; + } + if (key === "list" && el.tagName === "INPUT") { + return false; + } + if (key === "type" && el.tagName === "TEXTAREA") { + return false; + } + if (key === "width" || key === "height") { + const tag = el.tagName; + if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") { + return false; + } + } + if (isNativeOn(key) && isString(value)) { + return false; + } + return key in el; +} +function defineCustomElement(options, extraOptions, hydrate2) { + const Comp = defineComponent(options, extraOptions); + class VueCustomElement extends VueElement { + constructor(initialProps) { + super(Comp, initialProps, hydrate2); + } + } + VueCustomElement.def = Comp; + return VueCustomElement; +} +var defineSSRCustomElement = (options, extraOptions) => { + return defineCustomElement(options, extraOptions, hydrate); +}; +var BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class { +}; +var VueElement = class _VueElement extends BaseClass { + constructor(_def, _props = {}, hydrate2) { + super(); + this._def = _def; + this._props = _props; + this._instance = null; + this._connected = false; + this._resolved = false; + this._numberProps = null; + this._ob = null; + if (this.shadowRoot && hydrate2) { + hydrate2(this._createVNode(), this.shadowRoot); + } else { + if (this.shadowRoot) { + warn2( + `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.` + ); + } + this.attachShadow({ mode: "open" }); + if (!this._def.__asyncLoader) { + this._resolveProps(this._def); + } + } + } + connectedCallback() { + this._connected = true; + if (!this._instance) { + if (this._resolved) { + this._update(); + } else { + this._resolveDef(); + } + } + } + disconnectedCallback() { + this._connected = false; + nextTick(() => { + if (!this._connected) { + if (this._ob) { + this._ob.disconnect(); + this._ob = null; + } + render(null, this.shadowRoot); + this._instance = null; + } + }); + } + /** + * resolve inner component definition (handle possible async component) + */ + _resolveDef() { + this._resolved = true; + for (let i = 0; i < this.attributes.length; i++) { + this._setAttr(this.attributes[i].name); + } + this._ob = new MutationObserver((mutations) => { + for (const m of mutations) { + this._setAttr(m.attributeName); + } + }); + this._ob.observe(this, { attributes: true }); + const resolve2 = (def2, isAsync = false) => { + const { props, styles } = def2; + let numberProps; + if (props && !isArray(props)) { + for (const key in props) { + const opt = props[key]; + if (opt === Number || opt && opt.type === Number) { + if (key in this._props) { + this._props[key] = toNumber(this._props[key]); + } + (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize(key)] = true; + } + } + } + this._numberProps = numberProps; + if (isAsync) { + this._resolveProps(def2); + } + this._applyStyles(styles); + this._update(); + }; + const asyncDef = this._def.__asyncLoader; + if (asyncDef) { + asyncDef().then((def2) => resolve2(def2, true)); + } else { + resolve2(this._def); + } + } + _resolveProps(def2) { + const { props } = def2; + const declaredPropKeys = isArray(props) ? props : Object.keys(props || {}); + for (const key of Object.keys(this)) { + if (key[0] !== "_" && declaredPropKeys.includes(key)) { + this._setProp(key, this[key], true, false); + } + } + for (const key of declaredPropKeys.map(camelize)) { + Object.defineProperty(this, key, { + get() { + return this._getProp(key); + }, + set(val) { + this._setProp(key, val); + } + }); + } + } + _setAttr(key) { + let value = this.hasAttribute(key) ? this.getAttribute(key) : void 0; + const camelKey = camelize(key); + if (this._numberProps && this._numberProps[camelKey]) { + value = toNumber(value); + } + this._setProp(camelKey, value, false); + } + /** + * @internal + */ + _getProp(key) { + return this._props[key]; + } + /** + * @internal + */ + _setProp(key, val, shouldReflect = true, shouldUpdate = true) { + if (val !== this._props[key]) { + this._props[key] = val; + if (shouldUpdate && this._instance) { + this._update(); + } + if (shouldReflect) { + if (val === true) { + this.setAttribute(hyphenate(key), ""); + } else if (typeof val === "string" || typeof val === "number") { + this.setAttribute(hyphenate(key), val + ""); + } else if (!val) { + this.removeAttribute(hyphenate(key)); + } + } + } + } + _update() { + render(this._createVNode(), this.shadowRoot); + } + _createVNode() { + const vnode = createVNode(this._def, extend({}, this._props)); + if (!this._instance) { + vnode.ce = (instance) => { + this._instance = instance; + instance.isCE = true; + if (true) { + instance.ceReload = (newStyles) => { + if (this._styles) { + this._styles.forEach((s) => this.shadowRoot.removeChild(s)); + this._styles.length = 0; + } + this._applyStyles(newStyles); + this._instance = null; + this._update(); + }; + } + const dispatch = (event, args) => { + this.dispatchEvent( + new CustomEvent(event, { + detail: args + }) + ); + }; + instance.emit = (event, ...args) => { + dispatch(event, args); + if (hyphenate(event) !== event) { + dispatch(hyphenate(event), args); + } + }; + let parent = this; + while (parent = parent && (parent.parentNode || parent.host)) { + if (parent instanceof _VueElement) { + instance.parent = parent._instance; + instance.provides = parent._instance.provides; + break; + } + } + }; + } + return vnode; + } + _applyStyles(styles) { + if (styles) { + styles.forEach((css) => { + const s = document.createElement("style"); + s.textContent = css; + this.shadowRoot.appendChild(s); + if (true) { + (this._styles || (this._styles = [])).push(s); + } + }); + } + } +}; +function useCssModule(name = "$style") { + { + const instance = getCurrentInstance(); + if (!instance) { + warn2(`useCssModule must be called inside setup()`); + return EMPTY_OBJ; + } + const modules = instance.type.__cssModules; + if (!modules) { + warn2(`Current instance does not have CSS modules injected.`); + return EMPTY_OBJ; + } + const mod = modules[name]; + if (!mod) { + warn2(`Current instance does not have CSS module named "${name}".`); + return EMPTY_OBJ; + } + return mod; + } +} +var positionMap = /* @__PURE__ */ new WeakMap(); +var newPositionMap = /* @__PURE__ */ new WeakMap(); +var moveCbKey = Symbol("_moveCb"); +var enterCbKey2 = Symbol("_enterCb"); +var TransitionGroupImpl = { + name: "TransitionGroup", + props: extend({}, TransitionPropsValidators, { + tag: String, + moveClass: String + }), + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + let prevChildren; + let children; + onUpdated(() => { + if (!prevChildren.length) { + return; + } + const moveClass = props.moveClass || `${props.name || "v"}-move`; + if (!hasCSSTransform( + prevChildren[0].el, + instance.vnode.el, + moveClass + )) { + return; + } + prevChildren.forEach(callPendingCbs); + prevChildren.forEach(recordPosition); + const movedChildren = prevChildren.filter(applyTranslation); + forceReflow(); + movedChildren.forEach((c) => { + const el = c.el; + const style = el.style; + addTransitionClass(el, moveClass); + style.transform = style.webkitTransform = style.transitionDuration = ""; + const cb = el[moveCbKey] = (e) => { + if (e && e.target !== el) { + return; + } + if (!e || /transform$/.test(e.propertyName)) { + el.removeEventListener("transitionend", cb); + el[moveCbKey] = null; + removeTransitionClass(el, moveClass); + } + }; + el.addEventListener("transitionend", cb); + }); + }); + return () => { + const rawProps = toRaw(props); + const cssTransitionProps = resolveTransitionProps(rawProps); + let tag = rawProps.tag || Fragment; + prevChildren = []; + if (children) { + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.el && child.el instanceof Element) { + prevChildren.push(child); + setTransitionHooks( + child, + resolveTransitionHooks( + child, + cssTransitionProps, + state, + instance + ) + ); + positionMap.set( + child, + child.el.getBoundingClientRect() + ); + } + } + } + children = slots.default ? getTransitionRawChildren(slots.default()) : []; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.key != null) { + setTransitionHooks( + child, + resolveTransitionHooks(child, cssTransitionProps, state, instance) + ); + } else if (true) { + warn2(`<TransitionGroup> children must be keyed.`); + } + } + return createVNode(tag, null, children); + }; + } +}; +var removeMode = (props) => delete props.mode; +removeMode(TransitionGroupImpl.props); +var TransitionGroup = TransitionGroupImpl; +function callPendingCbs(c) { + const el = c.el; + if (el[moveCbKey]) { + el[moveCbKey](); + } + if (el[enterCbKey2]) { + el[enterCbKey2](); + } +} +function recordPosition(c) { + newPositionMap.set(c, c.el.getBoundingClientRect()); +} +function applyTranslation(c) { + const oldPos = positionMap.get(c); + const newPos = newPositionMap.get(c); + const dx = oldPos.left - newPos.left; + const dy = oldPos.top - newPos.top; + if (dx || dy) { + const s = c.el.style; + s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`; + s.transitionDuration = "0s"; + return c; + } +} +function hasCSSTransform(el, root, moveClass) { + const clone = el.cloneNode(); + const _vtc = el[vtcKey]; + if (_vtc) { + _vtc.forEach((cls) => { + cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c)); + }); + } + moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c)); + clone.style.display = "none"; + const container = root.nodeType === 1 ? root : root.parentNode; + container.appendChild(clone); + const { hasTransform } = getTransitionInfo(clone); + container.removeChild(clone); + return hasTransform; +} +var getModelAssigner = (vnode) => { + const fn = vnode.props["onUpdate:modelValue"] || false; + return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn; +}; +function onCompositionStart(e) { + e.target.composing = true; +} +function onCompositionEnd(e) { + const target = e.target; + if (target.composing) { + target.composing = false; + target.dispatchEvent(new Event("input")); + } +} +var assignKey = Symbol("_assign"); +var vModelText = { + created(el, { modifiers: { lazy, trim, number } }, vnode) { + el[assignKey] = getModelAssigner(vnode); + const castToNumber = number || vnode.props && vnode.props.type === "number"; + addEventListener(el, lazy ? "change" : "input", (e) => { + if (e.target.composing) return; + let domValue = el.value; + if (trim) { + domValue = domValue.trim(); + } + if (castToNumber) { + domValue = looseToNumber(domValue); + } + el[assignKey](domValue); + }); + if (trim) { + addEventListener(el, "change", () => { + el.value = el.value.trim(); + }); + } + if (!lazy) { + addEventListener(el, "compositionstart", onCompositionStart); + addEventListener(el, "compositionend", onCompositionEnd); + addEventListener(el, "change", onCompositionEnd); + } + }, + // set value on mounted so it's after min/max for type="range" + mounted(el, { value }) { + el.value = value == null ? "" : value; + }, + beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) { + el[assignKey] = getModelAssigner(vnode); + if (el.composing) return; + const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? looseToNumber(el.value) : el.value; + const newValue = value == null ? "" : value; + if (elValue === newValue) { + return; + } + if (document.activeElement === el && el.type !== "range") { + if (lazy && value === oldValue) { + return; + } + if (trim && el.value.trim() === newValue) { + return; + } + } + el.value = newValue; + } +}; +var vModelCheckbox = { + // #4096 array checkboxes need to be deep traversed + deep: true, + created(el, _, vnode) { + el[assignKey] = getModelAssigner(vnode); + addEventListener(el, "change", () => { + const modelValue = el._modelValue; + const elementValue = getValue(el); + const checked = el.checked; + const assign = el[assignKey]; + if (isArray(modelValue)) { + const index = looseIndexOf(modelValue, elementValue); + const found = index !== -1; + if (checked && !found) { + assign(modelValue.concat(elementValue)); + } else if (!checked && found) { + const filtered = [...modelValue]; + filtered.splice(index, 1); + assign(filtered); + } + } else if (isSet(modelValue)) { + const cloned = new Set(modelValue); + if (checked) { + cloned.add(elementValue); + } else { + cloned.delete(elementValue); + } + assign(cloned); + } else { + assign(getCheckboxValue(el, checked)); + } + }); + }, + // set initial checked on mount to wait for true-value/false-value + mounted: setChecked, + beforeUpdate(el, binding, vnode) { + el[assignKey] = getModelAssigner(vnode); + setChecked(el, binding, vnode); + } +}; +function setChecked(el, { value, oldValue }, vnode) { + el._modelValue = value; + if (isArray(value)) { + el.checked = looseIndexOf(value, vnode.props.value) > -1; + } else if (isSet(value)) { + el.checked = value.has(vnode.props.value); + } else if (value !== oldValue) { + el.checked = looseEqual(value, getCheckboxValue(el, true)); + } +} +var vModelRadio = { + created(el, { value }, vnode) { + el.checked = looseEqual(value, vnode.props.value); + el[assignKey] = getModelAssigner(vnode); + addEventListener(el, "change", () => { + el[assignKey](getValue(el)); + }); + }, + beforeUpdate(el, { value, oldValue }, vnode) { + el[assignKey] = getModelAssigner(vnode); + if (value !== oldValue) { + el.checked = looseEqual(value, vnode.props.value); + } + } +}; +var vModelSelect = { + // <select multiple> value need to be deep traversed + deep: true, + created(el, { value, modifiers: { number } }, vnode) { + const isSetModel = isSet(value); + addEventListener(el, "change", () => { + const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map( + (o) => number ? looseToNumber(getValue(o)) : getValue(o) + ); + el[assignKey]( + el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0] + ); + el._assigning = true; + nextTick(() => { + el._assigning = false; + }); + }); + el[assignKey] = getModelAssigner(vnode); + }, + // set value in mounted & updated because <select> relies on its children + // <option>s. + mounted(el, { value, modifiers: { number } }) { + setSelected(el, value); + }, + beforeUpdate(el, _binding, vnode) { + el[assignKey] = getModelAssigner(vnode); + }, + updated(el, { value, modifiers: { number } }) { + if (!el._assigning) { + setSelected(el, value); + } + } +}; +function setSelected(el, value, number) { + const isMultiple = el.multiple; + const isArrayValue = isArray(value); + if (isMultiple && !isArrayValue && !isSet(value)) { + warn2( + `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.` + ); + return; + } + for (let i = 0, l = el.options.length; i < l; i++) { + const option = el.options[i]; + const optionValue = getValue(option); + if (isMultiple) { + if (isArrayValue) { + const optionType = typeof optionValue; + if (optionType === "string" || optionType === "number") { + option.selected = value.some((v) => String(v) === String(optionValue)); + } else { + option.selected = looseIndexOf(value, optionValue) > -1; + } + } else { + option.selected = value.has(optionValue); + } + } else if (looseEqual(getValue(option), value)) { + if (el.selectedIndex !== i) el.selectedIndex = i; + return; + } + } + if (!isMultiple && el.selectedIndex !== -1) { + el.selectedIndex = -1; + } +} +function getValue(el) { + return "_value" in el ? el._value : el.value; +} +function getCheckboxValue(el, checked) { + const key = checked ? "_trueValue" : "_falseValue"; + return key in el ? el[key] : checked; +} +var vModelDynamic = { + created(el, binding, vnode) { + callModelHook(el, binding, vnode, null, "created"); + }, + mounted(el, binding, vnode) { + callModelHook(el, binding, vnode, null, "mounted"); + }, + beforeUpdate(el, binding, vnode, prevVNode) { + callModelHook(el, binding, vnode, prevVNode, "beforeUpdate"); + }, + updated(el, binding, vnode, prevVNode) { + callModelHook(el, binding, vnode, prevVNode, "updated"); + } +}; +function resolveDynamicModel(tagName, type) { + switch (tagName) { + case "SELECT": + return vModelSelect; + case "TEXTAREA": + return vModelText; + default: + switch (type) { + case "checkbox": + return vModelCheckbox; + case "radio": + return vModelRadio; + default: + return vModelText; + } + } +} +function callModelHook(el, binding, vnode, prevVNode, hook) { + const modelToUse = resolveDynamicModel( + el.tagName, + vnode.props && vnode.props.type + ); + const fn = modelToUse[hook]; + fn && fn(el, binding, vnode, prevVNode); +} +function initVModelForSSR() { + vModelText.getSSRProps = ({ value }) => ({ value }); + vModelRadio.getSSRProps = ({ value }, vnode) => { + if (vnode.props && looseEqual(vnode.props.value, value)) { + return { checked: true }; + } + }; + vModelCheckbox.getSSRProps = ({ value }, vnode) => { + if (isArray(value)) { + if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) { + return { checked: true }; + } + } else if (isSet(value)) { + if (vnode.props && value.has(vnode.props.value)) { + return { checked: true }; + } + } else if (value) { + return { checked: true }; + } + }; + vModelDynamic.getSSRProps = (binding, vnode) => { + if (typeof vnode.type !== "string") { + return; + } + const modelToUse = resolveDynamicModel( + // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase + vnode.type.toUpperCase(), + vnode.props && vnode.props.type + ); + if (modelToUse.getSSRProps) { + return modelToUse.getSSRProps(binding, vnode); + } + }; +} +var systemModifiers = ["ctrl", "shift", "alt", "meta"]; +var modifierGuards = { + stop: (e) => e.stopPropagation(), + prevent: (e) => e.preventDefault(), + self: (e) => e.target !== e.currentTarget, + ctrl: (e) => !e.ctrlKey, + shift: (e) => !e.shiftKey, + alt: (e) => !e.altKey, + meta: (e) => !e.metaKey, + left: (e) => "button" in e && e.button !== 0, + middle: (e) => "button" in e && e.button !== 1, + right: (e) => "button" in e && e.button !== 2, + exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m)) +}; +var withModifiers = (fn, modifiers) => { + const cache = fn._withMods || (fn._withMods = {}); + const cacheKey = modifiers.join("."); + return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => { + for (let i = 0; i < modifiers.length; i++) { + const guard = modifierGuards[modifiers[i]]; + if (guard && guard(event, modifiers)) return; + } + return fn(event, ...args); + }); +}; +var keyNames = { + esc: "escape", + space: " ", + up: "arrow-up", + left: "arrow-left", + right: "arrow-right", + down: "arrow-down", + delete: "backspace" +}; +var withKeys = (fn, modifiers) => { + const cache = fn._withKeys || (fn._withKeys = {}); + const cacheKey = modifiers.join("."); + return cache[cacheKey] || (cache[cacheKey] = (event) => { + if (!("key" in event)) { + return; + } + const eventKey = hyphenate(event.key); + if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) { + return fn(event); + } + }); +}; +var rendererOptions = extend({ patchProp }, nodeOps); +var renderer; +var enabledHydration = false; +function ensureRenderer() { + return renderer || (renderer = createRenderer(rendererOptions)); +} +function ensureHydrationRenderer() { + renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions); + enabledHydration = true; + return renderer; +} +var render = (...args) => { + ensureRenderer().render(...args); +}; +var hydrate = (...args) => { + ensureHydrationRenderer().hydrate(...args); +}; +var createApp = (...args) => { + const app = ensureRenderer().createApp(...args); + if (true) { + injectNativeTagCheck(app); + injectCompilerOptionsCheck(app); + } + const { mount } = app; + app.mount = (containerOrSelector) => { + const container = normalizeContainer(containerOrSelector); + if (!container) return; + const component = app._component; + if (!isFunction(component) && !component.render && !component.template) { + component.template = container.innerHTML; + } + container.innerHTML = ""; + const proxy = mount(container, false, resolveRootNamespace(container)); + if (container instanceof Element) { + container.removeAttribute("v-cloak"); + container.setAttribute("data-v-app", ""); + } + return proxy; + }; + return app; +}; +var createSSRApp = (...args) => { + const app = ensureHydrationRenderer().createApp(...args); + if (true) { + injectNativeTagCheck(app); + injectCompilerOptionsCheck(app); + } + const { mount } = app; + app.mount = (containerOrSelector) => { + const container = normalizeContainer(containerOrSelector); + if (container) { + return mount(container, true, resolveRootNamespace(container)); + } + }; + return app; +}; +function resolveRootNamespace(container) { + if (container instanceof SVGElement) { + return "svg"; + } + if (typeof MathMLElement === "function" && container instanceof MathMLElement) { + return "mathml"; + } +} +function injectNativeTagCheck(app) { + Object.defineProperty(app.config, "isNativeTag", { + value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag), + writable: false + }); +} +function injectCompilerOptionsCheck(app) { + if (isRuntimeOnly()) { + const isCustomElement = app.config.isCustomElement; + Object.defineProperty(app.config, "isCustomElement", { + get() { + return isCustomElement; + }, + set() { + warn2( + `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.` + ); + } + }); + const compilerOptions = app.config.compilerOptions; + const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead. +- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option. +- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader +- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`; + Object.defineProperty(app.config, "compilerOptions", { + get() { + warn2(msg); + return compilerOptions; + }, + set() { + warn2(msg); + } + }); + } +} +function normalizeContainer(container) { + if (isString(container)) { + const res = document.querySelector(container); + if (!res) { + warn2( + `Failed to mount app: mount target selector "${container}" returned null.` + ); + } + return res; + } + if (window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") { + warn2( + `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs` + ); + } + return container; +} +var ssrDirectiveInitialized = false; +var initDirectivesForSSR = () => { + if (!ssrDirectiveInitialized) { + ssrDirectiveInitialized = true; + initVModelForSSR(); + initVShowForSSR(); + } +}; + +// node_modules/vue/dist/vue.runtime.esm-bundler.js +function initDev() { + { + initCustomFormatter(); + } +} +if (true) { + initDev(); +} +var compile2 = () => { + if (true) { + warn2( + `Runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".` + ); + } +}; + +export { + camelize, + capitalize, + toHandlerKey, + normalizeStyle, + normalizeClass, + normalizeProps, + toDisplayString, + EffectScope, + effectScope, + getCurrentScope, + onScopeDispose, + ReactiveEffect, + effect, + stop, + reactive, + shallowReactive, + readonly, + shallowReadonly, + isReactive, + isReadonly, + isShallow, + isProxy, + toRaw, + markRaw, + isRef2 as isRef, + ref, + shallowRef, + triggerRef, + unref, + toValue, + proxyRefs, + customRef, + toRefs, + toRef, + TrackOpTypes, + TriggerOpTypes, + assertNumber, + ErrorCodes, + callWithErrorHandling, + callWithAsyncErrorHandling, + handleError, + nextTick, + queuePostFlushCb, + pushScopeId, + popScopeId, + withScopeId, + withCtx, + withDirectives, + useTransitionState, + BaseTransitionPropsValidators, + BaseTransition, + resolveTransitionHooks, + setTransitionHooks, + getTransitionRawChildren, + defineComponent, + defineAsyncComponent, + KeepAlive, + onActivated, + onDeactivated, + onBeforeMount, + onMounted, + onBeforeUpdate, + onUpdated, + onBeforeUnmount, + onUnmounted, + onServerPrefetch, + onRenderTriggered, + onRenderTracked, + onErrorCaptured, + resolveComponent, + resolveDynamicComponent, + resolveDirective, + renderList, + createSlots, + renderSlot, + toHandlers, + defineProps, + defineEmits, + defineExpose, + defineOptions, + defineSlots, + defineModel, + withDefaults, + useSlots, + useAttrs, + mergeDefaults, + mergeModels, + createPropsRestProxy, + withAsyncContext, + provide, + inject, + hasInjectionContext, + Teleport, + createRenderer, + createHydrationRenderer, + ssrContextKey, + useSSRContext, + watchEffect, + watchPostEffect, + watchSyncEffect, + watch, + useModel, + Suspense, + Fragment, + Text, + Comment, + Static, + openBlock, + setBlockTracking, + createElementBlock, + createBlock, + isVNode, + transformVNodeArgs, + createBaseVNode, + createVNode, + guardReactiveProps, + cloneVNode, + createTextVNode, + createStaticVNode, + createCommentVNode, + mergeProps, + getCurrentInstance, + registerRuntimeCompiler, + isRuntimeOnly, + computed2 as computed, + h, + initCustomFormatter, + withMemo, + isMemoSame, + version, + warn2 as warn, + ErrorTypeStrings, + devtools, + setDevtoolsHook, + ssrUtils, + resolveFilter, + compatUtils, + DeprecationTypes, + Transition, + vShow, + useCssVars, + defineCustomElement, + defineSSRCustomElement, + VueElement, + useCssModule, + TransitionGroup, + vModelText, + vModelCheckbox, + vModelRadio, + vModelSelect, + vModelDynamic, + withModifiers, + withKeys, + render, + hydrate, + createApp, + createSSRApp, + initDirectivesForSSR, + compile2 as compile +}; +/*! Bundled license information: + +@vue/shared/dist/shared.esm-bundler.js: + (** + * @vue/shared v3.4.38 + * (c) 2018-present Yuxi (Evan) You and Vue contributors + * @license MIT + **) + (*! #__NO_SIDE_EFFECTS__ *) + +@vue/reactivity/dist/reactivity.esm-bundler.js: + (** + * @vue/reactivity v3.4.38 + * (c) 2018-present Yuxi (Evan) You and Vue contributors + * @license MIT + **) + +@vue/runtime-core/dist/runtime-core.esm-bundler.js: + (** + * @vue/runtime-core v3.4.38 + * (c) 2018-present Yuxi (Evan) You and Vue contributors + * @license MIT + **) + (*! #__NO_SIDE_EFFECTS__ *) + +@vue/runtime-dom/dist/runtime-dom.esm-bundler.js: + (** + * @vue/runtime-dom v3.4.38 + * (c) 2018-present Yuxi (Evan) You and Vue contributors + * @license MIT + **) + (*! #__NO_SIDE_EFFECTS__ *) + +vue/dist/vue.runtime.esm-bundler.js: + (** + * vue v3.4.38 + * (c) 2018-present Yuxi (Evan) You and Vue contributors + * @license MIT + **) +*/ +//# sourceMappingURL=chunk-PAUCAATC.js.map diff --git a/src/.vuepress/.cache/deps/chunk-PAUCAATC.js.map b/src/.vuepress/.cache/deps/chunk-PAUCAATC.js.map new file mode 100644 index 000000000..391fff15d --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-PAUCAATC.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/@vue/shared/dist/shared.esm-bundler.js", "../../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js", "../../../../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js", "../../../../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js", "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js"], + "sourcesContent": ["/**\n* @vue/shared v3.4.38\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str, expectsLowerCase) {\n const set = new Set(str.split(\",\"));\n return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction((str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n});\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"HOISTED\": -1,\n \"-1\": \"HOISTED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n let ret = \"\";\n if (!styles || isString(styles)) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n return src.replace(commentStripRE, \"\");\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val.__v_isRef === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n", "/**\n* @vue/reactivity v3.4.38\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { NOOP, extend, isArray, isSymbol, isMap, isIntegerKey, hasOwn, hasChanged, isObject, makeMap, capitalize, toRawType, def, isFunction } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n activeEffectScope = this;\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n activeEffectScope = this.parent;\n }\n stop(fromParent) {\n if (this._active) {\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n this._active = false;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n if (scope && scope.active) {\n scope.effects.push(effect);\n }\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeEffect;\nclass ReactiveEffect {\n constructor(fn, trigger, scheduler, scope) {\n this.fn = fn;\n this.trigger = trigger;\n this.scheduler = scheduler;\n this.active = true;\n this.deps = [];\n /**\n * @internal\n */\n this._dirtyLevel = 4;\n /**\n * @internal\n */\n this._trackId = 0;\n /**\n * @internal\n */\n this._runnings = 0;\n /**\n * @internal\n */\n this._shouldSchedule = false;\n /**\n * @internal\n */\n this._depsLength = 0;\n recordEffectScope(this, scope);\n }\n get dirty() {\n if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {\n this._dirtyLevel = 1;\n pauseTracking();\n for (let i = 0; i < this._depsLength; i++) {\n const dep = this.deps[i];\n if (dep.computed) {\n triggerComputed(dep.computed);\n if (this._dirtyLevel >= 4) {\n break;\n }\n }\n }\n if (this._dirtyLevel === 1) {\n this._dirtyLevel = 0;\n }\n resetTracking();\n }\n return this._dirtyLevel >= 4;\n }\n set dirty(v) {\n this._dirtyLevel = v ? 4 : 0;\n }\n run() {\n this._dirtyLevel = 0;\n if (!this.active) {\n return this.fn();\n }\n let lastShouldTrack = shouldTrack;\n let lastEffect = activeEffect;\n try {\n shouldTrack = true;\n activeEffect = this;\n this._runnings++;\n preCleanupEffect(this);\n return this.fn();\n } finally {\n postCleanupEffect(this);\n this._runnings--;\n activeEffect = lastEffect;\n shouldTrack = lastShouldTrack;\n }\n }\n stop() {\n if (this.active) {\n preCleanupEffect(this);\n postCleanupEffect(this);\n this.onStop && this.onStop();\n this.active = false;\n }\n }\n}\nfunction triggerComputed(computed) {\n return computed.value;\n}\nfunction preCleanupEffect(effect2) {\n effect2._trackId++;\n effect2._depsLength = 0;\n}\nfunction postCleanupEffect(effect2) {\n if (effect2.deps.length > effect2._depsLength) {\n for (let i = effect2._depsLength; i < effect2.deps.length; i++) {\n cleanupDepEffect(effect2.deps[i], effect2);\n }\n effect2.deps.length = effect2._depsLength;\n }\n}\nfunction cleanupDepEffect(dep, effect2) {\n const trackId = dep.get(effect2);\n if (trackId !== void 0 && effect2._trackId !== trackId) {\n dep.delete(effect2);\n if (dep.size === 0) {\n dep.cleanup();\n }\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const _effect = new ReactiveEffect(fn, NOOP, () => {\n if (_effect.dirty) {\n _effect.run();\n }\n });\n if (options) {\n extend(_effect, options);\n if (options.scope) recordEffectScope(_effect, options.scope);\n }\n if (!options || !options.lazy) {\n _effect.run();\n }\n const runner = _effect.run.bind(_effect);\n runner.effect = _effect;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nlet pauseScheduleStack = 0;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction pauseScheduling() {\n pauseScheduleStack++;\n}\nfunction resetScheduling() {\n pauseScheduleStack--;\n while (!pauseScheduleStack && queueEffectSchedulers.length) {\n queueEffectSchedulers.shift()();\n }\n}\nfunction trackEffect(effect2, dep, debuggerEventExtraInfo) {\n var _a;\n if (dep.get(effect2) !== effect2._trackId) {\n dep.set(effect2, effect2._trackId);\n const oldDep = effect2.deps[effect2._depsLength];\n if (oldDep !== dep) {\n if (oldDep) {\n cleanupDepEffect(oldDep, effect2);\n }\n effect2.deps[effect2._depsLength++] = dep;\n } else {\n effect2._depsLength++;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n }\n}\nconst queueEffectSchedulers = [];\nfunction triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {\n var _a;\n pauseScheduling();\n for (const effect2 of dep.keys()) {\n let tracking;\n if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);\n effect2._dirtyLevel = dirtyLevel;\n }\n if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n effect2.trigger();\n if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {\n effect2._shouldSchedule = false;\n if (effect2.scheduler) {\n queueEffectSchedulers.push(effect2.scheduler);\n }\n }\n }\n }\n resetScheduling();\n}\n\nconst createDep = (cleanup, computed) => {\n const dep = /* @__PURE__ */ new Map();\n dep.cleanup = cleanup;\n dep.computed = computed;\n return dep;\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nfunction track(target, type, key) {\n if (shouldTrack && activeEffect) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = createDep(() => depsMap.delete(key)));\n }\n trackEffect(\n activeEffect,\n dep,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key\n } : void 0\n );\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n let deps = [];\n if (type === \"clear\") {\n deps = [...depsMap.values()];\n } else if (key === \"length\" && isArray(target)) {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || !isSymbol(key2) && key2 >= newLength) {\n deps.push(dep);\n }\n });\n } else {\n if (key !== void 0) {\n deps.push(depsMap.get(key));\n }\n switch (type) {\n case \"add\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isIntegerKey(key)) {\n deps.push(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n pauseScheduling();\n for (const dep of deps) {\n if (dep) {\n triggerEffects(\n dep,\n 4,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n } : void 0\n );\n }\n }\n resetScheduling();\n}\nfunction getDepFromReactive(object, key) {\n const depsMap = targetMap.get(object);\n return depsMap && depsMap.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n for (let i = 0, l = this.length; i < l; i++) {\n track(arr, \"get\", i + \"\");\n }\n const res = arr[key](...args);\n if (res === -1 || res === false) {\n return arr[key](...args.map(toRaw));\n } else {\n return res;\n }\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n pauseTracking();\n pauseScheduling();\n const res = toRaw(this)[key].apply(this, args);\n resetScheduling();\n resetTracking();\n return res;\n };\n });\n return instrumentations;\n}\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, receiver);\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(target, key, receiver);\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n return false;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(target, key, value, receiver);\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(\n true\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly2 = false, isShallow2 = false) {\n target = target[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly2) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has: has2 } = getProto(rawTarget);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n if (has2.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has2.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n}\nfunction has(key, isReadonly2 = false) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly2) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly2 = false) {\n target = target[\"__v_raw\"];\n !isReadonly2 && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n}\nfunction add(value, _isShallow = false) {\n if (!_isShallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n}\nfunction set(key, value, _isShallow = false) {\n if (!_isShallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n}\nfunction deleteEntry(key) {\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2 ? get2.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n}\nfunction clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, \"clear\", void 0, void 0, oldTarget);\n }\n return result;\n}\nfunction createForEach(isReadonly2, isShallow2) {\n return function forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n };\n}\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations() {\n const mutableInstrumentations2 = {\n get(key) {\n return get(this, key);\n },\n get size() {\n return size(this);\n },\n has,\n add,\n set,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, false)\n };\n const shallowInstrumentations2 = {\n get(key) {\n return get(this, key, false, true);\n },\n get size() {\n return size(this);\n },\n has,\n add(value) {\n return add.call(this, value, true);\n },\n set(key, value) {\n return set.call(this, key, value, true);\n },\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, true)\n };\n const readonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, false)\n };\n const shallowReadonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, true)\n };\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n shallowReadonlyInstrumentations2[method] = createIterableMethod(\n method,\n true,\n true\n );\n });\n return [\n mutableInstrumentations2,\n readonlyInstrumentations2,\n shallowInstrumentations2,\n shallowReadonlyInstrumentations2\n ];\n}\nconst [\n mutableInstrumentations,\n readonlyInstrumentations,\n shallowInstrumentations,\n shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has2.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nconst COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;\nclass ComputedRefImpl {\n constructor(getter, _setter, isReadonly, isSSR) {\n this.getter = getter;\n this._setter = _setter;\n this.dep = void 0;\n this.__v_isRef = true;\n this[\"__v_isReadonly\"] = false;\n this.effect = new ReactiveEffect(\n () => getter(this._value),\n () => triggerRefValue(\n this,\n this.effect._dirtyLevel === 2 ? 2 : 3\n )\n );\n this.effect.computed = this;\n this.effect.active = this._cacheable = !isSSR;\n this[\"__v_isReadonly\"] = isReadonly;\n }\n get value() {\n const self = toRaw(this);\n if ((!self._cacheable || self.effect.dirty) && hasChanged(self._value, self._value = self.effect.run())) {\n triggerRefValue(self, 4);\n }\n trackRefValue(self);\n if (self.effect._dirtyLevel >= 2) {\n if (!!(process.env.NODE_ENV !== \"production\") && this._warnRecursive) {\n warn(COMPUTED_SIDE_EFFECT_WARN, `\n\ngetter: `, this.getter);\n }\n triggerRefValue(self, 2);\n }\n return self._value;\n }\n set value(newValue) {\n this._setter(newValue);\n }\n // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x\n get _dirty() {\n return this.effect.dirty;\n }\n set _dirty(v) {\n this.effect.dirty = v;\n }\n // #endregion\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n const onlyGetter = isFunction(getterOrOptions);\n if (onlyGetter) {\n getter = getterOrOptions;\n setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n warn(\"Write operation failed: computed value is readonly\");\n } : NOOP;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.effect.onTrack = debugOptions.onTrack;\n cRef.effect.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nfunction trackRefValue(ref2) {\n var _a;\n if (shouldTrack && activeEffect) {\n ref2 = toRaw(ref2);\n trackEffect(\n activeEffect,\n (_a = ref2.dep) != null ? _a : ref2.dep = createDep(\n () => ref2.dep = void 0,\n ref2 instanceof ComputedRefImpl ? ref2 : void 0\n ),\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"get\",\n key: \"value\"\n } : void 0\n );\n }\n}\nfunction triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) {\n ref2 = toRaw(ref2);\n const dep = ref2.dep;\n if (dep) {\n triggerEffects(\n dep,\n dirtyLevel,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: newVal,\n oldValue: oldVal\n } : void 0\n );\n }\n}\nfunction isRef(r) {\n return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, __v_isShallow) {\n this.__v_isShallow = __v_isShallow;\n this.dep = void 0;\n this.__v_isRef = true;\n this._rawValue = __v_isShallow ? value : toRaw(value);\n this._value = __v_isShallow ? value : toReactive(value);\n }\n get value() {\n trackRefValue(this);\n return this._value;\n }\n set value(newVal) {\n const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n newVal = useDirectValue ? newVal : toRaw(newVal);\n if (hasChanged(newVal, this._rawValue)) {\n const oldVal = this._rawValue;\n this._rawValue = newVal;\n this._value = useDirectValue ? newVal : toReactive(newVal);\n triggerRefValue(this, 4, newVal, oldVal);\n }\n }\n}\nfunction triggerRef(ref2) {\n triggerRefValue(ref2, 4, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this.dep = void 0;\n this.__v_isRef = true;\n const { get, set } = factory(\n () => trackRefValue(this),\n () => triggerRefValue(this)\n );\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this.__v_isRef = true;\n }\n get value() {\n const val = this._object[this._key];\n return val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(toRaw(this._object), this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this.__v_isRef = true;\n this.__v_isReadonly = true;\n }\n get value() {\n return this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n const val = source[key];\n return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nconst deferredComputed = computed;\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\"\n};\n\nexport { EffectScope, ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, computed, customRef, deferredComputed, effect, effectScope, enableTracking, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, pauseScheduling, pauseTracking, proxyRefs, reactive, readonly, ref, resetScheduling, resetTracking, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, track, trigger, triggerRef, unref };\n", "/**\n* @vue/runtime-core v3.4.38\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, ref, shallowReadonly, track, reactive, shallowReactive, trigger, isReactive, ReactiveEffect, isShallow, getCurrentScope, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1, isReadonly } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, EMPTY_OBJ, isObject, remove, isRegExp, invokeArrayFns, toHandlerKey, capitalize, camelize, hasOwn, isGloballyAllowed, NO, hyphenate, isReservedProp, EMPTY_ARR, toRawType, makeMap, def, isOn, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, hasChanged, isSet, isMap, isPlainObject, looseToNumber, isModelListener, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n const appErrorHandler = instance.appContext.config.errorHandler;\n if (appErrorHandler) {\n pauseTracking();\n callWithErrorHandling(\n appErrorHandler,\n null,\n 10,\n [err, exposedInstance, errorInfo]\n );\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else {\n console.error(err);\n }\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.pre) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!queue.length || !queue.includes(\n job,\n isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex\n )) {\n if (job.id == null) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(job.id), 0, job);\n }\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!isFlushing && !isFlushPending) {\n isFlushPending = true;\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction invalidateJob(job) {\n const i = queue.indexOf(job);\n if (i > flushIndex) {\n queue.splice(i, 1);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (!activePostFlushCbs || !activePostFlushCbs.includes(\n cb,\n cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex\n )) {\n pendingPostFlushCbs.push(cb);\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.pre) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n cb();\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.active !== false) cb();\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n const diff = getId(a) - getId(b);\n if (diff === 0) {\n if (a.pre && !b.pre) return -1;\n if (b.pre && !a.pre) return 1;\n }\n return diff;\n};\nfunction flushJobs(seen) {\n isFlushPending = false;\n isFlushing = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n queue.sort(comparator);\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && job.active !== false) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n }\n }\n } finally {\n flushIndex = 0;\n queue.length = 0;\n flushPostFlushCbs(seen);\n isFlushing = false;\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n if (!seen.has(fn)) {\n seen.set(fn, 1);\n } else {\n const count = seen.get(fn);\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n } else {\n seen.set(fn, count + 1);\n }\n }\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n instance.effect.dirty = true;\n instance.update();\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n instance.parent.effect.dirty = true;\n queueJob(() => {\n instance.parent.update();\n dirtyInstances.delete(instance);\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:added\" /* COMPONENT_ADDED */\n);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:start\" /* PERFORMANCE_START */\n);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:end\" /* PERFORMANCE_END */\n);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid <transition> mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getKeepAliveChild(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n setTransitionHooks(innerChild, enterHooks);\n const oldChild = instance.subTree;\n const oldInnerChild = oldChild && getKeepAliveChild(oldChild);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {\n const leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (instance.update.active !== false) {\n instance.effect.dirty = true;\n instance.update();\n }\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n };\n enterHooks.delayedLeave = delayedLeave;\n };\n }\n }\n return child;\n };\n }\n};\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getKeepAliveChild(vnode) {\n if (!isKeepAlive(vnode)) {\n return vnode;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8326: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.effect.dirty = true;\n queueJob(instance.parent.update);\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createVNode(loadingComponent);\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(vnode.type);\n if (name && (!filter || !filter(name))) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= ~256;\n vnode.shapeFlag &= ~512;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\"bu\");\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\"bum\");\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\"sp\");\nconst onRenderTriggered = createHook(\n \"rtg\"\n);\nconst onRenderTracked = createHook(\n \"rtc\"\n);\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n if (isArray(source) || isString(source)) {\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {\n if (name !== \"default\") props.name = name;\n return createVNode(\"slot\", props, fallback && fallback());\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const rendered = createBlock(\n Fragment,\n {\n key: (props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key || `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n i.effect.dirty = true;\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n let normalizedProps;\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (\n // only cache other properties when instance has declared (thus stable)\n // props\n (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n ) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n return false;\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n data[key] = value;\n return true;\n } else if (hasOwn(instance.props, key)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n return false;\n }\n if (key[0] === \"$\" && key.slice(1) in instance) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n );\n return false;\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n value\n });\n } else {\n ctx[key] = value;\n }\n }\n return true;\n },\n has({\n _: { data, setupState, accessCache, ctx, appContext, propsOptions }\n }, key) {\n let normalizedProps;\n return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);\n },\n defineProperty(target, key, descriptor) {\n if (descriptor.get != null) {\n target._.accessCache[key] = 0;\n } else if (hasOwn(descriptor, \"value\")) {\n this.set(target, key, descriptor.value, null);\n }\n return Reflect.defineProperty(target, key, descriptor);\n }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n PublicInstanceProxyHandlers.ownKeys = (target) => {\n warn$1(\n `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n );\n return Reflect.ownKeys(target);\n };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(\n {},\n PublicInstanceProxyHandlers,\n {\n get(target, key) {\n if (key === Symbol.unscopables) {\n return;\n }\n return PublicInstanceProxyHandlers.get(target, key, target);\n },\n has(_, key) {\n const has = key[0] !== \"_\" && !isGloballyAllowed(key);\n if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} should not start with _ which is a reserved prefix for Vue internals.`\n );\n }\n return has;\n }\n }\n);\nfunction createDevRenderContext(instance) {\n const target = {};\n Object.defineProperty(target, `_`, {\n configurable: true,\n enumerable: false,\n get: () => instance\n });\n Object.keys(publicPropertiesMap).forEach((key) => {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: false,\n get: () => publicPropertiesMap[key](instance),\n // intercepted by the proxy so no need for implementation,\n // but needed to prevent set errors\n set: NOOP\n });\n });\n return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n const {\n ctx,\n propsOptions: [propsOptions]\n } = instance;\n if (propsOptions) {\n Object.keys(propsOptions).forEach((key) => {\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => instance.props[key],\n set: NOOP\n });\n });\n }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n const { ctx, setupState } = instance;\n Object.keys(toRaw(setupState)).forEach((key) => {\n if (!setupState.__isScriptSetup) {\n if (isReservedPrefix(key[0])) {\n warn$1(\n `setup() return property ${JSON.stringify(\n key\n )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n );\n return;\n }\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => setupState[key],\n set: NOOP\n });\n }\n });\n}\n\nconst warnRuntimeUsage = (method) => warn$1(\n `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`defineProps`);\n }\n return null;\n}\nfunction defineEmits() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`defineEmits`);\n }\n return null;\n}\nfunction defineExpose(exposed) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`defineExpose`);\n }\n}\nfunction defineOptions(options) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`defineOptions`);\n }\n}\nfunction defineSlots() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`defineSlots`);\n }\n return null;\n}\nfunction defineModel() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(\"defineModel\");\n }\n}\nfunction withDefaults(props, defaults) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warnRuntimeUsage(`withDefaults`);\n }\n return null;\n}\nfunction useSlots() {\n return getContext().slots;\n}\nfunction useAttrs() {\n return getContext().attrs;\n}\nfunction getContext() {\n const i = getCurrentInstance();\n if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n warn$1(`useContext() called without active instance.`);\n }\n return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n return isArray(props) ? props.reduce(\n (normalized, p) => (normalized[p] = null, normalized),\n {}\n ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n const props = normalizePropsOrEmits(raw);\n for (const key in defaults) {\n if (key.startsWith(\"__skip\")) continue;\n let opt = props[key];\n if (opt) {\n if (isArray(opt) || isFunction(opt)) {\n opt = props[key] = { type: opt, default: defaults[key] };\n } else {\n opt.default = defaults[key];\n }\n } else if (opt === null) {\n opt = props[key] = { default: defaults[key] };\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`props default key \"${key}\" has no corresponding declaration.`);\n }\n if (opt && defaults[`__skip_${key}`]) {\n opt.skipFactory = true;\n }\n }\n return props;\n}\nfunction mergeModels(a, b) {\n if (!a || !b) return a || b;\n if (isArray(a) && isArray(b)) return a.concat(b);\n return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n const ret = {};\n for (const key in props) {\n if (!excludedKeys.includes(key)) {\n Object.defineProperty(ret, key, {\n enumerable: true,\n get: () => props[key]\n });\n }\n }\n return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n const ctx = getCurrentInstance();\n if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n warn$1(\n `withAsyncContext called without active current instance. This is likely a bug.`\n );\n }\n let awaitable = getAwaitable();\n unsetCurrentInstance();\n if (isPromise(awaitable)) {\n awaitable = awaitable.catch((e) => {\n setCurrentInstance(ctx);\n throw e;\n });\n }\n return [awaitable, () => setCurrentInstance(ctx)];\n}\n\nfunction createDuplicateChecker() {\n const cache = /* @__PURE__ */ Object.create(null);\n return (type, key) => {\n if (cache[key]) {\n warn$1(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n } else {\n cache[key] = type;\n }\n };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n const options = resolveMergedOptions(instance);\n const publicThis = instance.proxy;\n const ctx = instance.ctx;\n shouldCacheAccess = false;\n if (options.beforeCreate) {\n callHook(options.beforeCreate, instance, \"bc\");\n }\n const {\n // state\n data: dataOptions,\n computed: computedOptions,\n methods,\n watch: watchOptions,\n provide: provideOptions,\n inject: injectOptions,\n // lifecycle\n created,\n beforeMount,\n mounted,\n beforeUpdate,\n updated,\n activated,\n deactivated,\n beforeDestroy,\n beforeUnmount,\n destroyed,\n unmounted,\n render,\n renderTracked,\n renderTriggered,\n errorCaptured,\n serverPrefetch,\n // public API\n expose,\n inheritAttrs,\n // assets\n components,\n directives,\n filters\n } = options;\n const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const [propsOptions] = instance.propsOptions;\n if (propsOptions) {\n for (const key in propsOptions) {\n checkDuplicateProperties(\"Props\" /* PROPS */, key);\n }\n }\n }\n if (injectOptions) {\n resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n }\n if (methods) {\n for (const key in methods) {\n const methodHandler = methods[key];\n if (isFunction(methodHandler)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n Object.defineProperty(ctx, key, {\n value: methodHandler.bind(publicThis),\n configurable: true,\n enumerable: true,\n writable: true\n });\n } else {\n ctx[key] = methodHandler.bind(publicThis);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n );\n }\n }\n }\n if (dataOptions) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n warn$1(\n `The data option must be a function. Plain object usage is no longer supported.`\n );\n }\n const data = dataOptions.call(publicThis, publicThis);\n if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n warn$1(\n `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n );\n }\n if (!isObject(data)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`data() should return an object.`);\n } else {\n instance.data = reactive(data);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (const key in data) {\n checkDuplicateProperties(\"Data\" /* DATA */, key);\n if (!isReservedPrefix(key[0])) {\n Object.defineProperty(ctx, key, {\n configurable: true,\n enumerable: true,\n get: () => data[key],\n set: NOOP\n });\n }\n }\n }\n }\n }\n shouldCacheAccess = true;\n if (computedOptions) {\n for (const key in computedOptions) {\n const opt = computedOptions[key];\n const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n warn$1(`Computed property \"${key}\" has no getter.`);\n }\n const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n warn$1(\n `Write operation failed: computed property \"${key}\" is readonly.`\n );\n } : NOOP;\n const c = computed({\n get,\n set\n });\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => c.value,\n set: (v) => c.value = v\n });\n if (!!(process.env.NODE_ENV !== \"production\")) {\n checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n }\n }\n }\n if (watchOptions) {\n for (const key in watchOptions) {\n createWatcher(watchOptions[key], ctx, publicThis, key);\n }\n }\n if (provideOptions) {\n const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n Reflect.ownKeys(provides).forEach((key) => {\n provide(key, provides[key]);\n });\n }\n if (created) {\n callHook(created, instance, \"c\");\n }\n function registerLifecycleHook(register, hook) {\n if (isArray(hook)) {\n hook.forEach((_hook) => register(_hook.bind(publicThis)));\n } else if (hook) {\n register(hook.bind(publicThis));\n }\n }\n registerLifecycleHook(onBeforeMount, beforeMount);\n registerLifecycleHook(onMounted, mounted);\n registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n registerLifecycleHook(onUpdated, updated);\n registerLifecycleHook(onActivated, activated);\n registerLifecycleHook(onDeactivated, deactivated);\n registerLifecycleHook(onErrorCaptured, errorCaptured);\n registerLifecycleHook(onRenderTracked, renderTracked);\n registerLifecycleHook(onRenderTriggered, renderTriggered);\n registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n registerLifecycleHook(onUnmounted, unmounted);\n registerLifecycleHook(onServerPrefetch, serverPrefetch);\n if (isArray(expose)) {\n if (expose.length) {\n const exposed = instance.exposed || (instance.exposed = {});\n expose.forEach((key) => {\n Object.defineProperty(exposed, key, {\n get: () => publicThis[key],\n set: (val) => publicThis[key] = val\n });\n });\n } else if (!instance.exposed) {\n instance.exposed = {};\n }\n }\n if (render && instance.render === NOOP) {\n instance.render = render;\n }\n if (inheritAttrs != null) {\n instance.inheritAttrs = inheritAttrs;\n }\n if (components) instance.components = components;\n if (directives) instance.directives = directives;\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n if (isArray(injectOptions)) {\n injectOptions = normalizeInject(injectOptions);\n }\n for (const key in injectOptions) {\n const opt = injectOptions[key];\n let injected;\n if (isObject(opt)) {\n if (\"default\" in opt) {\n injected = inject(\n opt.from || key,\n opt.default,\n true\n );\n } else {\n injected = inject(opt.from || key);\n }\n } else {\n injected = inject(opt);\n }\n if (isRef(injected)) {\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => injected.value,\n set: (v) => injected.value = v\n });\n } else {\n ctx[key] = injected;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n }\n }\n}\nfunction callHook(hook, instance, type) {\n callWithAsyncErrorHandling(\n isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n instance,\n type\n );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n const getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n if (isString(raw)) {\n const handler = ctx[raw];\n if (isFunction(handler)) {\n watch(getter, handler);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`Invalid watch handler specified by key \"${raw}\"`, handler);\n }\n } else if (isFunction(raw)) {\n watch(getter, raw.bind(publicThis));\n } else if (isObject(raw)) {\n if (isArray(raw)) {\n raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n } else {\n const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n if (isFunction(handler)) {\n watch(getter, handler, raw);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n }\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`Invalid watch option: \"${key}\"`, raw);\n }\n}\nfunction resolveMergedOptions(instance) {\n const base = instance.type;\n const { mixins, extends: extendsOptions } = base;\n const {\n mixins: globalMixins,\n optionsCache: cache,\n config: { optionMergeStrategies }\n } = instance.appContext;\n const cached = cache.get(base);\n let resolved;\n if (cached) {\n resolved = cached;\n } else if (!globalMixins.length && !mixins && !extendsOptions) {\n {\n resolved = base;\n }\n } else {\n resolved = {};\n if (globalMixins.length) {\n globalMixins.forEach(\n (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n );\n }\n mergeOptions(resolved, base, optionMergeStrategies);\n }\n if (isObject(base)) {\n cache.set(base, resolved);\n }\n return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n const { mixins, extends: extendsOptions } = from;\n if (extendsOptions) {\n mergeOptions(to, extendsOptions, strats, true);\n }\n if (mixins) {\n mixins.forEach(\n (m) => mergeOptions(to, m, strats, true)\n );\n }\n for (const key in from) {\n if (asMixin && key === \"expose\") {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n );\n } else {\n const strat = internalOptionMergeStrats[key] || strats && strats[key];\n to[key] = strat ? strat(to[key], from[key]) : from[key];\n }\n }\n return to;\n}\nconst internalOptionMergeStrats = {\n data: mergeDataFn,\n props: mergeEmitsOrPropsOptions,\n emits: mergeEmitsOrPropsOptions,\n // objects\n methods: mergeObjectOptions,\n computed: mergeObjectOptions,\n // lifecycle\n beforeCreate: mergeAsArray,\n created: mergeAsArray,\n beforeMount: mergeAsArray,\n mounted: mergeAsArray,\n beforeUpdate: mergeAsArray,\n updated: mergeAsArray,\n beforeDestroy: mergeAsArray,\n beforeUnmount: mergeAsArray,\n destroyed: mergeAsArray,\n unmounted: mergeAsArray,\n activated: mergeAsArray,\n deactivated: mergeAsArray,\n errorCaptured: mergeAsArray,\n serverPrefetch: mergeAsArray,\n // assets\n components: mergeObjectOptions,\n directives: mergeObjectOptions,\n // watch\n watch: mergeWatchOptions,\n // provide / inject\n provide: mergeDataFn,\n inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n if (!from) {\n return to;\n }\n if (!to) {\n return from;\n }\n return function mergedDataFn() {\n return (extend)(\n isFunction(to) ? to.call(this, this) : to,\n isFunction(from) ? from.call(this, this) : from\n );\n };\n}\nfunction mergeInject(to, from) {\n return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n if (isArray(raw)) {\n const res = {};\n for (let i = 0; i < raw.length; i++) {\n res[raw[i]] = raw[i];\n }\n return res;\n }\n return raw;\n}\nfunction mergeAsArray(to, from) {\n return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n if (to) {\n if (isArray(to) && isArray(from)) {\n return [.../* @__PURE__ */ new Set([...to, ...from])];\n }\n return extend(\n /* @__PURE__ */ Object.create(null),\n normalizePropsOrEmits(to),\n normalizePropsOrEmits(from != null ? from : {})\n );\n } else {\n return from;\n }\n}\nfunction mergeWatchOptions(to, from) {\n if (!to) return from;\n if (!from) return to;\n const merged = extend(/* @__PURE__ */ Object.create(null), to);\n for (const key in from) {\n merged[key] = mergeAsArray(to[key], from[key]);\n }\n return merged;\n}\n\nfunction createAppContext() {\n return {\n app: null,\n config: {\n isNativeTag: NO,\n performance: false,\n globalProperties: {},\n optionMergeStrategies: {},\n errorHandler: void 0,\n warnHandler: void 0,\n compilerOptions: {}\n },\n mixins: [],\n components: {},\n directives: {},\n provides: /* @__PURE__ */ Object.create(null),\n optionsCache: /* @__PURE__ */ new WeakMap(),\n propsCache: /* @__PURE__ */ new WeakMap(),\n emitsCache: /* @__PURE__ */ new WeakMap()\n };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n return function createApp(rootComponent, rootProps = null) {\n if (!isFunction(rootComponent)) {\n rootComponent = extend({}, rootComponent);\n }\n if (rootProps != null && !isObject(rootProps)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n rootProps = null;\n }\n const context = createAppContext();\n const installedPlugins = /* @__PURE__ */ new WeakSet();\n let isMounted = false;\n const app = context.app = {\n _uid: uid$1++,\n _component: rootComponent,\n _props: rootProps,\n _container: null,\n _context: context,\n _instance: null,\n version,\n get config() {\n return context.config;\n },\n set config(v) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `app.config cannot be replaced. Modify individual options instead.`\n );\n }\n },\n use(plugin, ...options) {\n if (installedPlugins.has(plugin)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin);\n plugin.install(app, ...options);\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin);\n plugin(app, ...options);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `A plugin must either be a function or an object with an \"install\" function.`\n );\n }\n return app;\n },\n mixin(mixin) {\n if (__VUE_OPTIONS_API__) {\n if (!context.mixins.includes(mixin)) {\n context.mixins.push(mixin);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n );\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Mixins are only available in builds supporting Options API\");\n }\n return app;\n },\n component(name, component) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateComponentName(name, context.config);\n }\n if (!component) {\n return context.components[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n warn$1(`Component \"${name}\" has already been registered in target app.`);\n }\n context.components[name] = component;\n return app;\n },\n directive(name, directive) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateDirectiveName(name);\n }\n if (!directive) {\n return context.directives[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n warn$1(`Directive \"${name}\" has already been registered in target app.`);\n }\n context.directives[name] = directive;\n return app;\n },\n mount(rootContainer, isHydrate, namespace) {\n if (!isMounted) {\n if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n warn$1(\n `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n );\n }\n const vnode = createVNode(rootComponent, rootProps);\n vnode.appContext = context;\n if (namespace === true) {\n namespace = \"svg\";\n } else if (namespace === false) {\n namespace = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n context.reload = () => {\n render(\n cloneVNode(vnode),\n rootContainer,\n namespace\n );\n };\n }\n if (isHydrate && hydrate) {\n hydrate(vnode, rootContainer);\n } else {\n render(vnode, rootContainer, namespace);\n }\n isMounted = true;\n app._container = rootContainer;\n rootContainer.__vue_app__ = app;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n app._instance = vnode.component;\n devtoolsInitApp(app, version);\n }\n return getComponentPublicInstance(vnode.component);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n );\n }\n },\n unmount() {\n if (isMounted) {\n render(null, app._container);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n app._instance = null;\n devtoolsUnmountApp(app);\n }\n delete app._container.__vue_app__;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`Cannot unmount an app that is not mounted.`);\n }\n },\n provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n warn$1(\n `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n );\n }\n context.provides[key] = value;\n return app;\n },\n runWithContext(fn) {\n const lastApp = currentApp;\n currentApp = app;\n try {\n return fn();\n } finally {\n currentApp = lastApp;\n }\n }\n };\n return app;\n };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n if (!currentInstance) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`provide() can only be used inside setup().`);\n }\n } else {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = currentInstance || currentRenderingInstance;\n if (instance || currentApp) {\n const provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\nconst internalObjectProto = {};\nconst createInternalObject = () => Object.create(internalObjectProto);\nconst isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n const props = {};\n const attrs = createInternalObject();\n instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n setFullProps(instance, rawProps, props, attrs);\n for (const key in instance.propsOptions[0]) {\n if (!(key in props)) {\n props[key] = void 0;\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateProps(rawProps || {}, props, instance);\n }\n if (isStateful) {\n instance.props = isSSR ? props : shallowReactive(props);\n } else {\n if (!instance.type.props) {\n instance.props = attrs;\n } else {\n instance.props = props;\n }\n }\n instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n while (instance) {\n if (instance.type.__hmrId) return true;\n instance = instance.parent;\n }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n const {\n props,\n attrs,\n vnode: { patchFlag }\n } = instance;\n const rawCurrentProps = toRaw(props);\n const [options] = instance.propsOptions;\n let hasAttrsChanged = false;\n if (\n // always force full diff in dev\n // - #1942 if hmr is enabled with sfc component\n // - vite#872 non-sfc component used by sfc component\n !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n ) {\n if (patchFlag & 8) {\n const propsToUpdate = instance.vnode.dynamicProps;\n for (let i = 0; i < propsToUpdate.length; i++) {\n let key = propsToUpdate[i];\n if (isEmitListener(instance.emitsOptions, key)) {\n continue;\n }\n const value = rawProps[key];\n if (options) {\n if (hasOwn(attrs, key)) {\n if (value !== attrs[key]) {\n attrs[key] = value;\n hasAttrsChanged = true;\n }\n } else {\n const camelizedKey = camelize(key);\n props[camelizedKey] = resolvePropValue(\n options,\n rawCurrentProps,\n camelizedKey,\n value,\n instance,\n false\n );\n }\n } else {\n if (value !== attrs[key]) {\n attrs[key] = value;\n hasAttrsChanged = true;\n }\n }\n }\n }\n } else {\n if (setFullProps(instance, rawProps, props, attrs)) {\n hasAttrsChanged = true;\n }\n let kebabKey;\n for (const key in rawCurrentProps) {\n if (!rawProps || // for camelCase\n !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n // and converted to camelCase (#955)\n ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n if (options) {\n if (rawPrevProps && // for camelCase\n (rawPrevProps[key] !== void 0 || // for kebab-case\n rawPrevProps[kebabKey] !== void 0)) {\n props[key] = resolvePropValue(\n options,\n rawCurrentProps,\n key,\n void 0,\n instance,\n true\n );\n }\n } else {\n delete props[key];\n }\n }\n }\n if (attrs !== rawCurrentProps) {\n for (const key in attrs) {\n if (!rawProps || !hasOwn(rawProps, key) && true) {\n delete attrs[key];\n hasAttrsChanged = true;\n }\n }\n }\n }\n if (hasAttrsChanged) {\n trigger(instance.attrs, \"set\", \"\");\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateProps(rawProps || {}, props, instance);\n }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n const [options, needCastKeys] = instance.propsOptions;\n let hasAttrsChanged = false;\n let rawCastValues;\n if (rawProps) {\n for (let key in rawProps) {\n if (isReservedProp(key)) {\n continue;\n }\n const value = rawProps[key];\n let camelKey;\n if (options && hasOwn(options, camelKey = camelize(key))) {\n if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n props[camelKey] = value;\n } else {\n (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n }\n } else if (!isEmitListener(instance.emitsOptions, key)) {\n if (!(key in attrs) || value !== attrs[key]) {\n attrs[key] = value;\n hasAttrsChanged = true;\n }\n }\n }\n }\n if (needCastKeys) {\n const rawCurrentProps = toRaw(props);\n const castValues = rawCastValues || EMPTY_OBJ;\n for (let i = 0; i < needCastKeys.length; i++) {\n const key = needCastKeys[i];\n props[key] = resolvePropValue(\n options,\n rawCurrentProps,\n key,\n castValues[key],\n instance,\n !hasOwn(castValues, key)\n );\n }\n }\n return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n const opt = options[key];\n if (opt != null) {\n const hasDefault = hasOwn(opt, \"default\");\n if (hasDefault && value === void 0) {\n const defaultValue = opt.default;\n if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n const { propsDefaults } = instance;\n if (key in propsDefaults) {\n value = propsDefaults[key];\n } else {\n const reset = setCurrentInstance(instance);\n value = propsDefaults[key] = defaultValue.call(\n null,\n props\n );\n reset();\n }\n } else {\n value = defaultValue;\n }\n }\n if (opt[0 /* shouldCast */]) {\n if (isAbsent && !hasDefault) {\n value = false;\n } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n value = true;\n }\n }\n }\n return value;\n}\nconst mixinPropsCache = /* @__PURE__ */ new WeakMap();\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache;\n const cached = cache.get(comp);\n if (cached) {\n return cached;\n }\n const raw = comp.props;\n const normalized = {};\n const needCastKeys = [];\n let hasExtends = false;\n if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n const extendProps = (raw2) => {\n hasExtends = true;\n const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n extend(normalized, props);\n if (keys) needCastKeys.push(...keys);\n };\n if (!asMixin && appContext.mixins.length) {\n appContext.mixins.forEach(extendProps);\n }\n if (comp.extends) {\n extendProps(comp.extends);\n }\n if (comp.mixins) {\n comp.mixins.forEach(extendProps);\n }\n }\n if (!raw && !hasExtends) {\n if (isObject(comp)) {\n cache.set(comp, EMPTY_ARR);\n }\n return EMPTY_ARR;\n }\n if (isArray(raw)) {\n for (let i = 0; i < raw.length; i++) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n warn$1(`props must be strings when using array syntax.`, raw[i]);\n }\n const normalizedKey = camelize(raw[i]);\n if (validatePropName(normalizedKey)) {\n normalized[normalizedKey] = EMPTY_OBJ;\n }\n }\n } else if (raw) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n warn$1(`invalid props options`, raw);\n }\n for (const key in raw) {\n const normalizedKey = camelize(key);\n if (validatePropName(normalizedKey)) {\n const opt = raw[key];\n const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n const propType = prop.type;\n let shouldCast = false;\n let shouldCastTrue = true;\n if (isArray(propType)) {\n for (let index = 0; index < propType.length; ++index) {\n const type = propType[index];\n const typeName = isFunction(type) && type.name;\n if (typeName === \"Boolean\") {\n shouldCast = true;\n break;\n } else if (typeName === \"String\") {\n shouldCastTrue = false;\n }\n }\n } else {\n shouldCast = isFunction(propType) && propType.name === \"Boolean\";\n }\n prop[0 /* shouldCast */] = shouldCast;\n prop[1 /* shouldCastTrue */] = shouldCastTrue;\n if (shouldCast || hasOwn(prop, \"default\")) {\n needCastKeys.push(normalizedKey);\n }\n }\n }\n }\n const res = [normalized, needCastKeys];\n if (isObject(comp)) {\n cache.set(comp, res);\n }\n return res;\n}\nfunction validatePropName(key) {\n if (key[0] !== \"$\" && !isReservedProp(key)) {\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`Invalid prop name: \"${key}\" is a reserved property.`);\n }\n return false;\n}\nfunction getType(ctor) {\n if (ctor === null) {\n return \"null\";\n }\n if (typeof ctor === \"function\") {\n return ctor.name || \"\";\n } else if (typeof ctor === \"object\") {\n const name = ctor.constructor && ctor.constructor.name;\n return name || \"\";\n }\n return \"\";\n}\nfunction validateProps(rawProps, props, instance) {\n const resolvedValues = toRaw(props);\n const options = instance.propsOptions[0];\n for (const key in options) {\n let opt = options[key];\n if (opt == null) continue;\n validateProp(\n key,\n resolvedValues[key],\n opt,\n !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(resolvedValues) : resolvedValues,\n !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))\n );\n }\n}\nfunction validateProp(name, value, prop, props, isAbsent) {\n const { type, required, validator, skipCheck } = prop;\n if (required && isAbsent) {\n warn$1('Missing required prop: \"' + name + '\"');\n return;\n }\n if (value == null && !required) {\n return;\n }\n if (type != null && type !== true && !skipCheck) {\n let isValid = false;\n const types = isArray(type) ? type : [type];\n const expectedTypes = [];\n for (let i = 0; i < types.length && !isValid; i++) {\n const { valid, expectedType } = assertType(value, types[i]);\n expectedTypes.push(expectedType || \"\");\n isValid = valid;\n }\n if (!isValid) {\n warn$1(getInvalidTypeMessage(name, value, expectedTypes));\n return;\n }\n }\n if (validator && !validator(value, props)) {\n warn$1('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n let valid;\n const expectedType = getType(type);\n if (isSimpleType(expectedType)) {\n const t = typeof value;\n valid = t === expectedType.toLowerCase();\n if (!valid && t === \"object\") {\n valid = value instanceof type;\n }\n } else if (expectedType === \"Object\") {\n valid = isObject(value);\n } else if (expectedType === \"Array\") {\n valid = isArray(value);\n } else if (expectedType === \"null\") {\n valid = value === null;\n } else {\n valid = value instanceof type;\n }\n return {\n valid,\n expectedType\n };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n if (expectedTypes.length === 0) {\n return `Prop type [] for prop \"${name}\" won't match anything. Did you mean to use type Array instead?`;\n }\n let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n const expectedType = expectedTypes[0];\n const receivedType = toRawType(value);\n const expectedValue = styleValue(value, expectedType);\n const receivedValue = styleValue(value, receivedType);\n if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n message += ` with value ${expectedValue}`;\n }\n message += `, got ${receivedType} `;\n if (isExplicable(receivedType)) {\n message += `with value ${receivedValue}.`;\n }\n return message;\n}\nfunction styleValue(value, type) {\n if (type === \"String\") {\n return `\"${value}\"`;\n } else if (type === \"Number\") {\n return `${Number(value)}`;\n } else {\n return `${value}`;\n }\n}\nfunction isExplicable(type) {\n const explicitTypes = [\"string\", \"number\", \"boolean\"];\n return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isBoolean(...args) {\n return args.some((elem) => elem.toLowerCase() === \"boolean\");\n}\n\nconst isInternalKey = (key) => key[0] === \"_\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n if (rawSlot._n) {\n return rawSlot;\n }\n const normalized = withCtx((...args) => {\n if (!!(process.env.NODE_ENV !== \"production\") && currentInstance && (!ctx || ctx.root === currentInstance.root)) {\n warn$1(\n `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n );\n }\n return normalizeSlotValue(rawSlot(...args));\n }, ctx);\n normalized._c = false;\n return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n const ctx = rawSlots._ctx;\n for (const key in rawSlots) {\n if (isInternalKey(key)) continue;\n const value = rawSlots[key];\n if (isFunction(value)) {\n slots[key] = normalizeSlot(key, value, ctx);\n } else if (value != null) {\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n warn$1(\n `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n );\n }\n const normalized = normalizeSlotValue(value);\n slots[key] = () => normalized;\n }\n }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n warn$1(\n `Non-function value encountered for default slot. Prefer function slots for better performance.`\n );\n }\n const normalized = normalizeSlotValue(children);\n instance.slots.default = () => normalized;\n};\nconst assignSlots = (slots, children, optimized) => {\n for (const key in children) {\n if (optimized || key !== \"_\") {\n slots[key] = children[key];\n }\n }\n};\nconst initSlots = (instance, children, optimized) => {\n const slots = instance.slots = createInternalObject();\n if (instance.vnode.shapeFlag & 32) {\n const type = children._;\n if (type) {\n assignSlots(slots, children, optimized);\n if (optimized) {\n def(slots, \"_\", type, true);\n }\n } else {\n normalizeObjectSlots(children, slots);\n }\n } else if (children) {\n normalizeVNodeSlots(instance, children);\n }\n};\nconst updateSlots = (instance, children, optimized) => {\n const { vnode, slots } = instance;\n let needDeletionCheck = true;\n let deletionComparisonTarget = EMPTY_OBJ;\n if (vnode.shapeFlag & 32) {\n const type = children._;\n if (type) {\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n assignSlots(slots, children, optimized);\n trigger(instance, \"set\", \"$slots\");\n } else if (optimized && type === 1) {\n needDeletionCheck = false;\n } else {\n assignSlots(slots, children, optimized);\n }\n } else {\n needDeletionCheck = !children.$stable;\n normalizeObjectSlots(children, slots);\n }\n deletionComparisonTarget = children;\n } else if (children) {\n normalizeVNodeSlots(instance, children);\n deletionComparisonTarget = { default: 1 };\n }\n if (needDeletionCheck) {\n for (const key in slots) {\n if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {\n delete slots[key];\n }\n }\n }\n};\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n if (oldRef != null && oldRef !== ref) {\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (hasOwn(setupState, oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n oldRef.value = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (hasOwn(setupState, ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n ref.value = [refValue];\n if (rawRef.k) refs[rawRef.k] = ref.value;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (hasOwn(setupState, ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n ref.value = value;\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n doSet.id = -1;\n queuePostRenderEffect(doSet, parentSuspense);\n } else {\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\n\nconst TeleportEndKey = Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\"Invalid Teleport target on mount:\", target, `(${typeof target})`);\n }\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n } else if (target) {\n mount(target, targetAnchor);\n }\n } else {\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, true);\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n }\n updateCssVars(n2);\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (isTeleportDisabled(vnode.props)) {\n vnode.anchor = hydrateChildren(\n nextSibling(node),\n vnode,\n parentNode(node),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode.targetStart = targetNode;\n vnode.targetAnchor = targetNode && nextSibling(targetNode);\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode);\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node = vnode.children[0].el;\n while (node && node !== vnode.targetAnchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8 /* COMMENT */;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3 /* TEXT */) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 /* COMMENT */ || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode)) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8 /* COMMENT */) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n if (el.textContent !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${el.textContent}\n - expected on client: ${vnode.children}`\n );\n logMismatchError();\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n let next = children[i + 1];\n if (next && (next = normalizeVNode(next)).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 /* ELEMENT */ && node.tagName.toLowerCase() === \"template\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n actual = el.getAttribute(\"class\");\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = `attribute`;\n mismatchKey = key;\n }\n }\n if (mismatchType) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${mismatchType} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n expectedMap.set(`--${key}`, String(cssVars[key]));\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n if (instance.appContext.config.performance && isSupported()) {\n perf.mark(`vue-${type}-${instance.uid}`);\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n }\n}\nfunction endMeasure(instance, type) {\n if (instance.appContext.config.performance && isSupported()) {\n const startTag = `vue-${type}-${instance.uid}`;\n const endTag = startTag + `:end`;\n perf.mark(endTag);\n perf.measure(\n `<${formatComponentName(instance, instance.type)}> ${type}`,\n startTag,\n endTag\n );\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n }\n}\nfunction isSupported() {\n if (supported !== void 0) {\n return supported;\n }\n if (typeof window !== \"undefined\" && window.performance) {\n supported = true;\n perf = window.performance;\n } else {\n supported = false;\n }\n return supported;\n}\n\nfunction initFeatureFlags() {\n const needWarn = [];\n if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n getGlobalThis().__VUE_OPTIONS_API__ = true;\n }\n if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n }\n if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== \"boolean\") {\n !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);\n getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n const multi = needWarn.length > 1;\n console.warn(\n `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n );\n }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n {\n initFeatureFlags();\n }\n const target = getGlobalThis();\n target.__VUE__ = true;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n }\n const {\n insert: hostInsert,\n remove: hostRemove,\n patchProp: hostPatchProp,\n createElement: hostCreateElement,\n createText: hostCreateText,\n createComment: hostCreateComment,\n setText: hostSetText,\n setElementText: hostSetElementText,\n parentNode: hostParentNode,\n nextSibling: hostNextSibling,\n setScopeId: hostSetScopeId = NOOP,\n insertStaticContent: hostInsertStaticContent\n } = options;\n const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n if (n1 === n2) {\n return;\n }\n if (n1 && !isSameVNodeType(n1, n2)) {\n anchor = getNextHostNode(n1);\n unmount(n1, parentComponent, parentSuspense, true);\n n1 = null;\n }\n if (n2.patchFlag === -2) {\n optimized = false;\n n2.dynamicChildren = null;\n }\n const { type, ref, shapeFlag } = n2;\n switch (type) {\n case Text:\n processText(n1, n2, container, anchor);\n break;\n case Comment:\n processCommentNode(n1, n2, container, anchor);\n break;\n case Static:\n if (n1 == null) {\n mountStaticNode(n2, container, anchor, namespace);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n patchStaticNode(n1, n2, container, namespace);\n }\n break;\n case Fragment:\n processFragment(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n break;\n default:\n if (shapeFlag & 1) {\n processElement(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else if (shapeFlag & 6) {\n processComponent(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else if (shapeFlag & 64) {\n type.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n } else if (shapeFlag & 128) {\n type.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid VNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null && parentComponent) {\n setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n }\n };\n const processText = (n1, n2, container, anchor) => {\n if (n1 == null) {\n hostInsert(\n n2.el = hostCreateText(n2.children),\n container,\n anchor\n );\n } else {\n const el = n2.el = n1.el;\n if (n2.children !== n1.children) {\n hostSetText(el, n2.children);\n }\n }\n };\n const processCommentNode = (n1, n2, container, anchor) => {\n if (n1 == null) {\n hostInsert(\n n2.el = hostCreateComment(n2.children || \"\"),\n container,\n anchor\n );\n } else {\n n2.el = n1.el;\n }\n };\n const mountStaticNode = (n2, container, anchor, namespace) => {\n [n2.el, n2.anchor] = hostInsertStaticContent(\n n2.children,\n container,\n anchor,\n namespace,\n n2.el,\n n2.anchor\n );\n };\n const patchStaticNode = (n1, n2, container, namespace) => {\n if (n2.children !== n1.children) {\n const anchor = hostNextSibling(n1.anchor);\n removeStaticNode(n1);\n [n2.el, n2.anchor] = hostInsertStaticContent(\n n2.children,\n container,\n anchor,\n namespace\n );\n } else {\n n2.el = n1.el;\n n2.anchor = n1.anchor;\n }\n };\n const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n let next;\n while (el && el !== anchor) {\n next = hostNextSibling(el);\n hostInsert(el, container, nextSibling);\n el = next;\n }\n hostInsert(anchor, container, nextSibling);\n };\n const removeStaticNode = ({ el, anchor }) => {\n let next;\n while (el && el !== anchor) {\n next = hostNextSibling(el);\n hostRemove(el);\n el = next;\n }\n hostRemove(anchor);\n };\n const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n if (n2.type === \"svg\") {\n namespace = \"svg\";\n } else if (n2.type === \"math\") {\n namespace = \"mathml\";\n }\n if (n1 == null) {\n mountElement(\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else {\n patchElement(\n n1,\n n2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n let el;\n let vnodeHook;\n const { props, shapeFlag, transition, dirs } = vnode;\n el = vnode.el = hostCreateElement(\n vnode.type,\n namespace,\n props && props.is,\n props\n );\n if (shapeFlag & 8) {\n hostSetElementText(el, vnode.children);\n } else if (shapeFlag & 16) {\n mountChildren(\n vnode.children,\n el,\n null,\n parentComponent,\n parentSuspense,\n resolveChildrenNamespace(vnode, namespace),\n slotScopeIds,\n optimized\n );\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n if (props) {\n for (const key in props) {\n if (key !== \"value\" && !isReservedProp(key)) {\n hostPatchProp(el, key, null, props[key], namespace, parentComponent);\n }\n }\n if (\"value\" in props) {\n hostPatchProp(el, \"value\", null, props.value, namespace);\n }\n if (vnodeHook = props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHook, parentComponent, vnode);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(el, \"__vnode\", vnode, true);\n def(el, \"__vueParentComponent\", parentComponent, true);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n const needCallTransitionHooks = needTransition(parentSuspense, transition);\n if (needCallTransitionHooks) {\n transition.beforeEnter(el);\n }\n hostInsert(el, container, anchor);\n if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n queuePostRenderEffect(() => {\n vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n };\n const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n if (scopeId) {\n hostSetScopeId(el, scopeId);\n }\n if (slotScopeIds) {\n for (let i = 0; i < slotScopeIds.length; i++) {\n hostSetScopeId(el, slotScopeIds[i]);\n }\n }\n if (parentComponent) {\n let subTree = parentComponent.subTree;\n if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n subTree = filterSingleRoot(subTree.children) || subTree;\n }\n if (vnode === subTree) {\n const parentVNode = parentComponent.vnode;\n setScopeId(\n el,\n parentVNode,\n parentVNode.scopeId,\n parentVNode.slotScopeIds,\n parentComponent.parent\n );\n }\n }\n };\n const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {\n for (let i = start; i < children.length; i++) {\n const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n patch(\n null,\n child,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n const el = n2.el = n1.el;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n el.__vnode = n2;\n }\n let { patchFlag, dynamicChildren, dirs } = n2;\n patchFlag |= n1.patchFlag & 16;\n const oldProps = n1.props || EMPTY_OBJ;\n const newProps = n2.props || EMPTY_OBJ;\n let vnodeHook;\n parentComponent && toggleRecurse(parentComponent, false);\n if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n }\n if (dirs) {\n invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n }\n parentComponent && toggleRecurse(parentComponent, true);\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n patchFlag = 0;\n optimized = false;\n dynamicChildren = null;\n }\n if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {\n hostSetElementText(el, \"\");\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n el,\n parentComponent,\n parentSuspense,\n resolveChildrenNamespace(n2, namespace),\n slotScopeIds\n );\n if (!!(process.env.NODE_ENV !== \"production\")) {\n traverseStaticChildren(n1, n2);\n }\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n el,\n null,\n parentComponent,\n parentSuspense,\n resolveChildrenNamespace(n2, namespace),\n slotScopeIds,\n false\n );\n }\n if (patchFlag > 0) {\n if (patchFlag & 16) {\n patchProps(el, oldProps, newProps, parentComponent, namespace);\n } else {\n if (patchFlag & 2) {\n if (oldProps.class !== newProps.class) {\n hostPatchProp(el, \"class\", null, newProps.class, namespace);\n }\n }\n if (patchFlag & 4) {\n hostPatchProp(el, \"style\", oldProps.style, newProps.style, namespace);\n }\n if (patchFlag & 8) {\n const propsToUpdate = n2.dynamicProps;\n for (let i = 0; i < propsToUpdate.length; i++) {\n const key = propsToUpdate[i];\n const prev = oldProps[key];\n const next = newProps[key];\n if (next !== prev || key === \"value\") {\n hostPatchProp(el, key, prev, next, namespace, parentComponent);\n }\n }\n }\n }\n if (patchFlag & 1) {\n if (n1.children !== n2.children) {\n hostSetElementText(el, n2.children);\n }\n }\n } else if (!optimized && dynamicChildren == null) {\n patchProps(el, oldProps, newProps, parentComponent, namespace);\n }\n if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n queuePostRenderEffect(() => {\n vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n }, parentSuspense);\n }\n };\n const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {\n for (let i = 0; i < newChildren.length; i++) {\n const oldVNode = oldChildren[i];\n const newVNode = newChildren[i];\n const container = (\n // oldVNode may be an errored async setup() component inside Suspense\n // which will not have a mounted element\n oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n // of the Fragment itself so it can move its children.\n (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n // which also requires the correct parent container\n !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (\n // In other cases, the parent container is not actually used so we\n // just pass the block element here to avoid a DOM parentNode call.\n fallbackContainer\n )\n );\n patch(\n oldVNode,\n newVNode,\n container,\n null,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n true\n );\n }\n };\n const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {\n if (oldProps !== newProps) {\n if (oldProps !== EMPTY_OBJ) {\n for (const key in oldProps) {\n if (!isReservedProp(key) && !(key in newProps)) {\n hostPatchProp(\n el,\n key,\n oldProps[key],\n null,\n namespace,\n parentComponent\n );\n }\n }\n }\n for (const key in newProps) {\n if (isReservedProp(key)) continue;\n const next = newProps[key];\n const prev = oldProps[key];\n if (next !== prev && key !== \"value\") {\n hostPatchProp(el, key, prev, next, namespace, parentComponent);\n }\n }\n if (\"value\" in newProps) {\n hostPatchProp(el, \"value\", oldProps.value, newProps.value, namespace);\n }\n }\n };\n const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n (isHmrUpdating || patchFlag & 2048)) {\n patchFlag = 0;\n optimized = false;\n dynamicChildren = null;\n }\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n if (n1 == null) {\n hostInsert(fragmentStartAnchor, container, anchor);\n hostInsert(fragmentEndAnchor, container, anchor);\n mountChildren(\n // #10007\n // such fragment like `<></>` will be compiled into\n // a fragment which doesn't have a children.\n // In this case fallback to an empty array\n n2.children || [],\n container,\n fragmentEndAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else {\n if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n // of renderSlot() with no valid children\n n1.dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n container,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n if (!!(process.env.NODE_ENV !== \"production\")) {\n traverseStaticChildren(n1, n2);\n } else if (\n // #2080 if the stable fragment has a key, it's a <template v-for> that may\n // get moved around. Make sure all root level vnodes inherit el.\n // #2134 or if it's a component root, it may also get moved around\n // as the component is being moved.\n n2.key != null || parentComponent && n2 === parentComponent.subTree\n ) {\n traverseStaticChildren(\n n1,\n n2,\n true\n /* shallow */\n );\n }\n } else {\n patchChildren(\n n1,\n n2,\n container,\n fragmentEndAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n }\n };\n const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n n2.slotScopeIds = slotScopeIds;\n if (n1 == null) {\n if (n2.shapeFlag & 512) {\n parentComponent.ctx.activate(\n n2,\n container,\n anchor,\n namespace,\n optimized\n );\n } else {\n mountComponent(\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n optimized\n );\n }\n } else {\n updateComponent(n1, n2, optimized);\n }\n };\n const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {\n const instance = (initialVNode.component = createComponentInstance(\n initialVNode,\n parentComponent,\n parentSuspense\n ));\n if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n registerHMR(instance);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n pushWarningContext(initialVNode);\n startMeasure(instance, `mount`);\n }\n if (isKeepAlive(initialVNode)) {\n instance.ctx.renderer = internals;\n }\n {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `init`);\n }\n setupComponent(instance, false, optimized);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `init`);\n }\n }\n if (instance.asyncDep) {\n parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);\n if (!initialVNode.el) {\n const placeholder = instance.subTree = createVNode(Comment);\n processCommentNode(null, placeholder, container, anchor);\n }\n } else {\n setupRenderEffect(\n instance,\n initialVNode,\n container,\n anchor,\n parentSuspense,\n namespace,\n optimized\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n popWarningContext();\n endMeasure(instance, `mount`);\n }\n };\n const updateComponent = (n1, n2, optimized) => {\n const instance = n2.component = n1.component;\n if (shouldUpdateComponent(n1, n2, optimized)) {\n if (instance.asyncDep && !instance.asyncResolved) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n pushWarningContext(n2);\n }\n updateComponentPreRender(instance, n2, optimized);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n popWarningContext();\n }\n return;\n } else {\n instance.next = n2;\n invalidateJob(instance.update);\n instance.effect.dirty = true;\n instance.update();\n }\n } else {\n n2.el = n1.el;\n instance.vnode = n2;\n }\n };\n const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {\n const componentUpdateFn = () => {\n if (!instance.isMounted) {\n let vnodeHook;\n const { el, props } = initialVNode;\n const { bm, m, parent } = instance;\n const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n toggleRecurse(instance, false);\n if (bm) {\n invokeArrayFns(bm);\n }\n if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n invokeVNodeHook(vnodeHook, parent, initialVNode);\n }\n toggleRecurse(instance, true);\n if (el && hydrateNode) {\n const hydrateSubTree = () => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `render`);\n }\n instance.subTree = renderComponentRoot(instance);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `render`);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `hydrate`);\n }\n hydrateNode(\n el,\n instance.subTree,\n instance,\n parentSuspense,\n null\n );\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `hydrate`);\n }\n };\n if (isAsyncWrapperVNode) {\n initialVNode.type.__asyncLoader().then(\n // note: we are moving the render call into an async callback,\n // which means it won't track dependencies - but it's ok because\n // a server-rendered async wrapper is already in resolved state\n // and it will never need to change.\n () => !instance.isUnmounted && hydrateSubTree()\n );\n } else {\n hydrateSubTree();\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `render`);\n }\n const subTree = instance.subTree = renderComponentRoot(instance);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `render`);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `patch`);\n }\n patch(\n null,\n subTree,\n container,\n anchor,\n instance,\n parentSuspense,\n namespace\n );\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `patch`);\n }\n initialVNode.el = subTree.el;\n }\n if (m) {\n queuePostRenderEffect(m, parentSuspense);\n }\n if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n const scopedInitialVNode = initialVNode;\n queuePostRenderEffect(\n () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n parentSuspense\n );\n }\n if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n }\n instance.isMounted = true;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance);\n }\n initialVNode = container = anchor = null;\n } else {\n let { next, bu, u, parent, vnode } = instance;\n {\n const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);\n if (nonHydratedAsyncRoot) {\n if (next) {\n next.el = vnode.el;\n updateComponentPreRender(instance, next, optimized);\n }\n nonHydratedAsyncRoot.asyncDep.then(() => {\n if (!instance.isUnmounted) {\n componentUpdateFn();\n }\n });\n return;\n }\n }\n let originNext = next;\n let vnodeHook;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n pushWarningContext(next || instance.vnode);\n }\n toggleRecurse(instance, false);\n if (next) {\n next.el = vnode.el;\n updateComponentPreRender(instance, next, optimized);\n } else {\n next = vnode;\n }\n if (bu) {\n invokeArrayFns(bu);\n }\n if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n invokeVNodeHook(vnodeHook, parent, next, vnode);\n }\n toggleRecurse(instance, true);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `render`);\n }\n const nextTree = renderComponentRoot(instance);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `render`);\n }\n const prevTree = instance.subTree;\n instance.subTree = nextTree;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `patch`);\n }\n patch(\n prevTree,\n nextTree,\n // parent may have changed if it's in a teleport\n hostParentNode(prevTree.el),\n // anchor may have changed if it's in a fragment\n getNextHostNode(prevTree),\n instance,\n parentSuspense,\n namespace\n );\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `patch`);\n }\n next.el = nextTree.el;\n if (originNext === null) {\n updateHOCHostEl(instance, nextTree.el);\n }\n if (u) {\n queuePostRenderEffect(u, parentSuspense);\n }\n if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n queuePostRenderEffect(\n () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n parentSuspense\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(instance);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n popWarningContext();\n }\n }\n };\n const effect = instance.effect = new ReactiveEffect(\n componentUpdateFn,\n NOOP,\n () => queueJob(update),\n instance.scope\n // track it in component's effect scope\n );\n const update = instance.update = () => {\n if (effect.dirty) {\n effect.run();\n }\n };\n update.i = instance;\n update.id = instance.uid;\n toggleRecurse(instance, true);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n }\n update();\n };\n const updateComponentPreRender = (instance, nextVNode, optimized) => {\n nextVNode.component = instance;\n const prevProps = instance.vnode.props;\n instance.vnode = nextVNode;\n instance.next = null;\n updateProps(instance, nextVNode.props, prevProps, optimized);\n updateSlots(instance, nextVNode.children, optimized);\n pauseTracking();\n flushPreFlushCbs(instance);\n resetTracking();\n };\n const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {\n const c1 = n1 && n1.children;\n const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n const c2 = n2.children;\n const { patchFlag, shapeFlag } = n2;\n if (patchFlag > 0) {\n if (patchFlag & 128) {\n patchKeyedChildren(\n c1,\n c2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n return;\n } else if (patchFlag & 256) {\n patchUnkeyedChildren(\n c1,\n c2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n return;\n }\n }\n if (shapeFlag & 8) {\n if (prevShapeFlag & 16) {\n unmountChildren(c1, parentComponent, parentSuspense);\n }\n if (c2 !== c1) {\n hostSetElementText(container, c2);\n }\n } else {\n if (prevShapeFlag & 16) {\n if (shapeFlag & 16) {\n patchKeyedChildren(\n c1,\n c2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else {\n unmountChildren(c1, parentComponent, parentSuspense, true);\n }\n } else {\n if (prevShapeFlag & 8) {\n hostSetElementText(container, \"\");\n }\n if (shapeFlag & 16) {\n mountChildren(\n c2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n }\n }\n };\n const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n c1 = c1 || EMPTY_ARR;\n c2 = c2 || EMPTY_ARR;\n const oldLength = c1.length;\n const newLength = c2.length;\n const commonLength = Math.min(oldLength, newLength);\n let i;\n for (i = 0; i < commonLength; i++) {\n const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n patch(\n c1[i],\n nextChild,\n container,\n null,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n if (oldLength > newLength) {\n unmountChildren(\n c1,\n parentComponent,\n parentSuspense,\n true,\n false,\n commonLength\n );\n } else {\n mountChildren(\n c2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n commonLength\n );\n }\n };\n const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n let i = 0;\n const l2 = c2.length;\n let e1 = c1.length - 1;\n let e2 = l2 - 1;\n while (i <= e1 && i <= e2) {\n const n1 = c1[i];\n const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n if (isSameVNodeType(n1, n2)) {\n patch(\n n1,\n n2,\n container,\n null,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else {\n break;\n }\n i++;\n }\n while (i <= e1 && i <= e2) {\n const n1 = c1[e1];\n const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n if (isSameVNodeType(n1, n2)) {\n patch(\n n1,\n n2,\n container,\n null,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else {\n break;\n }\n e1--;\n e2--;\n }\n if (i > e1) {\n if (i <= e2) {\n const nextPos = e2 + 1;\n const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n while (i <= e2) {\n patch(\n null,\n c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n i++;\n }\n }\n } else if (i > e2) {\n while (i <= e1) {\n unmount(c1[i], parentComponent, parentSuspense, true);\n i++;\n }\n } else {\n const s1 = i;\n const s2 = i;\n const keyToNewIndexMap = /* @__PURE__ */ new Map();\n for (i = s2; i <= e2; i++) {\n const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n if (nextChild.key != null) {\n if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n warn$1(\n `Duplicate keys found during update:`,\n JSON.stringify(nextChild.key),\n `Make sure keys are unique.`\n );\n }\n keyToNewIndexMap.set(nextChild.key, i);\n }\n }\n let j;\n let patched = 0;\n const toBePatched = e2 - s2 + 1;\n let moved = false;\n let maxNewIndexSoFar = 0;\n const newIndexToOldIndexMap = new Array(toBePatched);\n for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;\n for (i = s1; i <= e1; i++) {\n const prevChild = c1[i];\n if (patched >= toBePatched) {\n unmount(prevChild, parentComponent, parentSuspense, true);\n continue;\n }\n let newIndex;\n if (prevChild.key != null) {\n newIndex = keyToNewIndexMap.get(prevChild.key);\n } else {\n for (j = s2; j <= e2; j++) {\n if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n newIndex = j;\n break;\n }\n }\n }\n if (newIndex === void 0) {\n unmount(prevChild, parentComponent, parentSuspense, true);\n } else {\n newIndexToOldIndexMap[newIndex - s2] = i + 1;\n if (newIndex >= maxNewIndexSoFar) {\n maxNewIndexSoFar = newIndex;\n } else {\n moved = true;\n }\n patch(\n prevChild,\n c2[newIndex],\n container,\n null,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n patched++;\n }\n }\n const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n j = increasingNewIndexSequence.length - 1;\n for (i = toBePatched - 1; i >= 0; i--) {\n const nextIndex = s2 + i;\n const nextChild = c2[nextIndex];\n const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;\n if (newIndexToOldIndexMap[i] === 0) {\n patch(\n null,\n nextChild,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n } else if (moved) {\n if (j < 0 || i !== increasingNewIndexSequence[j]) {\n move(nextChild, container, anchor, 2);\n } else {\n j--;\n }\n }\n }\n }\n };\n const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n const { el, type, transition, children, shapeFlag } = vnode;\n if (shapeFlag & 6) {\n move(vnode.component.subTree, container, anchor, moveType);\n return;\n }\n if (shapeFlag & 128) {\n vnode.suspense.move(container, anchor, moveType);\n return;\n }\n if (shapeFlag & 64) {\n type.move(vnode, container, anchor, internals);\n return;\n }\n if (type === Fragment) {\n hostInsert(el, container, anchor);\n for (let i = 0; i < children.length; i++) {\n move(children[i], container, anchor, moveType);\n }\n hostInsert(vnode.anchor, container, anchor);\n return;\n }\n if (type === Static) {\n moveStaticNode(vnode, container, anchor);\n return;\n }\n const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;\n if (needTransition2) {\n if (moveType === 0) {\n transition.beforeEnter(el);\n hostInsert(el, container, anchor);\n queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n } else {\n const { leave, delayLeave, afterLeave } = transition;\n const remove2 = () => hostInsert(el, container, anchor);\n const performLeave = () => {\n leave(el, () => {\n remove2();\n afterLeave && afterLeave();\n });\n };\n if (delayLeave) {\n delayLeave(el, remove2, performLeave);\n } else {\n performLeave();\n }\n }\n } else {\n hostInsert(el, container, anchor);\n }\n };\n const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n const {\n type,\n props,\n ref,\n children,\n dynamicChildren,\n shapeFlag,\n patchFlag,\n dirs,\n cacheIndex\n } = vnode;\n if (patchFlag === -2) {\n optimized = false;\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode, true);\n }\n if (cacheIndex != null) {\n parentComponent.renderCache[cacheIndex] = void 0;\n }\n if (shapeFlag & 256) {\n parentComponent.ctx.deactivate(vnode);\n return;\n }\n const shouldInvokeDirs = shapeFlag & 1 && dirs;\n const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n let vnodeHook;\n if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n invokeVNodeHook(vnodeHook, parentComponent, vnode);\n }\n if (shapeFlag & 6) {\n unmountComponent(vnode.component, parentSuspense, doRemove);\n } else {\n if (shapeFlag & 128) {\n vnode.suspense.unmount(parentSuspense, doRemove);\n return;\n }\n if (shouldInvokeDirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n }\n if (shapeFlag & 64) {\n vnode.type.remove(\n vnode,\n parentComponent,\n parentSuspense,\n internals,\n doRemove\n );\n } else if (dynamicChildren && // #5154\n // when v-once is used inside a block, setBlockTracking(-1) marks the\n // parent block with hasOnce: true\n // so that it doesn't take the fast path during unmount - otherwise\n // components nested in v-once are never unmounted.\n !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments\n (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n unmountChildren(\n dynamicChildren,\n parentComponent,\n parentSuspense,\n false,\n true\n );\n } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n unmountChildren(children, parentComponent, parentSuspense);\n }\n if (doRemove) {\n remove(vnode);\n }\n }\n if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {\n queuePostRenderEffect(() => {\n vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n }, parentSuspense);\n }\n };\n const remove = (vnode) => {\n const { type, el, anchor, transition } = vnode;\n if (type === Fragment) {\n if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n vnode.children.forEach((child) => {\n if (child.type === Comment) {\n hostRemove(child.el);\n } else {\n remove(child);\n }\n });\n } else {\n removeFragment(el, anchor);\n }\n return;\n }\n if (type === Static) {\n removeStaticNode(vnode);\n return;\n }\n const performRemove = () => {\n hostRemove(el);\n if (transition && !transition.persisted && transition.afterLeave) {\n transition.afterLeave();\n }\n };\n if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n const { leave, delayLeave } = transition;\n const performLeave = () => leave(el, performRemove);\n if (delayLeave) {\n delayLeave(vnode.el, performRemove, performLeave);\n } else {\n performLeave();\n }\n } else {\n performRemove();\n }\n };\n const removeFragment = (cur, end) => {\n let next;\n while (cur !== end) {\n next = hostNextSibling(cur);\n hostRemove(cur);\n cur = next;\n }\n hostRemove(end);\n };\n const unmountComponent = (instance, parentSuspense, doRemove) => {\n if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n unregisterHMR(instance);\n }\n const { bum, scope, update, subTree, um, m, a } = instance;\n invalidateMount(m);\n invalidateMount(a);\n if (bum) {\n invokeArrayFns(bum);\n }\n scope.stop();\n if (update) {\n update.active = false;\n unmount(subTree, instance, parentSuspense, doRemove);\n }\n if (um) {\n queuePostRenderEffect(um, parentSuspense);\n }\n queuePostRenderEffect(() => {\n instance.isUnmounted = true;\n }, parentSuspense);\n if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {\n parentSuspense.deps--;\n if (parentSuspense.deps === 0) {\n parentSuspense.resolve();\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentRemoved(instance);\n }\n };\n const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n for (let i = start; i < children.length; i++) {\n unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n }\n };\n const getNextHostNode = (vnode) => {\n if (vnode.shapeFlag & 6) {\n return getNextHostNode(vnode.component.subTree);\n }\n if (vnode.shapeFlag & 128) {\n return vnode.suspense.next();\n }\n const el = hostNextSibling(vnode.anchor || vnode.el);\n const teleportEnd = el && el[TeleportEndKey];\n return teleportEnd ? hostNextSibling(teleportEnd) : el;\n };\n let isFlushing = false;\n const render = (vnode, container, namespace) => {\n if (vnode == null) {\n if (container._vnode) {\n unmount(container._vnode, null, null, true);\n }\n } else {\n patch(\n container._vnode || null,\n vnode,\n container,\n null,\n null,\n null,\n namespace\n );\n }\n container._vnode = vnode;\n if (!isFlushing) {\n isFlushing = true;\n flushPreFlushCbs();\n flushPostFlushCbs();\n isFlushing = false;\n }\n };\n const internals = {\n p: patch,\n um: unmount,\n m: move,\n r: remove,\n mt: mountComponent,\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n n: getNextHostNode,\n o: options\n };\n let hydrate;\n let hydrateNode;\n if (createHydrationFns) {\n [hydrate, hydrateNode] = createHydrationFns(\n internals\n );\n }\n return {\n render,\n hydrate,\n createApp: createAppAPI(render, hydrate)\n };\n}\nfunction resolveChildrenNamespace({ type, props }, currentNamespace) {\n return currentNamespace === \"svg\" && type === \"foreignObject\" || currentNamespace === \"mathml\" && type === \"annotation-xml\" && props && props.encoding && props.encoding.includes(\"html\") ? void 0 : currentNamespace;\n}\nfunction toggleRecurse({ effect, update }, allowed) {\n effect.allowRecurse = update.allowRecurse = allowed;\n}\nfunction needTransition(parentSuspense, transition) {\n return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n const ch1 = n1.children;\n const ch2 = n2.children;\n if (isArray(ch1) && isArray(ch2)) {\n for (let i = 0; i < ch1.length; i++) {\n const c1 = ch1[i];\n let c2 = ch2[i];\n if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n c2 = ch2[i] = cloneIfMounted(ch2[i]);\n c2.el = c1.el;\n }\n if (!shallow && c2.patchFlag !== -2)\n traverseStaticChildren(c1, c2);\n }\n if (c2.type === Text) {\n c2.el = c1.el;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && c2.type === Comment && !c2.el) {\n c2.el = c1.el;\n }\n }\n }\n}\nfunction getSequence(arr) {\n const p = arr.slice();\n const result = [0];\n let i, j, u, v, c;\n const len = arr.length;\n for (i = 0; i < len; i++) {\n const arrI = arr[i];\n if (arrI !== 0) {\n j = result[result.length - 1];\n if (arr[j] < arrI) {\n p[i] = j;\n result.push(i);\n continue;\n }\n u = 0;\n v = result.length - 1;\n while (u < v) {\n c = u + v >> 1;\n if (arr[result[c]] < arrI) {\n u = c + 1;\n } else {\n v = c;\n }\n }\n if (arrI < arr[result[u]]) {\n if (u > 0) {\n p[i] = result[u - 1];\n }\n result[u] = i;\n }\n }\n }\n u = result.length;\n v = result[u - 1];\n while (u-- > 0) {\n result[u] = v;\n v = p[v];\n }\n return result;\n}\nfunction locateNonHydratedAsyncRoot(instance) {\n const subComponent = instance.subTree.component;\n if (subComponent) {\n if (subComponent.asyncDep && !subComponent.asyncResolved) {\n return subComponent;\n } else {\n return locateNonHydratedAsyncRoot(subComponent);\n }\n }\n}\nfunction invalidateMount(hooks) {\n if (hooks) {\n for (let i = 0; i < hooks.length; i++) hooks[i].active = false;\n }\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nconst INITIAL_WATCHER_VALUE = {};\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, {\n immediate,\n deep,\n flush,\n once,\n onTrack,\n onTrigger\n} = EMPTY_OBJ) {\n if (cb && once) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n unwatch();\n };\n }\n if (!!(process.env.NODE_ENV !== \"production\") && deep !== void 0 && typeof deep === \"number\") {\n warn$1(\n `watch() \"deep\" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const warnInvalidSource = (s) => {\n warn$1(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const instance = currentInstance;\n const reactiveGetter = (source2) => deep === true ? source2 : (\n // for deep: false, only traverse root-level properties\n traverse(source2, deep === false ? 1 : void 0)\n );\n let getter;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return callWithErrorHandling(s, instance, 2);\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = () => callWithErrorHandling(source, instance, 2);\n } else {\n getter = () => {\n if (cleanup) {\n cleanup();\n }\n return callWithAsyncErrorHandling(\n source,\n instance,\n 3,\n [onCleanup]\n );\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n getter = () => traverse(baseGetter());\n }\n let cleanup;\n let onCleanup = (fn) => {\n cleanup = effect.onStop = () => {\n callWithErrorHandling(fn, instance, 4);\n cleanup = effect.onStop = void 0;\n };\n };\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n onCleanup = NOOP;\n if (!cb) {\n getter();\n } else if (immediate) {\n callWithAsyncErrorHandling(cb, instance, 3, [\n getter(),\n isMultiSource ? [] : void 0,\n onCleanup\n ]);\n }\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else {\n return NOOP;\n }\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = () => {\n if (!effect.active || !effect.dirty) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {\n if (cleanup) {\n cleanup();\n }\n callWithAsyncErrorHandling(cb, instance, 3, [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n onCleanup\n ]);\n oldValue = newValue;\n }\n } else {\n effect.run();\n }\n };\n job.allowRecurse = !!cb;\n let scheduler;\n if (flush === \"sync\") {\n scheduler = job;\n } else if (flush === \"post\") {\n scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);\n } else {\n job.pre = true;\n if (instance) job.id = instance.uid;\n scheduler = () => queueJob(job);\n }\n const effect = new ReactiveEffect(getter, NOOP, scheduler);\n const scope = getCurrentScope();\n const unwatch = () => {\n effect.stop();\n if (scope) {\n remove(scope.effects, effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = onTrack;\n effect.onTrigger = onTrigger;\n }\n if (cb) {\n if (immediate) {\n job();\n } else {\n oldValue = effect.run();\n }\n } else if (flush === \"post\") {\n queuePostRenderEffect(\n effect.run.bind(effect),\n instance && instance.suspense\n );\n } else {\n effect.run();\n }\n if (ssrCleanup) ssrCleanup.push(unwatch);\n return unwatch;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Set();\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nfunction useModel(props, name, options = EMPTY_OBJ) {\n const i = getCurrentInstance();\n if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n warn$1(`useModel() called without active instance.`);\n return ref();\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][name]) {\n warn$1(`useModel() called with prop \"${name}\" which is not declared.`);\n return ref();\n }\n const camelizedName = camelize(name);\n const hyphenatedName = hyphenate(name);\n const modifiers = getModelModifiers(props, name);\n const res = customRef((track, trigger) => {\n let localValue;\n let prevSetValue = EMPTY_OBJ;\n let prevEmittedValue;\n watchSyncEffect(() => {\n const propValue = props[name];\n if (hasChanged(localValue, propValue)) {\n localValue = propValue;\n trigger();\n }\n });\n return {\n get() {\n track();\n return options.get ? options.get(localValue) : localValue;\n },\n set(value) {\n const emittedValue = options.set ? options.set(value) : value;\n if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) {\n return;\n }\n const rawProps = i.vnode.props;\n if (!(rawProps && // check if parent has passed v-model\n (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {\n localValue = value;\n trigger();\n }\n i.emit(`update:${name}`, emittedValue);\n if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) {\n trigger();\n }\n prevSetValue = value;\n prevEmittedValue = emittedValue;\n }\n };\n });\n res[Symbol.iterator] = () => {\n let i2 = 0;\n return {\n next() {\n if (i2 < 2) {\n return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false };\n } else {\n return { done: true };\n }\n }\n };\n };\n return res;\n}\nconst getModelModifiers = (props, modelName) => {\n return modelName === \"modelValue\" || modelName === \"model-value\" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];\n};\n\nfunction emit(instance, event, ...rawArgs) {\n if (instance.isUnmounted) return;\n const props = instance.vnode.props || EMPTY_OBJ;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const {\n emitsOptions,\n propsOptions: [propsOptions]\n } = instance;\n if (emitsOptions) {\n if (!(event in emitsOptions) && true) {\n if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) {\n warn$1(\n `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(camelize(event))}\" prop.`\n );\n }\n } else {\n const validator = emitsOptions[event];\n if (isFunction(validator)) {\n const isValid = validator(...rawArgs);\n if (!isValid) {\n warn$1(\n `Invalid event arguments: event validation failed for event \"${event}\".`\n );\n }\n }\n }\n }\n }\n let args = rawArgs;\n const isModelListener = event.startsWith(\"update:\");\n const modifiers = isModelListener && getModelModifiers(props, event.slice(7));\n if (modifiers) {\n if (modifiers.trim) {\n args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n }\n if (modifiers.number) {\n args = rawArgs.map(looseToNumber);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentEmit(instance, event, args);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n warn$1(\n `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n instance,\n instance.type\n )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n event\n )}\" instead of \"${event}\".`\n );\n }\n }\n let handlerName;\n let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n props[handlerName = toHandlerKey(camelize(event))];\n if (!handler && isModelListener) {\n handler = props[handlerName = toHandlerKey(hyphenate(event))];\n }\n if (handler) {\n callWithAsyncErrorHandling(\n handler,\n instance,\n 6,\n args\n );\n }\n const onceHandler = props[handlerName + `Once`];\n if (onceHandler) {\n if (!instance.emitted) {\n instance.emitted = {};\n } else if (instance.emitted[handlerName]) {\n return;\n }\n instance.emitted[handlerName] = true;\n callWithAsyncErrorHandling(\n onceHandler,\n instance,\n 6,\n args\n );\n }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n const cache = appContext.emitsCache;\n const cached = cache.get(comp);\n if (cached !== void 0) {\n return cached;\n }\n const raw = comp.emits;\n let normalized = {};\n let hasExtends = false;\n if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n const extendEmits = (raw2) => {\n const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n if (normalizedFromExtend) {\n hasExtends = true;\n extend(normalized, normalizedFromExtend);\n }\n };\n if (!asMixin && appContext.mixins.length) {\n appContext.mixins.forEach(extendEmits);\n }\n if (comp.extends) {\n extendEmits(comp.extends);\n }\n if (comp.mixins) {\n comp.mixins.forEach(extendEmits);\n }\n }\n if (!raw && !hasExtends) {\n if (isObject(comp)) {\n cache.set(comp, null);\n }\n return null;\n }\n if (isArray(raw)) {\n raw.forEach((key) => normalized[key] = null);\n } else {\n extend(normalized, raw);\n }\n if (isObject(comp)) {\n cache.set(comp, normalized);\n }\n return normalized;\n}\nfunction isEmitListener(options, key) {\n if (!options || !isOn(key)) {\n return false;\n }\n key = key.slice(2).replace(/Once$/, \"\");\n return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n const {\n type: Component,\n vnode,\n proxy,\n withProxy,\n propsOptions: [propsOptions],\n slots,\n attrs,\n emit,\n render,\n renderCache,\n props,\n data,\n setupState,\n ctx,\n inheritAttrs\n } = instance;\n const prev = setCurrentRenderingInstance(instance);\n let result;\n let fallthroughAttrs;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n accessedAttrs = false;\n }\n try {\n if (vnode.shapeFlag & 4) {\n const proxyToUse = withProxy || proxy;\n const thisProxy = !!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup ? new Proxy(proxyToUse, {\n get(target, key, receiver) {\n warn$1(\n `Property '${String(\n key\n )}' was accessed via 'this'. Avoid using 'this' in templates.`\n );\n return Reflect.get(target, key, receiver);\n }\n }) : proxyToUse;\n result = normalizeVNode(\n render.call(\n thisProxy,\n proxyToUse,\n renderCache,\n !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n setupState,\n data,\n ctx\n )\n );\n fallthroughAttrs = attrs;\n } else {\n const render2 = Component;\n if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n markAttrsAccessed();\n }\n result = normalizeVNode(\n render2.length > 1 ? render2(\n !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n !!(process.env.NODE_ENV !== \"production\") ? {\n get attrs() {\n markAttrsAccessed();\n return shallowReadonly(attrs);\n },\n slots,\n emit\n } : { attrs, slots, emit }\n ) : render2(\n !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n null\n )\n );\n fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n }\n } catch (err) {\n blockStack.length = 0;\n handleError(err, instance, 1);\n result = createVNode(Comment);\n }\n let root = result;\n let setRoot = void 0;\n if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n [root, setRoot] = getChildRoot(result);\n }\n if (fallthroughAttrs && inheritAttrs !== false) {\n const keys = Object.keys(fallthroughAttrs);\n const { shapeFlag } = root;\n if (keys.length) {\n if (shapeFlag & (1 | 6)) {\n if (propsOptions && keys.some(isModelListener)) {\n fallthroughAttrs = filterModelListeners(\n fallthroughAttrs,\n propsOptions\n );\n }\n root = cloneVNode(root, fallthroughAttrs, false, true);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n const allAttrs = Object.keys(attrs);\n const eventAttrs = [];\n const extraAttrs = [];\n for (let i = 0, l = allAttrs.length; i < l; i++) {\n const key = allAttrs[i];\n if (isOn(key)) {\n if (!isModelListener(key)) {\n eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n }\n } else {\n extraAttrs.push(key);\n }\n }\n if (extraAttrs.length) {\n warn$1(\n `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`\n );\n }\n if (eventAttrs.length) {\n warn$1(\n `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n );\n }\n }\n }\n }\n if (vnode.dirs) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n warn$1(\n `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n );\n }\n root = cloneVNode(root, null, false, true);\n root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n }\n if (vnode.transition) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n warn$1(\n `Component inside <Transition> renders non-element root node that cannot be animated.`\n );\n }\n root.transition = vnode.transition;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n setRoot(root);\n } else {\n result = root;\n }\n setCurrentRenderingInstance(prev);\n return result;\n}\nconst getChildRoot = (vnode) => {\n const rawChildren = vnode.children;\n const dynamicChildren = vnode.dynamicChildren;\n const childRoot = filterSingleRoot(rawChildren, false);\n if (!childRoot) {\n return [vnode, void 0];\n } else if (!!(process.env.NODE_ENV !== \"production\") && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {\n return getChildRoot(childRoot);\n }\n const index = rawChildren.indexOf(childRoot);\n const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n const setRoot = (updatedRoot) => {\n rawChildren[index] = updatedRoot;\n if (dynamicChildren) {\n if (dynamicIndex > -1) {\n dynamicChildren[dynamicIndex] = updatedRoot;\n } else if (updatedRoot.patchFlag > 0) {\n vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n }\n }\n };\n return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children, recurse = true) {\n let singleRoot;\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (child.type !== Comment || child.children === \"v-if\") {\n if (singleRoot) {\n return;\n } else {\n singleRoot = child;\n if (!!(process.env.NODE_ENV !== \"production\") && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {\n return filterSingleRoot(singleRoot.children);\n }\n }\n }\n } else {\n return;\n }\n }\n return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n let res;\n for (const key in attrs) {\n if (key === \"class\" || key === \"style\" || isOn(key)) {\n (res || (res = {}))[key] = attrs[key];\n }\n }\n return res;\n};\nconst filterModelListeners = (attrs, props) => {\n const res = {};\n for (const key in attrs) {\n if (!isModelListener(key) || !(key.slice(9) in props)) {\n res[key] = attrs[key];\n }\n }\n return res;\n};\nconst isElementRoot = (vnode) => {\n return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n const { props: prevProps, children: prevChildren, component } = prevVNode;\n const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n const emits = component.emitsOptions;\n if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n return true;\n }\n if (nextVNode.dirs || nextVNode.transition) {\n return true;\n }\n if (optimized && patchFlag >= 0) {\n if (patchFlag & 1024) {\n return true;\n }\n if (patchFlag & 16) {\n if (!prevProps) {\n return !!nextProps;\n }\n return hasPropsChanged(prevProps, nextProps, emits);\n } else if (patchFlag & 8) {\n const dynamicProps = nextVNode.dynamicProps;\n for (let i = 0; i < dynamicProps.length; i++) {\n const key = dynamicProps[i];\n if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {\n return true;\n }\n }\n }\n } else {\n if (prevChildren || nextChildren) {\n if (!nextChildren || !nextChildren.$stable) {\n return true;\n }\n }\n if (prevProps === nextProps) {\n return false;\n }\n if (!prevProps) {\n return !!nextProps;\n }\n if (!nextProps) {\n return true;\n }\n return hasPropsChanged(prevProps, nextProps, emits);\n }\n return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n const nextKeys = Object.keys(nextProps);\n if (nextKeys.length !== Object.keys(prevProps).length) {\n return true;\n }\n for (let i = 0; i < nextKeys.length; i++) {\n const key = nextKeys[i];\n if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {\n return true;\n }\n }\n return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el) {\n while (parent) {\n const root = parent.subTree;\n if (root.suspense && root.suspense.activeBranch === vnode) {\n root.el = vnode.el;\n }\n if (root === vnode) {\n (vnode = parent.vnode).el = el;\n parent = parent.parent;\n } else {\n break;\n }\n }\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nlet suspenseId = 0;\nconst SuspenseImpl = {\n name: \"Suspense\",\n // In order to make Suspense tree-shakable, we need to avoid importing it\n // directly in the renderer. The renderer checks for the __isSuspense flag\n // on a vnode's type and calls the `process` method, passing in renderer\n // internals.\n __isSuspense: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n if (n1 == null) {\n mountSuspense(\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n rendererInternals\n );\n } else {\n if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {\n n2.suspense = n1.suspense;\n n2.suspense.vnode = n2;\n n2.el = n1.el;\n return;\n }\n patchSuspense(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n namespace,\n slotScopeIds,\n optimized,\n rendererInternals\n );\n }\n },\n hydrate: hydrateSuspense,\n normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n const eventListener = vnode.props && vnode.props[name];\n if (isFunction(eventListener)) {\n eventListener();\n }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n const {\n p: patch,\n o: { createElement }\n } = rendererInternals;\n const hiddenContainer = createElement(\"div\");\n const suspense = vnode.suspense = createSuspenseBoundary(\n vnode,\n parentSuspense,\n parentComponent,\n container,\n hiddenContainer,\n anchor,\n namespace,\n slotScopeIds,\n optimized,\n rendererInternals\n );\n patch(\n null,\n suspense.pendingBranch = vnode.ssContent,\n hiddenContainer,\n null,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds\n );\n if (suspense.deps > 0) {\n triggerEvent(vnode, \"onPending\");\n triggerEvent(vnode, \"onFallback\");\n patch(\n null,\n vnode.ssFallback,\n container,\n anchor,\n parentComponent,\n null,\n // fallback tree will not have suspense context\n namespace,\n slotScopeIds\n );\n setActiveBranch(suspense, vnode.ssFallback);\n } else {\n suspense.resolve(false, true);\n }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n const suspense = n2.suspense = n1.suspense;\n suspense.vnode = n2;\n n2.el = n1.el;\n const newBranch = n2.ssContent;\n const newFallback = n2.ssFallback;\n const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n if (pendingBranch) {\n suspense.pendingBranch = newBranch;\n if (isSameVNodeType(newBranch, pendingBranch)) {\n patch(\n pendingBranch,\n newBranch,\n suspense.hiddenContainer,\n null,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n if (suspense.deps <= 0) {\n suspense.resolve();\n } else if (isInFallback) {\n if (!isHydrating) {\n patch(\n activeBranch,\n newFallback,\n container,\n anchor,\n parentComponent,\n null,\n // fallback tree will not have suspense context\n namespace,\n slotScopeIds,\n optimized\n );\n setActiveBranch(suspense, newFallback);\n }\n }\n } else {\n suspense.pendingId = suspenseId++;\n if (isHydrating) {\n suspense.isHydrating = false;\n suspense.activeBranch = pendingBranch;\n } else {\n unmount(pendingBranch, parentComponent, suspense);\n }\n suspense.deps = 0;\n suspense.effects.length = 0;\n suspense.hiddenContainer = createElement(\"div\");\n if (isInFallback) {\n patch(\n null,\n newBranch,\n suspense.hiddenContainer,\n null,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n if (suspense.deps <= 0) {\n suspense.resolve();\n } else {\n patch(\n activeBranch,\n newFallback,\n container,\n anchor,\n parentComponent,\n null,\n // fallback tree will not have suspense context\n namespace,\n slotScopeIds,\n optimized\n );\n setActiveBranch(suspense, newFallback);\n }\n } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n patch(\n activeBranch,\n newBranch,\n container,\n anchor,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n suspense.resolve(true);\n } else {\n patch(\n null,\n newBranch,\n suspense.hiddenContainer,\n null,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n if (suspense.deps <= 0) {\n suspense.resolve();\n }\n }\n }\n } else {\n if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n patch(\n activeBranch,\n newBranch,\n container,\n anchor,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n setActiveBranch(suspense, newBranch);\n } else {\n triggerEvent(n2, \"onPending\");\n suspense.pendingBranch = newBranch;\n if (newBranch.shapeFlag & 512) {\n suspense.pendingId = newBranch.component.suspenseId;\n } else {\n suspense.pendingId = suspenseId++;\n }\n patch(\n null,\n newBranch,\n suspense.hiddenContainer,\n null,\n parentComponent,\n suspense,\n namespace,\n slotScopeIds,\n optimized\n );\n if (suspense.deps <= 0) {\n suspense.resolve();\n } else {\n const { timeout, pendingId } = suspense;\n if (timeout > 0) {\n setTimeout(() => {\n if (suspense.pendingId === pendingId) {\n suspense.fallback(newFallback);\n }\n }, timeout);\n } else if (timeout === 0) {\n suspense.fallback(newFallback);\n }\n }\n }\n }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n hasWarned = true;\n console[console.info ? \"info\" : \"log\"](\n `<Suspense> is an experimental feature and its API will likely change.`\n );\n }\n const {\n p: patch,\n m: move,\n um: unmount,\n n: next,\n o: { parentNode, remove }\n } = rendererInternals;\n let parentSuspenseId;\n const isSuspensible = isVNodeSuspensible(vnode);\n if (isSuspensible) {\n if (parentSuspense && parentSuspense.pendingBranch) {\n parentSuspenseId = parentSuspense.pendingId;\n parentSuspense.deps++;\n }\n }\n const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n assertNumber(timeout, `Suspense timeout`);\n }\n const initialAnchor = anchor;\n const suspense = {\n vnode,\n parent: parentSuspense,\n parentComponent,\n namespace,\n container,\n hiddenContainer,\n deps: 0,\n pendingId: suspenseId++,\n timeout: typeof timeout === \"number\" ? timeout : -1,\n activeBranch: null,\n pendingBranch: null,\n isInFallback: !isHydrating,\n isHydrating,\n isUnmounted: false,\n effects: [],\n resolve(resume = false, sync = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!resume && !suspense.pendingBranch) {\n throw new Error(\n `suspense.resolve() is called without a pending branch.`\n );\n }\n if (suspense.isUnmounted) {\n throw new Error(\n `suspense.resolve() is called on an already unmounted suspense boundary.`\n );\n }\n }\n const {\n vnode: vnode2,\n activeBranch,\n pendingBranch,\n pendingId,\n effects,\n parentComponent: parentComponent2,\n container: container2\n } = suspense;\n let delayEnter = false;\n if (suspense.isHydrating) {\n suspense.isHydrating = false;\n } else if (!resume) {\n delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n if (delayEnter) {\n activeBranch.transition.afterLeave = () => {\n if (pendingId === suspense.pendingId) {\n move(\n pendingBranch,\n container2,\n anchor === initialAnchor ? next(activeBranch) : anchor,\n 0\n );\n queuePostFlushCb(effects);\n }\n };\n }\n if (activeBranch) {\n if (parentNode(activeBranch.el) !== suspense.hiddenContainer) {\n anchor = next(activeBranch);\n }\n unmount(activeBranch, parentComponent2, suspense, true);\n }\n if (!delayEnter) {\n move(pendingBranch, container2, anchor, 0);\n }\n }\n setActiveBranch(suspense, pendingBranch);\n suspense.pendingBranch = null;\n suspense.isInFallback = false;\n let parent = suspense.parent;\n let hasUnresolvedAncestor = false;\n while (parent) {\n if (parent.pendingBranch) {\n parent.effects.push(...effects);\n hasUnresolvedAncestor = true;\n break;\n }\n parent = parent.parent;\n }\n if (!hasUnresolvedAncestor && !delayEnter) {\n queuePostFlushCb(effects);\n }\n suspense.effects = [];\n if (isSuspensible) {\n if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n parentSuspense.deps--;\n if (parentSuspense.deps === 0 && !sync) {\n parentSuspense.resolve();\n }\n }\n }\n triggerEvent(vnode2, \"onResolve\");\n },\n fallback(fallbackVNode) {\n if (!suspense.pendingBranch) {\n return;\n }\n const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;\n triggerEvent(vnode2, \"onFallback\");\n const anchor2 = next(activeBranch);\n const mountFallback = () => {\n if (!suspense.isInFallback) {\n return;\n }\n patch(\n null,\n fallbackVNode,\n container2,\n anchor2,\n parentComponent2,\n null,\n // fallback tree will not have suspense context\n namespace2,\n slotScopeIds,\n optimized\n );\n setActiveBranch(suspense, fallbackVNode);\n };\n const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n if (delayEnter) {\n activeBranch.transition.afterLeave = mountFallback;\n }\n suspense.isInFallback = true;\n unmount(\n activeBranch,\n parentComponent2,\n null,\n // no suspense so unmount hooks fire now\n true\n // shouldRemove\n );\n if (!delayEnter) {\n mountFallback();\n }\n },\n move(container2, anchor2, type) {\n suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n suspense.container = container2;\n },\n next() {\n return suspense.activeBranch && next(suspense.activeBranch);\n },\n registerDep(instance, setupRenderEffect, optimized2) {\n const isInPendingSuspense = !!suspense.pendingBranch;\n if (isInPendingSuspense) {\n suspense.deps++;\n }\n const hydratedEl = instance.vnode.el;\n instance.asyncDep.catch((err) => {\n handleError(err, instance, 0);\n }).then((asyncSetupResult) => {\n if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n return;\n }\n instance.asyncResolved = true;\n const { vnode: vnode2 } = instance;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n pushWarningContext(vnode2);\n }\n handleSetupResult(instance, asyncSetupResult, false);\n if (hydratedEl) {\n vnode2.el = hydratedEl;\n }\n const placeholder = !hydratedEl && instance.subTree.el;\n setupRenderEffect(\n instance,\n vnode2,\n // component may have been moved before resolve.\n // if this is not a hydration, instance.subTree will be the comment\n // placeholder.\n parentNode(hydratedEl || instance.subTree.el),\n // anchor will not be used if this is hydration, so only need to\n // consider the comment placeholder case.\n hydratedEl ? null : next(instance.subTree),\n suspense,\n namespace,\n optimized2\n );\n if (placeholder) {\n remove(placeholder);\n }\n updateHOCHostEl(instance, vnode2.el);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n popWarningContext();\n }\n if (isInPendingSuspense && --suspense.deps === 0) {\n suspense.resolve();\n }\n });\n },\n unmount(parentSuspense2, doRemove) {\n suspense.isUnmounted = true;\n if (suspense.activeBranch) {\n unmount(\n suspense.activeBranch,\n parentComponent,\n parentSuspense2,\n doRemove\n );\n }\n if (suspense.pendingBranch) {\n unmount(\n suspense.pendingBranch,\n parentComponent,\n parentSuspense2,\n doRemove\n );\n }\n }\n };\n return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n const suspense = vnode.suspense = createSuspenseBoundary(\n vnode,\n parentSuspense,\n parentComponent,\n node.parentNode,\n // eslint-disable-next-line no-restricted-globals\n document.createElement(\"div\"),\n null,\n namespace,\n slotScopeIds,\n optimized,\n rendererInternals,\n true\n );\n const result = hydrateNode(\n node,\n suspense.pendingBranch = vnode.ssContent,\n parentComponent,\n suspense,\n slotScopeIds,\n optimized\n );\n if (suspense.deps === 0) {\n suspense.resolve(false, true);\n }\n return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n const { shapeFlag, children } = vnode;\n const isSlotChildren = shapeFlag & 32;\n vnode.ssContent = normalizeSuspenseSlot(\n isSlotChildren ? children.default : children\n );\n vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n let block;\n if (isFunction(s)) {\n const trackBlock = isBlockTreeEnabled && s._c;\n if (trackBlock) {\n s._d = false;\n openBlock();\n }\n s = s();\n if (trackBlock) {\n s._d = true;\n block = currentBlock;\n closeBlock();\n }\n }\n if (isArray(s)) {\n const singleChild = filterSingleRoot(s);\n if (!!(process.env.NODE_ENV !== \"production\") && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {\n warn$1(`<Suspense> slots expect a single root node.`);\n }\n s = singleChild;\n }\n s = normalizeVNode(s);\n if (block && !s.dynamicChildren) {\n s.dynamicChildren = block.filter((c) => c !== s);\n }\n return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n if (suspense && suspense.pendingBranch) {\n if (isArray(fn)) {\n suspense.effects.push(...fn);\n } else {\n suspense.effects.push(fn);\n }\n } else {\n queuePostFlushCb(fn);\n }\n}\nfunction setActiveBranch(suspense, branch) {\n suspense.activeBranch = branch;\n const { vnode, parentComponent } = suspense;\n let el = branch.el;\n while (!el && branch.component) {\n branch = branch.component.subTree;\n el = branch.el;\n }\n vnode.el = el;\n if (parentComponent && parentComponent.subTree === vnode) {\n parentComponent.vnode.el = el;\n updateHOCHostEl(parentComponent, el);\n }\n}\nfunction isVNodeSuspensible(vnode) {\n const suspensible = vnode.props && vnode.props.suspensible;\n return suspensible != null && suspensible !== false;\n}\n\nconst Fragment = Symbol.for(\"v-fgt\");\nconst Text = Symbol.for(\"v-txt\");\nconst Comment = Symbol.for(\"v-cmt\");\nconst Static = Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n blockStack.pop();\n currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value) {\n isBlockTreeEnabled += value;\n if (value < 0 && currentBlock) {\n currentBlock.hasOnce = true;\n }\n}\nfunction setupBlock(vnode) {\n vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n closeBlock();\n if (isBlockTreeEnabled > 0 && currentBlock) {\n currentBlock.push(vnode);\n }\n return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n return setupBlock(\n createBaseVNode(\n type,\n props,\n children,\n patchFlag,\n dynamicProps,\n shapeFlag,\n true\n )\n );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n return setupBlock(\n createVNode(\n type,\n props,\n children,\n patchFlag,\n dynamicProps,\n true\n )\n );\n}\nfunction isVNode(value) {\n return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && n1.component) {\n const dirtyInstances = hmrDirtyComponents.get(n2.type);\n if (dirtyInstances && dirtyInstances.has(n1.component)) {\n n1.shapeFlag &= ~256;\n n2.shapeFlag &= ~512;\n return false;\n }\n }\n return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n return _createVNode(\n ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n );\n};\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n ref,\n ref_key,\n ref_for\n}) => {\n if (typeof ref === \"number\") {\n ref = \"\" + ref;\n }\n return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n const vnode = {\n __v_isVNode: true,\n __v_skip: true,\n type,\n props,\n key: props && normalizeKey(props),\n ref: props && normalizeRef(props),\n scopeId: currentScopeId,\n slotScopeIds: null,\n children,\n component: null,\n suspense: null,\n ssContent: null,\n ssFallback: null,\n dirs: null,\n transition: null,\n el: null,\n anchor: null,\n target: null,\n targetStart: null,\n targetAnchor: null,\n staticCount: 0,\n shapeFlag,\n patchFlag,\n dynamicProps,\n dynamicChildren: null,\n appContext: null,\n ctx: currentRenderingInstance\n };\n if (needFullChildrenNormalization) {\n normalizeChildren(vnode, children);\n if (shapeFlag & 128) {\n type.normalize(vnode);\n }\n } else if (children) {\n vnode.shapeFlag |= isString(children) ? 8 : 16;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n }\n if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n !isBlockNode && // has current parent block\n currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n // component nodes also should always be patched, because even if the\n // component doesn't need to update, it needs to persist the instance on to\n // the next vnode so that it can be properly unmounted later.\n (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n // vnode should not be considered dynamic due to handler caching.\n vnode.patchFlag !== 32) {\n currentBlock.push(vnode);\n }\n return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n if (!type || type === NULL_DYNAMIC_COMPONENT) {\n if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n warn$1(`Invalid vnode type when creating vnode: ${type}.`);\n }\n type = Comment;\n }\n if (isVNode(type)) {\n const cloned = cloneVNode(\n type,\n props,\n true\n /* mergeRef: true */\n );\n if (children) {\n normalizeChildren(cloned, children);\n }\n if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n if (cloned.shapeFlag & 6) {\n currentBlock[currentBlock.indexOf(type)] = cloned;\n } else {\n currentBlock.push(cloned);\n }\n }\n cloned.patchFlag = -2;\n return cloned;\n }\n if (isClassComponent(type)) {\n type = type.__vccOpts;\n }\n if (props) {\n props = guardReactiveProps(props);\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (isObject(style)) {\n if (isProxy(style) && !isArray(style)) {\n style = extend({}, style);\n }\n props.style = normalizeStyle(style);\n }\n }\n const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n type = toRaw(type);\n warn$1(\n `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n `\nComponent that was made reactive: `,\n type\n );\n }\n return createBaseVNode(\n type,\n props,\n children,\n patchFlag,\n dynamicProps,\n shapeFlag,\n isBlockNode,\n true\n );\n}\nfunction guardReactiveProps(props) {\n if (!props) return null;\n return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {\n const { props, ref, patchFlag, children, transition } = vnode;\n const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n const cloned = {\n __v_isVNode: true,\n __v_skip: true,\n type: vnode.type,\n props: mergedProps,\n key: mergedProps && normalizeKey(mergedProps),\n ref: extraProps && extraProps.ref ? (\n // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n // if the vnode itself already has a ref, cloneVNode will need to merge\n // the refs so the single vnode can be set on multiple refs\n mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n ) : ref,\n scopeId: vnode.scopeId,\n slotScopeIds: vnode.slotScopeIds,\n children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n target: vnode.target,\n targetStart: vnode.targetStart,\n targetAnchor: vnode.targetAnchor,\n staticCount: vnode.staticCount,\n shapeFlag: vnode.shapeFlag,\n // if the vnode is cloned with extra props, we can no longer assume its\n // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n // note: preserve flag for fragments since they use the flag for children\n // fast paths only.\n patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n dynamicProps: vnode.dynamicProps,\n dynamicChildren: vnode.dynamicChildren,\n appContext: vnode.appContext,\n dirs: vnode.dirs,\n transition,\n // These should technically only be non-null on mounted VNodes. However,\n // they *should* be copied for kept-alive vnodes. So we just always copy\n // them since them being non-null during a mount doesn't affect the logic as\n // they will simply be overwritten.\n component: vnode.component,\n suspense: vnode.suspense,\n ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n el: vnode.el,\n anchor: vnode.anchor,\n ctx: vnode.ctx,\n ce: vnode.ce\n };\n if (transition && cloneTransition) {\n setTransitionHooks(\n cloned,\n transition.clone(cloned)\n );\n }\n return cloned;\n}\nfunction deepCloneVNode(vnode) {\n const cloned = cloneVNode(vnode);\n if (isArray(vnode.children)) {\n cloned.children = vnode.children.map(deepCloneVNode);\n }\n return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n const vnode = createVNode(Static, null, content);\n vnode.staticCount = numberOfNodes;\n return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n if (child == null || typeof child === \"boolean\") {\n return createVNode(Comment);\n } else if (isArray(child)) {\n return createVNode(\n Fragment,\n null,\n // #3666, avoid reference pollution when reusing vnode\n child.slice()\n );\n } else if (typeof child === \"object\") {\n return cloneIfMounted(child);\n } else {\n return createVNode(Text, null, String(child));\n }\n}\nfunction cloneIfMounted(child) {\n return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n let type = 0;\n const { shapeFlag } = vnode;\n if (children == null) {\n children = null;\n } else if (isArray(children)) {\n type = 16;\n } else if (typeof children === \"object\") {\n if (shapeFlag & (1 | 64)) {\n const slot = children.default;\n if (slot) {\n slot._c && (slot._d = false);\n normalizeChildren(vnode, slot());\n slot._c && (slot._d = true);\n }\n return;\n } else {\n type = 32;\n const slotFlag = children._;\n if (!slotFlag && !isInternalObject(children)) {\n children._ctx = currentRenderingInstance;\n } else if (slotFlag === 3 && currentRenderingInstance) {\n if (currentRenderingInstance.slots._ === 1) {\n children._ = 1;\n } else {\n children._ = 2;\n vnode.patchFlag |= 1024;\n }\n }\n }\n } else if (isFunction(children)) {\n children = { default: children, _ctx: currentRenderingInstance };\n type = 32;\n } else {\n children = String(children);\n if (shapeFlag & 64) {\n type = 16;\n children = [createTextVNode(children)];\n } else {\n type = 8;\n }\n }\n vnode.children = children;\n vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n const ret = {};\n for (let i = 0; i < args.length; i++) {\n const toMerge = args[i];\n for (const key in toMerge) {\n if (key === \"class\") {\n if (ret.class !== toMerge.class) {\n ret.class = normalizeClass([ret.class, toMerge.class]);\n }\n } else if (key === \"style\") {\n ret.style = normalizeStyle([ret.style, toMerge.style]);\n } else if (isOn(key)) {\n const existing = ret[key];\n const incoming = toMerge[key];\n if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n ret[key] = existing ? [].concat(existing, incoming) : incoming;\n }\n } else if (key !== \"\") {\n ret[key] = toMerge[key];\n }\n }\n }\n return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n callWithAsyncErrorHandling(hook, instance, 7, [\n vnode,\n prevVNode\n ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n const type = vnode.type;\n const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n const instance = {\n uid: uid++,\n vnode,\n type,\n parent,\n appContext,\n root: null,\n // to be immediately set\n next: null,\n subTree: null,\n // will be set synchronously right after creation\n effect: null,\n update: null,\n // will be set synchronously right after creation\n scope: new EffectScope(\n true\n /* detached */\n ),\n render: null,\n proxy: null,\n exposed: null,\n exposeProxy: null,\n withProxy: null,\n provides: parent ? parent.provides : Object.create(appContext.provides),\n accessCache: null,\n renderCache: [],\n // local resolved assets\n components: null,\n directives: null,\n // resolved props and emits options\n propsOptions: normalizePropsOptions(type, appContext),\n emitsOptions: normalizeEmitsOptions(type, appContext),\n // emit\n emit: null,\n // to be set immediately\n emitted: null,\n // props default value\n propsDefaults: EMPTY_OBJ,\n // inheritAttrs\n inheritAttrs: type.inheritAttrs,\n // state\n ctx: EMPTY_OBJ,\n data: EMPTY_OBJ,\n props: EMPTY_OBJ,\n attrs: EMPTY_OBJ,\n slots: EMPTY_OBJ,\n refs: EMPTY_OBJ,\n setupState: EMPTY_OBJ,\n setupContext: null,\n // suspense related\n suspense,\n suspenseId: suspense ? suspense.pendingId : 0,\n asyncDep: null,\n asyncResolved: false,\n // lifecycle hooks\n // not using enums here because it results in computed properties\n isMounted: false,\n isUnmounted: false,\n isDeactivated: false,\n bc: null,\n c: null,\n bm: null,\n m: null,\n bu: null,\n u: null,\n um: null,\n bum: null,\n da: null,\n a: null,\n rtg: null,\n rtc: null,\n ec: null,\n sp: null\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n instance.ctx = createDevRenderContext(instance);\n } else {\n instance.ctx = { _: instance };\n }\n instance.root = parent ? parent.root : instance;\n instance.emit = emit.bind(null, instance);\n if (vnode.ce) {\n vnode.ce(instance);\n }\n return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet setInSSRSetupState;\n{\n const g = getGlobalThis();\n const registerGlobalSetter = (key, setter) => {\n let setters;\n if (!(setters = g[key])) setters = g[key] = [];\n setters.push(setter);\n return (v) => {\n if (setters.length > 1) setters.forEach((set) => set(v));\n else setters[0](v);\n };\n };\n internalSetCurrentInstance = registerGlobalSetter(\n `__VUE_INSTANCE_SETTERS__`,\n (v) => currentInstance = v\n );\n setInSSRSetupState = registerGlobalSetter(\n `__VUE_SSR_SETTERS__`,\n (v) => isInSSRComponentSetup = v\n );\n}\nconst setCurrentInstance = (instance) => {\n const prev = currentInstance;\n internalSetCurrentInstance(instance);\n instance.scope.on();\n return () => {\n instance.scope.off();\n internalSetCurrentInstance(prev);\n };\n};\nconst unsetCurrentInstance = () => {\n currentInstance && currentInstance.scope.off();\n internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, { isNativeTag }) {\n if (isBuiltInTag(name) || isNativeTag(name)) {\n warn$1(\n \"Do not use built-in or reserved HTML elements as component id: \" + name\n );\n }\n}\nfunction isStatefulComponent(instance) {\n return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false, optimized = false) {\n isSSR && setInSSRSetupState(isSSR);\n const { props, children } = instance.vnode;\n const isStateful = isStatefulComponent(instance);\n initProps(instance, props, isStateful, isSSR);\n initSlots(instance, children, optimized);\n const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n isSSR && setInSSRSetupState(false);\n return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n var _a;\n const Component = instance.type;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (Component.name) {\n validateComponentName(Component.name, instance.appContext.config);\n }\n if (Component.components) {\n const names = Object.keys(Component.components);\n for (let i = 0; i < names.length; i++) {\n validateComponentName(names[i], instance.appContext.config);\n }\n }\n if (Component.directives) {\n const names = Object.keys(Component.directives);\n for (let i = 0; i < names.length; i++) {\n validateDirectiveName(names[i]);\n }\n }\n if (Component.compilerOptions && isRuntimeOnly()) {\n warn$1(\n `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n );\n }\n }\n instance.accessCache = /* @__PURE__ */ Object.create(null);\n instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n exposePropsOnRenderContext(instance);\n }\n const { setup } = Component;\n if (setup) {\n const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n const reset = setCurrentInstance(instance);\n pauseTracking();\n const setupResult = callWithErrorHandling(\n setup,\n instance,\n 0,\n [\n !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props,\n setupContext\n ]\n );\n resetTracking();\n reset();\n if (isPromise(setupResult)) {\n setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n if (isSSR) {\n return setupResult.then((resolvedResult) => {\n handleSetupResult(instance, resolvedResult, isSSR);\n }).catch((e) => {\n handleError(e, instance, 0);\n });\n } else {\n instance.asyncDep = setupResult;\n if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n const name = (_a = Component.name) != null ? _a : \"Anonymous\";\n warn$1(\n `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n );\n }\n }\n } else {\n handleSetupResult(instance, setupResult, isSSR);\n }\n } else {\n finishComponentSetup(instance, isSSR);\n }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n if (isFunction(setupResult)) {\n if (instance.type.__ssrInlineRender) {\n instance.ssrRender = setupResult;\n } else {\n instance.render = setupResult;\n }\n } else if (isObject(setupResult)) {\n if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n warn$1(\n `setup() should not return VNodes directly - return a render function instead.`\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.devtoolsRawSetupState = setupResult;\n }\n instance.setupState = proxyRefs(setupResult);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n exposeSetupStateOnRenderContext(instance);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n warn$1(\n `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n );\n }\n finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n compile = _compile;\n installWithProxy = (i) => {\n if (i.render._rc) {\n i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n }\n };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n const Component = instance.type;\n if (!instance.render) {\n if (!isSSR && compile && !Component.render) {\n const template = Component.template || resolveMergedOptions(instance).template;\n if (template) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n startMeasure(instance, `compile`);\n }\n const { isCustomElement, compilerOptions } = instance.appContext.config;\n const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n const finalCompilerOptions = extend(\n extend(\n {\n isCustomElement,\n delimiters\n },\n compilerOptions\n ),\n componentCompilerOptions\n );\n Component.render = compile(template, finalCompilerOptions);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n endMeasure(instance, `compile`);\n }\n }\n }\n instance.render = Component.render || NOOP;\n if (installWithProxy) {\n installWithProxy(instance);\n }\n }\n if (__VUE_OPTIONS_API__ && true) {\n const reset = setCurrentInstance(instance);\n pauseTracking();\n try {\n applyOptions(instance);\n } finally {\n resetTracking();\n reset();\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n if (!compile && Component.template) {\n warn$1(\n `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n );\n } else {\n warn$1(`Component is missing template or render function: `, Component);\n }\n }\n}\nconst attrsProxyHandlers = !!(process.env.NODE_ENV !== \"production\") ? {\n get(target, key) {\n markAttrsAccessed();\n track(target, \"get\", \"\");\n return target[key];\n },\n set() {\n warn$1(`setupContext.attrs is readonly.`);\n return false;\n },\n deleteProperty() {\n warn$1(`setupContext.attrs is readonly.`);\n return false;\n }\n} : {\n get(target, key) {\n track(target, \"get\", \"\");\n return target[key];\n }\n};\nfunction getSlotsProxy(instance) {\n return new Proxy(instance.slots, {\n get(target, key) {\n track(instance, \"get\", \"$slots\");\n return target[key];\n }\n });\n}\nfunction createSetupContext(instance) {\n const expose = (exposed) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (instance.exposed) {\n warn$1(`expose() should be called only once per setup().`);\n }\n if (exposed != null) {\n let exposedType = typeof exposed;\n if (exposedType === \"object\") {\n if (isArray(exposed)) {\n exposedType = \"array\";\n } else if (isRef(exposed)) {\n exposedType = \"ref\";\n }\n }\n if (exposedType !== \"object\") {\n warn$1(\n `expose() should be passed a plain object, received ${exposedType}.`\n );\n }\n }\n }\n instance.exposed = exposed || {};\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n let attrsProxy;\n let slotsProxy;\n return Object.freeze({\n get attrs() {\n return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));\n },\n get slots() {\n return slotsProxy || (slotsProxy = getSlotsProxy(instance));\n },\n get emit() {\n return (event, ...args) => instance.emit(event, ...args);\n },\n expose\n });\n } else {\n return {\n attrs: new Proxy(instance.attrs, attrsProxyHandlers),\n slots: instance.slots,\n emit: instance.emit,\n expose\n };\n }\n}\nfunction getComponentPublicInstance(instance) {\n if (instance.exposed) {\n return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n get(target, key) {\n if (key in target) {\n return target[key];\n } else if (key in publicPropertiesMap) {\n return publicPropertiesMap[key](instance);\n }\n },\n has(target, key) {\n return key in target || key in publicPropertiesMap;\n }\n }));\n } else {\n return instance.proxy;\n }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n let name = getComponentName(Component);\n if (!name && Component.__file) {\n const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n if (match) {\n name = match[1];\n }\n }\n if (!name && instance && instance.parent) {\n const inferFromRegistry = (registry) => {\n for (const key in registry) {\n if (registry[key] === Component) {\n return key;\n }\n }\n };\n name = inferFromRegistry(\n instance.components || instance.parent.type.components\n ) || inferFromRegistry(instance.appContext.components);\n }\n return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const i = getCurrentInstance();\n if (i && i.appContext.config.warnRecursiveComputed) {\n c._warnRecursive = true;\n }\n }\n return c;\n};\n\nfunction h(type, propsOrChildren, children) {\n const l = arguments.length;\n if (l === 2) {\n if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n if (isVNode(propsOrChildren)) {\n return createVNode(type, null, [propsOrChildren]);\n }\n return createVNode(type, propsOrChildren);\n } else {\n return createVNode(type, null, propsOrChildren);\n }\n } else {\n if (l > 3) {\n children = Array.prototype.slice.call(arguments, 2);\n } else if (l === 3 && isVNode(children)) {\n children = [children];\n }\n return createVNode(type, propsOrChildren, children);\n }\n}\n\nfunction initCustomFormatter() {\n if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n return;\n }\n const vueStyle = { style: \"color:#3ba776\" };\n const numberStyle = { style: \"color:#1677ff\" };\n const stringStyle = { style: \"color:#f5222d\" };\n const keywordStyle = { style: \"color:#eb2f96\" };\n const formatter = {\n __vue_custom_formatter: true,\n header(obj) {\n if (!isObject(obj)) {\n return null;\n }\n if (obj.__isVue) {\n return [\"div\", vueStyle, `VueInstance`];\n } else if (isRef(obj)) {\n return [\n \"div\",\n {},\n [\"span\", vueStyle, genRefFlag(obj)],\n \"<\",\n formatValue(obj.value),\n `>`\n ];\n } else if (isReactive(obj)) {\n return [\n \"div\",\n {},\n [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n \"<\",\n formatValue(obj),\n `>${isReadonly(obj) ? ` (readonly)` : ``}`\n ];\n } else if (isReadonly(obj)) {\n return [\n \"div\",\n {},\n [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n \"<\",\n formatValue(obj),\n \">\"\n ];\n }\n return null;\n },\n hasBody(obj) {\n return obj && obj.__isVue;\n },\n body(obj) {\n if (obj && obj.__isVue) {\n return [\n \"div\",\n {},\n ...formatInstance(obj.$)\n ];\n }\n }\n };\n function formatInstance(instance) {\n const blocks = [];\n if (instance.type.props && instance.props) {\n blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n }\n if (instance.setupState !== EMPTY_OBJ) {\n blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n }\n if (instance.data !== EMPTY_OBJ) {\n blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n }\n const computed = extractKeys(instance, \"computed\");\n if (computed) {\n blocks.push(createInstanceBlock(\"computed\", computed));\n }\n const injected = extractKeys(instance, \"inject\");\n if (injected) {\n blocks.push(createInstanceBlock(\"injected\", injected));\n }\n blocks.push([\n \"div\",\n {},\n [\n \"span\",\n {\n style: keywordStyle.style + \";opacity:0.66\"\n },\n \"$ (internal): \"\n ],\n [\"object\", { object: instance }]\n ]);\n return blocks;\n }\n function createInstanceBlock(type, target) {\n target = extend({}, target);\n if (!Object.keys(target).length) {\n return [\"span\", {}];\n }\n return [\n \"div\",\n { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n [\n \"div\",\n {\n style: \"color:#476582\"\n },\n type\n ],\n [\n \"div\",\n {\n style: \"padding-left:1.25em\"\n },\n ...Object.keys(target).map((key) => {\n return [\n \"div\",\n {},\n [\"span\", keywordStyle, key + \": \"],\n formatValue(target[key], false)\n ];\n })\n ]\n ];\n }\n function formatValue(v, asRaw = true) {\n if (typeof v === \"number\") {\n return [\"span\", numberStyle, v];\n } else if (typeof v === \"string\") {\n return [\"span\", stringStyle, JSON.stringify(v)];\n } else if (typeof v === \"boolean\") {\n return [\"span\", keywordStyle, v];\n } else if (isObject(v)) {\n return [\"object\", { object: asRaw ? toRaw(v) : v }];\n } else {\n return [\"span\", stringStyle, String(v)];\n }\n }\n function extractKeys(instance, type) {\n const Comp = instance.type;\n if (isFunction(Comp)) {\n return;\n }\n const extracted = {};\n for (const key in instance.ctx) {\n if (isKeyOfType(Comp, key, type)) {\n extracted[key] = instance.ctx[key];\n }\n }\n return extracted;\n }\n function isKeyOfType(Comp, key, type) {\n const opts = Comp[type];\n if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n return true;\n }\n if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n return true;\n }\n if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n return true;\n }\n }\n function genRefFlag(v) {\n if (isShallow(v)) {\n return `ShallowRef`;\n }\n if (v.effect) {\n return `ComputedRef`;\n }\n return `Ref`;\n }\n if (window.devtoolsFormatters) {\n window.devtoolsFormatters.push(formatter);\n } else {\n window.devtoolsFormatters = [formatter];\n }\n}\n\nfunction withMemo(memo, render, cache, index) {\n const cached = cache[index];\n if (cached && isMemoSame(cached, memo)) {\n return cached;\n }\n const ret = render();\n ret.memo = memo.slice();\n ret.cacheIndex = index;\n return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n const prev = cached.memo;\n if (prev.length != memo.length) {\n return false;\n }\n for (let i = 0; i < prev.length; i++) {\n if (hasChanged(prev[i], memo[i])) {\n return false;\n }\n }\n if (isBlockTreeEnabled > 0 && currentBlock) {\n currentBlock.push(cached);\n }\n return true;\n}\n\nconst version = \"3.4.38\";\nconst warn = !!(process.env.NODE_ENV !== \"production\") ? warn$1 : NOOP;\nconst ErrorTypeStrings = ErrorTypeStrings$1 ;\nconst devtools = !!(process.env.NODE_ENV !== \"production\") || true ? devtools$1 : void 0;\nconst setDevtoolsHook = !!(process.env.NODE_ENV !== \"production\") || true ? setDevtoolsHook$1 : NOOP;\nconst _ssrUtils = {\n createComponentInstance,\n setupComponent,\n renderComponentRoot,\n setCurrentRenderingInstance,\n isVNode: isVNode,\n normalizeVNode,\n getComponentPublicInstance,\n ensureValidVNode\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\nconst DeprecationTypes = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useModel, useSSRContext, useSlots, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n", "/**\n* @vue/runtime-dom v3.4.38\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { h, BaseTransition, BaseTransitionPropsValidators, assertNumber, getCurrentInstance, warn, onBeforeMount, watchPostEffect, onMounted, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, isRuntimeOnly, createRenderer, createHydrationRenderer } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { extend, isObject, toNumber, isArray, isString, hyphenate, capitalize, includeBooleanAttr, isSymbol, isSpecialBooleanAttr, isFunction, NOOP, isOn, isModelListener, camelize as camelize$1, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst mathmlNS = \"http://www.w3.org/1998/Math/MathML\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n insert: (child, parent, anchor) => {\n parent.insertBefore(child, anchor || null);\n },\n remove: (child) => {\n const parent = child.parentNode;\n if (parent) {\n parent.removeChild(child);\n }\n },\n createElement: (tag, namespace, is, props) => {\n const el = namespace === \"svg\" ? doc.createElementNS(svgNS, tag) : namespace === \"mathml\" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);\n if (tag === \"select\" && props && props.multiple != null) {\n el.setAttribute(\"multiple\", props.multiple);\n }\n return el;\n },\n createText: (text) => doc.createTextNode(text),\n createComment: (text) => doc.createComment(text),\n setText: (node, text) => {\n node.nodeValue = text;\n },\n setElementText: (el, text) => {\n el.textContent = text;\n },\n parentNode: (node) => node.parentNode,\n nextSibling: (node) => node.nextSibling,\n querySelector: (selector) => doc.querySelector(selector),\n setScopeId(el, id) {\n el.setAttribute(id, \"\");\n },\n // __UNSAFE__\n // Reason: innerHTML.\n // Static content here can only come from compiled templates.\n // As long as the user only uses trusted templates, this is safe.\n insertStaticContent(content, parent, anchor, namespace, start, end) {\n const before = anchor ? anchor.previousSibling : parent.lastChild;\n if (start && (start === end || start.nextSibling)) {\n while (true) {\n parent.insertBefore(start.cloneNode(true), anchor);\n if (start === end || !(start = start.nextSibling)) break;\n }\n } else {\n templateContainer.innerHTML = namespace === \"svg\" ? `<svg>${content}</svg>` : namespace === \"mathml\" ? `<math>${content}</math>` : content;\n const template = templateContainer.content;\n if (namespace === \"svg\" || namespace === \"mathml\") {\n const wrapper = template.firstChild;\n while (wrapper.firstChild) {\n template.appendChild(wrapper.firstChild);\n }\n template.removeChild(wrapper);\n }\n parent.insertBefore(template, anchor);\n }\n return [\n // first\n before ? before.nextSibling : parent.firstChild,\n // last\n anchor ? anchor.previousSibling : parent.lastChild\n ];\n }\n};\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst vtcKey = Symbol(\"_vtc\");\nconst Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);\nTransition.displayName = \"Transition\";\nconst DOMTransitionPropsValidators = {\n name: String,\n type: String,\n css: {\n type: Boolean,\n default: true\n },\n duration: [String, Number, Object],\n enterFromClass: String,\n enterActiveClass: String,\n enterToClass: String,\n appearFromClass: String,\n appearActiveClass: String,\n appearToClass: String,\n leaveFromClass: String,\n leaveActiveClass: String,\n leaveToClass: String\n};\nconst TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(\n {},\n BaseTransitionPropsValidators,\n DOMTransitionPropsValidators\n);\nconst callHook = (hook, args = []) => {\n if (isArray(hook)) {\n hook.forEach((h2) => h2(...args));\n } else if (hook) {\n hook(...args);\n }\n};\nconst hasExplicitCallback = (hook) => {\n return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n const baseProps = {};\n for (const key in rawProps) {\n if (!(key in DOMTransitionPropsValidators)) {\n baseProps[key] = rawProps[key];\n }\n }\n if (rawProps.css === false) {\n return baseProps;\n }\n const {\n name = \"v\",\n type,\n duration,\n enterFromClass = `${name}-enter-from`,\n enterActiveClass = `${name}-enter-active`,\n enterToClass = `${name}-enter-to`,\n appearFromClass = enterFromClass,\n appearActiveClass = enterActiveClass,\n appearToClass = enterToClass,\n leaveFromClass = `${name}-leave-from`,\n leaveActiveClass = `${name}-leave-active`,\n leaveToClass = `${name}-leave-to`\n } = rawProps;\n const durations = normalizeDuration(duration);\n const enterDuration = durations && durations[0];\n const leaveDuration = durations && durations[1];\n const {\n onBeforeEnter,\n onEnter,\n onEnterCancelled,\n onLeave,\n onLeaveCancelled,\n onBeforeAppear = onBeforeEnter,\n onAppear = onEnter,\n onAppearCancelled = onEnterCancelled\n } = baseProps;\n const finishEnter = (el, isAppear, done) => {\n removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n done && done();\n };\n const finishLeave = (el, done) => {\n el._isLeaving = false;\n removeTransitionClass(el, leaveFromClass);\n removeTransitionClass(el, leaveToClass);\n removeTransitionClass(el, leaveActiveClass);\n done && done();\n };\n const makeEnterHook = (isAppear) => {\n return (el, done) => {\n const hook = isAppear ? onAppear : onEnter;\n const resolve = () => finishEnter(el, isAppear, done);\n callHook(hook, [el, resolve]);\n nextFrame(() => {\n removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n if (!hasExplicitCallback(hook)) {\n whenTransitionEnds(el, type, enterDuration, resolve);\n }\n });\n };\n };\n return extend(baseProps, {\n onBeforeEnter(el) {\n callHook(onBeforeEnter, [el]);\n addTransitionClass(el, enterFromClass);\n addTransitionClass(el, enterActiveClass);\n },\n onBeforeAppear(el) {\n callHook(onBeforeAppear, [el]);\n addTransitionClass(el, appearFromClass);\n addTransitionClass(el, appearActiveClass);\n },\n onEnter: makeEnterHook(false),\n onAppear: makeEnterHook(true),\n onLeave(el, done) {\n el._isLeaving = true;\n const resolve = () => finishLeave(el, done);\n addTransitionClass(el, leaveFromClass);\n addTransitionClass(el, leaveActiveClass);\n forceReflow();\n nextFrame(() => {\n if (!el._isLeaving) {\n return;\n }\n removeTransitionClass(el, leaveFromClass);\n addTransitionClass(el, leaveToClass);\n if (!hasExplicitCallback(onLeave)) {\n whenTransitionEnds(el, type, leaveDuration, resolve);\n }\n });\n callHook(onLeave, [el, resolve]);\n },\n onEnterCancelled(el) {\n finishEnter(el, false);\n callHook(onEnterCancelled, [el]);\n },\n onAppearCancelled(el) {\n finishEnter(el, true);\n callHook(onAppearCancelled, [el]);\n },\n onLeaveCancelled(el) {\n finishLeave(el);\n callHook(onLeaveCancelled, [el]);\n }\n });\n}\nfunction normalizeDuration(duration) {\n if (duration == null) {\n return null;\n } else if (isObject(duration)) {\n return [NumberOf(duration.enter), NumberOf(duration.leave)];\n } else {\n const n = NumberOf(duration);\n return [n, n];\n }\n}\nfunction NumberOf(val) {\n const res = toNumber(val);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n assertNumber(res, \"<transition> explicit duration\");\n }\n return res;\n}\nfunction addTransitionClass(el, cls) {\n cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n const _vtc = el[vtcKey];\n if (_vtc) {\n _vtc.delete(cls);\n if (!_vtc.size) {\n el[vtcKey] = void 0;\n }\n }\n}\nfunction nextFrame(cb) {\n requestAnimationFrame(() => {\n requestAnimationFrame(cb);\n });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n const id = el._endId = ++endId;\n const resolveIfNotStale = () => {\n if (id === el._endId) {\n resolve();\n }\n };\n if (explicitTimeout) {\n return setTimeout(resolveIfNotStale, explicitTimeout);\n }\n const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n if (!type) {\n return resolve();\n }\n const endEvent = type + \"end\";\n let ended = 0;\n const end = () => {\n el.removeEventListener(endEvent, onEnd);\n resolveIfNotStale();\n };\n const onEnd = (e) => {\n if (e.target === el && ++ended >= propCount) {\n end();\n }\n };\n setTimeout(() => {\n if (ended < propCount) {\n end();\n }\n }, timeout + 1);\n el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n const styles = window.getComputedStyle(el);\n const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n const animationTimeout = getTimeout(animationDelays, animationDurations);\n let type = null;\n let timeout = 0;\n let propCount = 0;\n if (expectedType === TRANSITION) {\n if (transitionTimeout > 0) {\n type = TRANSITION;\n timeout = transitionTimeout;\n propCount = transitionDurations.length;\n }\n } else if (expectedType === ANIMATION) {\n if (animationTimeout > 0) {\n type = ANIMATION;\n timeout = animationTimeout;\n propCount = animationDurations.length;\n }\n } else {\n timeout = Math.max(transitionTimeout, animationTimeout);\n type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n }\n const hasTransform = type === TRANSITION && /\\b(transform|all)(,|$)/.test(\n getStyleProperties(`${TRANSITION}Property`).toString()\n );\n return {\n type,\n timeout,\n propCount,\n hasTransform\n };\n}\nfunction getTimeout(delays, durations) {\n while (delays.length < durations.length) {\n delays = delays.concat(delays);\n }\n return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n if (s === \"auto\") return 0;\n return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow() {\n return document.body.offsetHeight;\n}\n\nfunction patchClass(el, value, isSVG) {\n const transitionClasses = el[vtcKey];\n if (transitionClasses) {\n value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n }\n if (value == null) {\n el.removeAttribute(\"class\");\n } else if (isSVG) {\n el.setAttribute(\"class\", value);\n } else {\n el.className = value;\n }\n}\n\nconst vShowOriginalDisplay = Symbol(\"_vod\");\nconst vShowHidden = Symbol(\"_vsh\");\nconst vShow = {\n beforeMount(el, { value }, { transition }) {\n el[vShowOriginalDisplay] = el.style.display === \"none\" ? \"\" : el.style.display;\n if (transition && value) {\n transition.beforeEnter(el);\n } else {\n setDisplay(el, value);\n }\n },\n mounted(el, { value }, { transition }) {\n if (transition && value) {\n transition.enter(el);\n }\n },\n updated(el, { value, oldValue }, { transition }) {\n if (!value === !oldValue) return;\n if (transition) {\n if (value) {\n transition.beforeEnter(el);\n setDisplay(el, true);\n transition.enter(el);\n } else {\n transition.leave(el, () => {\n setDisplay(el, false);\n });\n }\n } else {\n setDisplay(el, value);\n }\n },\n beforeUnmount(el, { value }) {\n setDisplay(el, value);\n }\n};\nif (!!(process.env.NODE_ENV !== \"production\")) {\n vShow.name = \"show\";\n}\nfunction setDisplay(el, value) {\n el.style.display = value ? el[vShowOriginalDisplay] : \"none\";\n el[vShowHidden] = !value;\n}\nfunction initVShowForSSR() {\n vShow.getSSRProps = ({ value }) => {\n if (!value) {\n return { style: { display: \"none\" } };\n }\n };\n}\n\nconst CSS_VAR_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"CSS_VAR_TEXT\" : \"\");\nfunction useCssVars(getter) {\n const instance = getCurrentInstance();\n if (!instance) {\n !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n return;\n }\n const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n Array.from(\n document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n ).forEach((node) => setVarsOnNode(node, vars));\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n instance.getCssVars = () => getter(instance.proxy);\n }\n const setVars = () => {\n const vars = getter(instance.proxy);\n setVarsOnVNode(instance.subTree, vars);\n updateTeleports(vars);\n };\n onBeforeMount(() => {\n watchPostEffect(setVars);\n });\n onMounted(() => {\n const ob = new MutationObserver(setVars);\n ob.observe(instance.subTree.el.parentNode, { childList: true });\n onUnmounted(() => ob.disconnect());\n });\n}\nfunction setVarsOnVNode(vnode, vars) {\n if (vnode.shapeFlag & 128) {\n const suspense = vnode.suspense;\n vnode = suspense.activeBranch;\n if (suspense.pendingBranch && !suspense.isHydrating) {\n suspense.effects.push(() => {\n setVarsOnVNode(suspense.activeBranch, vars);\n });\n }\n }\n while (vnode.component) {\n vnode = vnode.component.subTree;\n }\n if (vnode.shapeFlag & 1 && vnode.el) {\n setVarsOnNode(vnode.el, vars);\n } else if (vnode.type === Fragment) {\n vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n } else if (vnode.type === Static) {\n let { el, anchor } = vnode;\n while (el) {\n setVarsOnNode(el, vars);\n if (el === anchor) break;\n el = el.nextSibling;\n }\n }\n}\nfunction setVarsOnNode(el, vars) {\n if (el.nodeType === 1) {\n const style = el.style;\n let cssText = \"\";\n for (const key in vars) {\n style.setProperty(`--${key}`, vars[key]);\n cssText += `--${key}: ${vars[key]};`;\n }\n style[CSS_VAR_TEXT] = cssText;\n }\n}\n\nconst displayRE = /(^|;)\\s*display\\s*:/;\nfunction patchStyle(el, prev, next) {\n const style = el.style;\n const isCssString = isString(next);\n let hasControlledDisplay = false;\n if (next && !isCssString) {\n if (prev) {\n if (!isString(prev)) {\n for (const key in prev) {\n if (next[key] == null) {\n setStyle(style, key, \"\");\n }\n }\n } else {\n for (const prevStyle of prev.split(\";\")) {\n const key = prevStyle.slice(0, prevStyle.indexOf(\":\")).trim();\n if (next[key] == null) {\n setStyle(style, key, \"\");\n }\n }\n }\n }\n for (const key in next) {\n if (key === \"display\") {\n hasControlledDisplay = true;\n }\n setStyle(style, key, next[key]);\n }\n } else {\n if (isCssString) {\n if (prev !== next) {\n const cssVarText = style[CSS_VAR_TEXT];\n if (cssVarText) {\n next += \";\" + cssVarText;\n }\n style.cssText = next;\n hasControlledDisplay = displayRE.test(next);\n }\n } else if (prev) {\n el.removeAttribute(\"style\");\n }\n }\n if (vShowOriginalDisplay in el) {\n el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : \"\";\n if (el[vShowHidden]) {\n style.display = \"none\";\n }\n }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n if (isArray(val)) {\n val.forEach((v) => setStyle(style, name, v));\n } else {\n if (val == null) val = \"\";\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (semicolonRE.test(val)) {\n warn(\n `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n );\n }\n }\n if (name.startsWith(\"--\")) {\n style.setProperty(name, val);\n } else {\n const prefixed = autoPrefix(style, name);\n if (importantRE.test(val)) {\n style.setProperty(\n hyphenate(prefixed),\n val.replace(importantRE, \"\"),\n \"important\"\n );\n } else {\n style[prefixed] = val;\n }\n }\n }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n const cached = prefixCache[rawName];\n if (cached) {\n return cached;\n }\n let name = camelize(rawName);\n if (name !== \"filter\" && name in style) {\n return prefixCache[rawName] = name;\n }\n name = capitalize(name);\n for (let i = 0; i < prefixes.length; i++) {\n const prefixed = prefixes[i] + name;\n if (prefixed in style) {\n return prefixCache[rawName] = prefixed;\n }\n }\n return rawName;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {\n if (isSVG && key.startsWith(\"xlink:\")) {\n if (value == null) {\n el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n } else {\n el.setAttributeNS(xlinkNS, key, value);\n }\n } else {\n if (value == null || isBoolean && !includeBooleanAttr(value)) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(\n key,\n isBoolean ? \"\" : isSymbol(value) ? String(value) : value\n );\n }\n }\n}\n\nfunction patchDOMProp(el, key, value, parentComponent) {\n if (key === \"innerHTML\" || key === \"textContent\") {\n if (value == null) return;\n el[key] = value;\n return;\n }\n const tag = el.tagName;\n if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n !tag.includes(\"-\")) {\n const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") || \"\" : el.value;\n const newValue = value == null ? \"\" : String(value);\n if (oldValue !== newValue || !(\"_value\" in el)) {\n el.value = newValue;\n }\n if (value == null) {\n el.removeAttribute(key);\n }\n el._value = value;\n return;\n }\n let needRemove = false;\n if (value === \"\" || value == null) {\n const type = typeof el[key];\n if (type === \"boolean\") {\n value = includeBooleanAttr(value);\n } else if (value == null && type === \"string\") {\n value = \"\";\n needRemove = true;\n } else if (type === \"number\") {\n value = 0;\n needRemove = true;\n }\n }\n try {\n el[key] = value;\n } catch (e) {\n if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n warn(\n `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n e\n );\n }\n }\n needRemove && el.removeAttribute(key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n el.removeEventListener(event, handler, options);\n}\nconst veiKey = Symbol(\"_vei\");\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n const invokers = el[veiKey] || (el[veiKey] = {});\n const existingInvoker = invokers[rawName];\n if (nextValue && existingInvoker) {\n existingInvoker.value = !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue;\n } else {\n const [name, options] = parseName(rawName);\n if (nextValue) {\n const invoker = invokers[rawName] = createInvoker(\n !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue,\n instance\n );\n addEventListener(el, name, invoker, options);\n } else if (existingInvoker) {\n removeEventListener(el, name, existingInvoker, options);\n invokers[rawName] = void 0;\n }\n }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n let options;\n if (optionsModifierRE.test(name)) {\n options = {};\n let m;\n while (m = name.match(optionsModifierRE)) {\n name = name.slice(0, name.length - m[0].length);\n options[m[0].toLowerCase()] = true;\n }\n }\n const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n const invoker = (e) => {\n if (!e._vts) {\n e._vts = Date.now();\n } else if (e._vts <= invoker.attached) {\n return;\n }\n callWithAsyncErrorHandling(\n patchStopImmediatePropagation(e, invoker.value),\n instance,\n 5,\n [e]\n );\n };\n invoker.value = initialValue;\n invoker.attached = getNow();\n return invoker;\n}\nfunction sanitizeEventValue(value, propName) {\n if (isFunction(value) || isArray(value)) {\n return value;\n }\n warn(\n `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`\n );\n return NOOP;\n}\nfunction patchStopImmediatePropagation(e, value) {\n if (isArray(value)) {\n const originalStop = e.stopImmediatePropagation;\n e.stopImmediatePropagation = () => {\n originalStop.call(e);\n e._stopped = true;\n };\n return value.map(\n (fn) => (e2) => !e2._stopped && fn && fn(e2)\n );\n } else {\n return value;\n }\n}\n\nconst isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter\nkey.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;\nconst patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {\n const isSVG = namespace === \"svg\";\n if (key === \"class\") {\n patchClass(el, nextValue, isSVG);\n } else if (key === \"style\") {\n patchStyle(el, prevValue, nextValue);\n } else if (isOn(key)) {\n if (!isModelListener(key)) {\n patchEvent(el, key, prevValue, nextValue, parentComponent);\n }\n } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n patchDOMProp(el, key, nextValue);\n if (!el.tagName.includes(\"-\") && (key === \"value\" || key === \"checked\" || key === \"selected\")) {\n patchAttr(el, key, nextValue, isSVG, parentComponent, key !== \"value\");\n }\n } else {\n if (key === \"true-value\") {\n el._trueValue = nextValue;\n } else if (key === \"false-value\") {\n el._falseValue = nextValue;\n }\n patchAttr(el, key, nextValue, isSVG);\n }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n if (isSVG) {\n if (key === \"innerHTML\" || key === \"textContent\") {\n return true;\n }\n if (key in el && isNativeOn(key) && isFunction(value)) {\n return true;\n }\n return false;\n }\n if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\") {\n return false;\n }\n if (key === \"form\") {\n return false;\n }\n if (key === \"list\" && el.tagName === \"INPUT\") {\n return false;\n }\n if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n return false;\n }\n if (key === \"width\" || key === \"height\") {\n const tag = el.tagName;\n if (tag === \"IMG\" || tag === \"VIDEO\" || tag === \"CANVAS\" || tag === \"SOURCE\") {\n return false;\n }\n }\n if (isNativeOn(key) && isString(value)) {\n return false;\n }\n return key in el;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineCustomElement(options, extraOptions, hydrate2) {\n const Comp = defineComponent(options, extraOptions);\n class VueCustomElement extends VueElement {\n constructor(initialProps) {\n super(Comp, initialProps, hydrate2);\n }\n }\n VueCustomElement.def = Comp;\n return VueCustomElement;\n}\n/*! #__NO_SIDE_EFFECTS__ */\nconst defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {\n return /* @__PURE__ */ defineCustomElement(options, extraOptions, hydrate);\n};\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n constructor(_def, _props = {}, hydrate2) {\n super();\n this._def = _def;\n this._props = _props;\n /**\n * @internal\n */\n this._instance = null;\n this._connected = false;\n this._resolved = false;\n this._numberProps = null;\n this._ob = null;\n if (this.shadowRoot && hydrate2) {\n hydrate2(this._createVNode(), this.shadowRoot);\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n warn(\n `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n );\n }\n this.attachShadow({ mode: \"open\" });\n if (!this._def.__asyncLoader) {\n this._resolveProps(this._def);\n }\n }\n }\n connectedCallback() {\n this._connected = true;\n if (!this._instance) {\n if (this._resolved) {\n this._update();\n } else {\n this._resolveDef();\n }\n }\n }\n disconnectedCallback() {\n this._connected = false;\n nextTick(() => {\n if (!this._connected) {\n if (this._ob) {\n this._ob.disconnect();\n this._ob = null;\n }\n render(null, this.shadowRoot);\n this._instance = null;\n }\n });\n }\n /**\n * resolve inner component definition (handle possible async component)\n */\n _resolveDef() {\n this._resolved = true;\n for (let i = 0; i < this.attributes.length; i++) {\n this._setAttr(this.attributes[i].name);\n }\n this._ob = new MutationObserver((mutations) => {\n for (const m of mutations) {\n this._setAttr(m.attributeName);\n }\n });\n this._ob.observe(this, { attributes: true });\n const resolve = (def, isAsync = false) => {\n const { props, styles } = def;\n let numberProps;\n if (props && !isArray(props)) {\n for (const key in props) {\n const opt = props[key];\n if (opt === Number || opt && opt.type === Number) {\n if (key in this._props) {\n this._props[key] = toNumber(this._props[key]);\n }\n (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n }\n }\n }\n this._numberProps = numberProps;\n if (isAsync) {\n this._resolveProps(def);\n }\n this._applyStyles(styles);\n this._update();\n };\n const asyncDef = this._def.__asyncLoader;\n if (asyncDef) {\n asyncDef().then((def) => resolve(def, true));\n } else {\n resolve(this._def);\n }\n }\n _resolveProps(def) {\n const { props } = def;\n const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n for (const key of Object.keys(this)) {\n if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n this._setProp(key, this[key], true, false);\n }\n }\n for (const key of declaredPropKeys.map(camelize$1)) {\n Object.defineProperty(this, key, {\n get() {\n return this._getProp(key);\n },\n set(val) {\n this._setProp(key, val);\n }\n });\n }\n }\n _setAttr(key) {\n let value = this.hasAttribute(key) ? this.getAttribute(key) : void 0;\n const camelKey = camelize$1(key);\n if (this._numberProps && this._numberProps[camelKey]) {\n value = toNumber(value);\n }\n this._setProp(camelKey, value, false);\n }\n /**\n * @internal\n */\n _getProp(key) {\n return this._props[key];\n }\n /**\n * @internal\n */\n _setProp(key, val, shouldReflect = true, shouldUpdate = true) {\n if (val !== this._props[key]) {\n this._props[key] = val;\n if (shouldUpdate && this._instance) {\n this._update();\n }\n if (shouldReflect) {\n if (val === true) {\n this.setAttribute(hyphenate(key), \"\");\n } else if (typeof val === \"string\" || typeof val === \"number\") {\n this.setAttribute(hyphenate(key), val + \"\");\n } else if (!val) {\n this.removeAttribute(hyphenate(key));\n }\n }\n }\n }\n _update() {\n render(this._createVNode(), this.shadowRoot);\n }\n _createVNode() {\n const vnode = createVNode(this._def, extend({}, this._props));\n if (!this._instance) {\n vnode.ce = (instance) => {\n this._instance = instance;\n instance.isCE = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n instance.ceReload = (newStyles) => {\n if (this._styles) {\n this._styles.forEach((s) => this.shadowRoot.removeChild(s));\n this._styles.length = 0;\n }\n this._applyStyles(newStyles);\n this._instance = null;\n this._update();\n };\n }\n const dispatch = (event, args) => {\n this.dispatchEvent(\n new CustomEvent(event, {\n detail: args\n })\n );\n };\n instance.emit = (event, ...args) => {\n dispatch(event, args);\n if (hyphenate(event) !== event) {\n dispatch(hyphenate(event), args);\n }\n };\n let parent = this;\n while (parent = parent && (parent.parentNode || parent.host)) {\n if (parent instanceof VueElement) {\n instance.parent = parent._instance;\n instance.provides = parent._instance.provides;\n break;\n }\n }\n };\n }\n return vnode;\n }\n _applyStyles(styles) {\n if (styles) {\n styles.forEach((css) => {\n const s = document.createElement(\"style\");\n s.textContent = css;\n this.shadowRoot.appendChild(s);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (this._styles || (this._styles = [])).push(s);\n }\n });\n }\n }\n}\n\nfunction useCssModule(name = \"$style\") {\n {\n const instance = getCurrentInstance();\n if (!instance) {\n !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n return EMPTY_OBJ;\n }\n const modules = instance.type.__cssModules;\n if (!modules) {\n !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n return EMPTY_OBJ;\n }\n const mod = modules[name];\n if (!mod) {\n !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n return EMPTY_OBJ;\n }\n return mod;\n }\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst moveCbKey = Symbol(\"_moveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nconst TransitionGroupImpl = {\n name: \"TransitionGroup\",\n props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n tag: String,\n moveClass: String\n }),\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n let prevChildren;\n let children;\n onUpdated(() => {\n if (!prevChildren.length) {\n return;\n }\n const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n if (!hasCSSTransform(\n prevChildren[0].el,\n instance.vnode.el,\n moveClass\n )) {\n return;\n }\n prevChildren.forEach(callPendingCbs);\n prevChildren.forEach(recordPosition);\n const movedChildren = prevChildren.filter(applyTranslation);\n forceReflow();\n movedChildren.forEach((c) => {\n const el = c.el;\n const style = el.style;\n addTransitionClass(el, moveClass);\n style.transform = style.webkitTransform = style.transitionDuration = \"\";\n const cb = el[moveCbKey] = (e) => {\n if (e && e.target !== el) {\n return;\n }\n if (!e || /transform$/.test(e.propertyName)) {\n el.removeEventListener(\"transitionend\", cb);\n el[moveCbKey] = null;\n removeTransitionClass(el, moveClass);\n }\n };\n el.addEventListener(\"transitionend\", cb);\n });\n });\n return () => {\n const rawProps = toRaw(props);\n const cssTransitionProps = resolveTransitionProps(rawProps);\n let tag = rawProps.tag || Fragment;\n prevChildren = [];\n if (children) {\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child.el && child.el instanceof Element) {\n prevChildren.push(child);\n setTransitionHooks(\n child,\n resolveTransitionHooks(\n child,\n cssTransitionProps,\n state,\n instance\n )\n );\n positionMap.set(\n child,\n child.el.getBoundingClientRect()\n );\n }\n }\n }\n children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child.key != null) {\n setTransitionHooks(\n child,\n resolveTransitionHooks(child, cssTransitionProps, state, instance)\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`<TransitionGroup> children must be keyed.`);\n }\n }\n return createVNode(tag, null, children);\n };\n }\n};\nconst removeMode = (props) => delete props.mode;\n/* @__PURE__ */ removeMode(TransitionGroupImpl.props);\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n const el = c.el;\n if (el[moveCbKey]) {\n el[moveCbKey]();\n }\n if (el[enterCbKey]) {\n el[enterCbKey]();\n }\n}\nfunction recordPosition(c) {\n newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n const oldPos = positionMap.get(c);\n const newPos = newPositionMap.get(c);\n const dx = oldPos.left - newPos.left;\n const dy = oldPos.top - newPos.top;\n if (dx || dy) {\n const s = c.el.style;\n s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n s.transitionDuration = \"0s\";\n return c;\n }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n const clone = el.cloneNode();\n const _vtc = el[vtcKey];\n if (_vtc) {\n _vtc.forEach((cls) => {\n cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n });\n }\n moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n clone.style.display = \"none\";\n const container = root.nodeType === 1 ? root : root.parentNode;\n container.appendChild(clone);\n const { hasTransform } = getTransitionInfo(clone);\n container.removeChild(clone);\n return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n const target = e.target;\n if (target.composing) {\n target.composing = false;\n target.dispatchEvent(new Event(\"input\"));\n }\n}\nconst assignKey = Symbol(\"_assign\");\nconst vModelText = {\n created(el, { modifiers: { lazy, trim, number } }, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n if (e.target.composing) return;\n let domValue = el.value;\n if (trim) {\n domValue = domValue.trim();\n }\n if (castToNumber) {\n domValue = looseToNumber(domValue);\n }\n el[assignKey](domValue);\n });\n if (trim) {\n addEventListener(el, \"change\", () => {\n el.value = el.value.trim();\n });\n }\n if (!lazy) {\n addEventListener(el, \"compositionstart\", onCompositionStart);\n addEventListener(el, \"compositionend\", onCompositionEnd);\n addEventListener(el, \"change\", onCompositionEnd);\n }\n },\n // set value on mounted so it's after min/max for type=\"range\"\n mounted(el, { value }) {\n el.value = value == null ? \"\" : value;\n },\n beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n if (el.composing) return;\n const elValue = (number || el.type === \"number\") && !/^0\\d/.test(el.value) ? looseToNumber(el.value) : el.value;\n const newValue = value == null ? \"\" : value;\n if (elValue === newValue) {\n return;\n }\n if (document.activeElement === el && el.type !== \"range\") {\n if (lazy && value === oldValue) {\n return;\n }\n if (trim && el.value.trim() === newValue) {\n return;\n }\n }\n el.value = newValue;\n }\n};\nconst vModelCheckbox = {\n // #4096 array checkboxes need to be deep traversed\n deep: true,\n created(el, _, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n addEventListener(el, \"change\", () => {\n const modelValue = el._modelValue;\n const elementValue = getValue(el);\n const checked = el.checked;\n const assign = el[assignKey];\n if (isArray(modelValue)) {\n const index = looseIndexOf(modelValue, elementValue);\n const found = index !== -1;\n if (checked && !found) {\n assign(modelValue.concat(elementValue));\n } else if (!checked && found) {\n const filtered = [...modelValue];\n filtered.splice(index, 1);\n assign(filtered);\n }\n } else if (isSet(modelValue)) {\n const cloned = new Set(modelValue);\n if (checked) {\n cloned.add(elementValue);\n } else {\n cloned.delete(elementValue);\n }\n assign(cloned);\n } else {\n assign(getCheckboxValue(el, checked));\n }\n });\n },\n // set initial checked on mount to wait for true-value/false-value\n mounted: setChecked,\n beforeUpdate(el, binding, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n setChecked(el, binding, vnode);\n }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n el._modelValue = value;\n if (isArray(value)) {\n el.checked = looseIndexOf(value, vnode.props.value) > -1;\n } else if (isSet(value)) {\n el.checked = value.has(vnode.props.value);\n } else if (value !== oldValue) {\n el.checked = looseEqual(value, getCheckboxValue(el, true));\n }\n}\nconst vModelRadio = {\n created(el, { value }, vnode) {\n el.checked = looseEqual(value, vnode.props.value);\n el[assignKey] = getModelAssigner(vnode);\n addEventListener(el, \"change\", () => {\n el[assignKey](getValue(el));\n });\n },\n beforeUpdate(el, { value, oldValue }, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n if (value !== oldValue) {\n el.checked = looseEqual(value, vnode.props.value);\n }\n }\n};\nconst vModelSelect = {\n // <select multiple> value need to be deep traversed\n deep: true,\n created(el, { value, modifiers: { number } }, vnode) {\n const isSetModel = isSet(value);\n addEventListener(el, \"change\", () => {\n const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n );\n el[assignKey](\n el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n );\n el._assigning = true;\n nextTick(() => {\n el._assigning = false;\n });\n });\n el[assignKey] = getModelAssigner(vnode);\n },\n // set value in mounted & updated because <select> relies on its children\n // <option>s.\n mounted(el, { value, modifiers: { number } }) {\n setSelected(el, value);\n },\n beforeUpdate(el, _binding, vnode) {\n el[assignKey] = getModelAssigner(vnode);\n },\n updated(el, { value, modifiers: { number } }) {\n if (!el._assigning) {\n setSelected(el, value);\n }\n }\n};\nfunction setSelected(el, value, number) {\n const isMultiple = el.multiple;\n const isArrayValue = isArray(value);\n if (isMultiple && !isArrayValue && !isSet(value)) {\n !!(process.env.NODE_ENV !== \"production\") && warn(\n `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n );\n return;\n }\n for (let i = 0, l = el.options.length; i < l; i++) {\n const option = el.options[i];\n const optionValue = getValue(option);\n if (isMultiple) {\n if (isArrayValue) {\n const optionType = typeof optionValue;\n if (optionType === \"string\" || optionType === \"number\") {\n option.selected = value.some((v) => String(v) === String(optionValue));\n } else {\n option.selected = looseIndexOf(value, optionValue) > -1;\n }\n } else {\n option.selected = value.has(optionValue);\n }\n } else if (looseEqual(getValue(option), value)) {\n if (el.selectedIndex !== i) el.selectedIndex = i;\n return;\n }\n }\n if (!isMultiple && el.selectedIndex !== -1) {\n el.selectedIndex = -1;\n }\n}\nfunction getValue(el) {\n return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n const key = checked ? \"_trueValue\" : \"_falseValue\";\n return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n created(el, binding, vnode) {\n callModelHook(el, binding, vnode, null, \"created\");\n },\n mounted(el, binding, vnode) {\n callModelHook(el, binding, vnode, null, \"mounted\");\n },\n beforeUpdate(el, binding, vnode, prevVNode) {\n callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n },\n updated(el, binding, vnode, prevVNode) {\n callModelHook(el, binding, vnode, prevVNode, \"updated\");\n }\n};\nfunction resolveDynamicModel(tagName, type) {\n switch (tagName) {\n case \"SELECT\":\n return vModelSelect;\n case \"TEXTAREA\":\n return vModelText;\n default:\n switch (type) {\n case \"checkbox\":\n return vModelCheckbox;\n case \"radio\":\n return vModelRadio;\n default:\n return vModelText;\n }\n }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n const modelToUse = resolveDynamicModel(\n el.tagName,\n vnode.props && vnode.props.type\n );\n const fn = modelToUse[hook];\n fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n vModelText.getSSRProps = ({ value }) => ({ value });\n vModelRadio.getSSRProps = ({ value }, vnode) => {\n if (vnode.props && looseEqual(vnode.props.value, value)) {\n return { checked: true };\n }\n };\n vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n if (isArray(value)) {\n if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n return { checked: true };\n }\n } else if (isSet(value)) {\n if (vnode.props && value.has(vnode.props.value)) {\n return { checked: true };\n }\n } else if (value) {\n return { checked: true };\n }\n };\n vModelDynamic.getSSRProps = (binding, vnode) => {\n if (typeof vnode.type !== \"string\") {\n return;\n }\n const modelToUse = resolveDynamicModel(\n // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n vnode.type.toUpperCase(),\n vnode.props && vnode.props.type\n );\n if (modelToUse.getSSRProps) {\n return modelToUse.getSSRProps(binding, vnode);\n }\n };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n stop: (e) => e.stopPropagation(),\n prevent: (e) => e.preventDefault(),\n self: (e) => e.target !== e.currentTarget,\n ctrl: (e) => !e.ctrlKey,\n shift: (e) => !e.shiftKey,\n alt: (e) => !e.altKey,\n meta: (e) => !e.metaKey,\n left: (e) => \"button\" in e && e.button !== 0,\n middle: (e) => \"button\" in e && e.button !== 1,\n right: (e) => \"button\" in e && e.button !== 2,\n exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n const cache = fn._withMods || (fn._withMods = {});\n const cacheKey = modifiers.join(\".\");\n return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {\n for (let i = 0; i < modifiers.length; i++) {\n const guard = modifierGuards[modifiers[i]];\n if (guard && guard(event, modifiers)) return;\n }\n return fn(event, ...args);\n });\n};\nconst keyNames = {\n esc: \"escape\",\n space: \" \",\n up: \"arrow-up\",\n left: \"arrow-left\",\n right: \"arrow-right\",\n down: \"arrow-down\",\n delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n const cache = fn._withKeys || (fn._withKeys = {});\n const cacheKey = modifiers.join(\".\");\n return cache[cacheKey] || (cache[cacheKey] = (event) => {\n if (!(\"key\" in event)) {\n return;\n }\n const eventKey = hyphenate(event.key);\n if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {\n return fn(event);\n }\n });\n};\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n enabledHydration = true;\n return renderer;\n}\nconst render = (...args) => {\n ensureRenderer().render(...args);\n};\nconst hydrate = (...args) => {\n ensureHydrationRenderer().hydrate(...args);\n};\nconst createApp = (...args) => {\n const app = ensureRenderer().createApp(...args);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n injectNativeTagCheck(app);\n injectCompilerOptionsCheck(app);\n }\n const { mount } = app;\n app.mount = (containerOrSelector) => {\n const container = normalizeContainer(containerOrSelector);\n if (!container) return;\n const component = app._component;\n if (!isFunction(component) && !component.render && !component.template) {\n component.template = container.innerHTML;\n }\n container.innerHTML = \"\";\n const proxy = mount(container, false, resolveRootNamespace(container));\n if (container instanceof Element) {\n container.removeAttribute(\"v-cloak\");\n container.setAttribute(\"data-v-app\", \"\");\n }\n return proxy;\n };\n return app;\n};\nconst createSSRApp = (...args) => {\n const app = ensureHydrationRenderer().createApp(...args);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n injectNativeTagCheck(app);\n injectCompilerOptionsCheck(app);\n }\n const { mount } = app;\n app.mount = (containerOrSelector) => {\n const container = normalizeContainer(containerOrSelector);\n if (container) {\n return mount(container, true, resolveRootNamespace(container));\n }\n };\n return app;\n};\nfunction resolveRootNamespace(container) {\n if (container instanceof SVGElement) {\n return \"svg\";\n }\n if (typeof MathMLElement === \"function\" && container instanceof MathMLElement) {\n return \"mathml\";\n }\n}\nfunction injectNativeTagCheck(app) {\n Object.defineProperty(app.config, \"isNativeTag\", {\n value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n writable: false\n });\n}\nfunction injectCompilerOptionsCheck(app) {\n if (isRuntimeOnly()) {\n const isCustomElement = app.config.isCustomElement;\n Object.defineProperty(app.config, \"isCustomElement\", {\n get() {\n return isCustomElement;\n },\n set() {\n warn(\n `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n );\n }\n });\n const compilerOptions = app.config.compilerOptions;\n const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n Object.defineProperty(app.config, \"compilerOptions\", {\n get() {\n warn(msg);\n return compilerOptions;\n },\n set() {\n warn(msg);\n }\n });\n }\n}\nfunction normalizeContainer(container) {\n if (isString(container)) {\n const res = document.querySelector(container);\n if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n warn(\n `Failed to mount app: mount target selector \"${container}\" returned null.`\n );\n }\n return res;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n warn(\n `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n );\n }\n return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n if (!ssrDirectiveInitialized) {\n ssrDirectiveInitialized = true;\n initVModelForSSR();\n initVShowForSSR();\n }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n", "/**\n* vue v3.4.38\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { initCustomFormatter, warn } from '@vue/runtime-dom';\nexport * from '@vue/runtime-dom';\n\nfunction initDev() {\n {\n initCustomFormatter();\n }\n}\n\nif (!!(process.env.NODE_ENV !== \"production\")) {\n initDev();\n}\nconst compile = () => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n );\n }\n};\n\nexport { compile };\n"], + "mappings": "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", + "names": ["set", "effect", "trigger", "computed", "computed", "hasOwnProperty", "isRef", "isReadonly", "self", "get", "set", "isRef", "p", "version", "callHook", "remove", "resolve", "has", "render", "get", "set", "computed", "h", "hydrate", "createApp", "ref", "patchProp", "hasWarned", "effect", "remove2", "isFlushing", "track", "trigger", "isModelListener", "emit", "render2", "warn", "callHook", "resolve", "warn", "isBoolean", "def", "enterCbKey", "compile", "warn"] +} diff --git a/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js b/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js new file mode 100644 index 000000000..463f55233 --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js @@ -0,0 +1,164 @@ +// node_modules/@vue/devtools-api/lib/esm/env.js +function getDevtoolsGlobalHook() { + return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__; +} +function getTarget() { + return typeof navigator !== "undefined" && typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : {}; +} +var isProxyAvailable = typeof Proxy === "function"; + +// node_modules/@vue/devtools-api/lib/esm/const.js +var HOOK_SETUP = "devtools-plugin:setup"; +var HOOK_PLUGIN_SETTINGS_SET = "plugin:settings:set"; + +// node_modules/@vue/devtools-api/lib/esm/time.js +var supported; +var perf; +function isPerformanceSupported() { + var _a; + if (supported !== void 0) { + return supported; + } + if (typeof window !== "undefined" && window.performance) { + supported = true; + perf = window.performance; + } else if (typeof globalThis !== "undefined" && ((_a = globalThis.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) { + supported = true; + perf = globalThis.perf_hooks.performance; + } else { + supported = false; + } + return supported; +} +function now() { + return isPerformanceSupported() ? perf.now() : Date.now(); +} + +// node_modules/@vue/devtools-api/lib/esm/proxy.js +var ApiProxy = class { + constructor(plugin, hook) { + this.target = null; + this.targetQueue = []; + this.onQueue = []; + this.plugin = plugin; + this.hook = hook; + const defaultSettings = {}; + if (plugin.settings) { + for (const id in plugin.settings) { + const item = plugin.settings[id]; + defaultSettings[id] = item.defaultValue; + } + } + const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`; + let currentSettings = Object.assign({}, defaultSettings); + try { + const raw = localStorage.getItem(localSettingsSaveId); + const data = JSON.parse(raw); + Object.assign(currentSettings, data); + } catch (e) { + } + this.fallbacks = { + getSettings() { + return currentSettings; + }, + setSettings(value) { + try { + localStorage.setItem(localSettingsSaveId, JSON.stringify(value)); + } catch (e) { + } + currentSettings = value; + }, + now() { + return now(); + } + }; + if (hook) { + hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => { + if (pluginId === this.plugin.id) { + this.fallbacks.setSettings(value); + } + }); + } + this.proxiedOn = new Proxy({}, { + get: (_target, prop) => { + if (this.target) { + return this.target.on[prop]; + } else { + return (...args) => { + this.onQueue.push({ + method: prop, + args + }); + }; + } + } + }); + this.proxiedTarget = new Proxy({}, { + get: (_target, prop) => { + if (this.target) { + return this.target[prop]; + } else if (prop === "on") { + return this.proxiedOn; + } else if (Object.keys(this.fallbacks).includes(prop)) { + return (...args) => { + this.targetQueue.push({ + method: prop, + args, + resolve: () => { + } + }); + return this.fallbacks[prop](...args); + }; + } else { + return (...args) => { + return new Promise((resolve) => { + this.targetQueue.push({ + method: prop, + args, + resolve + }); + }); + }; + } + } + }); + } + async setRealTarget(target) { + this.target = target; + for (const item of this.onQueue) { + this.target.on[item.method](...item.args); + } + for (const item of this.targetQueue) { + item.resolve(await this.target[item.method](...item.args)); + } + } +}; + +// node_modules/@vue/devtools-api/lib/esm/index.js +function setupDevtoolsPlugin(pluginDescriptor, setupFn) { + const descriptor = pluginDescriptor; + const target = getTarget(); + const hook = getDevtoolsGlobalHook(); + const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy; + if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) { + hook.emit(HOOK_SETUP, pluginDescriptor, setupFn); + } else { + const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null; + const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || []; + list.push({ + pluginDescriptor: descriptor, + setupFn, + proxy + }); + if (proxy) { + setupFn(proxy.proxiedTarget); + } + } +} + +export { + isPerformanceSupported, + now, + setupDevtoolsPlugin +}; +//# sourceMappingURL=chunk-UKCZNIRO.js.map diff --git a/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js.map b/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js.map new file mode 100644 index 000000000..ed6a84b20 --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-UKCZNIRO.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/@vue/devtools-api/lib/esm/env.js", "../../../../node_modules/@vue/devtools-api/lib/esm/const.js", "../../../../node_modules/@vue/devtools-api/lib/esm/time.js", "../../../../node_modules/@vue/devtools-api/lib/esm/proxy.js", "../../../../node_modules/@vue/devtools-api/lib/esm/index.js"], + "sourcesContent": ["export function getDevtoolsGlobalHook() {\n return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;\n}\nexport function getTarget() {\n // @ts-expect-error navigator and windows are not available in all environments\n return (typeof navigator !== 'undefined' && typeof window !== 'undefined')\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : {};\n}\nexport const isProxyAvailable = typeof Proxy === 'function';\n", "export const HOOK_SETUP = 'devtools-plugin:setup';\nexport const HOOK_PLUGIN_SETTINGS_SET = 'plugin:settings:set';\n", "let supported;\nlet perf;\nexport function isPerformanceSupported() {\n var _a;\n if (supported !== undefined) {\n return supported;\n }\n if (typeof window !== 'undefined' && window.performance) {\n supported = true;\n perf = window.performance;\n }\n else if (typeof globalThis !== 'undefined' && ((_a = globalThis.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {\n supported = true;\n perf = globalThis.perf_hooks.performance;\n }\n else {\n supported = false;\n }\n return supported;\n}\nexport function now() {\n return isPerformanceSupported() ? perf.now() : Date.now();\n}\n", "import { HOOK_PLUGIN_SETTINGS_SET } from './const.js';\nimport { now } from './time.js';\nexport class ApiProxy {\n constructor(plugin, hook) {\n this.target = null;\n this.targetQueue = [];\n this.onQueue = [];\n this.plugin = plugin;\n this.hook = hook;\n const defaultSettings = {};\n if (plugin.settings) {\n for (const id in plugin.settings) {\n const item = plugin.settings[id];\n defaultSettings[id] = item.defaultValue;\n }\n }\n const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;\n let currentSettings = Object.assign({}, defaultSettings);\n try {\n const raw = localStorage.getItem(localSettingsSaveId);\n const data = JSON.parse(raw);\n Object.assign(currentSettings, data);\n }\n catch (e) {\n // noop\n }\n this.fallbacks = {\n getSettings() {\n return currentSettings;\n },\n setSettings(value) {\n try {\n localStorage.setItem(localSettingsSaveId, JSON.stringify(value));\n }\n catch (e) {\n // noop\n }\n currentSettings = value;\n },\n now() {\n return now();\n },\n };\n if (hook) {\n hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {\n if (pluginId === this.plugin.id) {\n this.fallbacks.setSettings(value);\n }\n });\n }\n this.proxiedOn = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target.on[prop];\n }\n else {\n return (...args) => {\n this.onQueue.push({\n method: prop,\n args,\n });\n };\n }\n },\n });\n this.proxiedTarget = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target[prop];\n }\n else if (prop === 'on') {\n return this.proxiedOn;\n }\n else if (Object.keys(this.fallbacks).includes(prop)) {\n return (...args) => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve: () => { },\n });\n return this.fallbacks[prop](...args);\n };\n }\n else {\n return (...args) => {\n return new Promise((resolve) => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve,\n });\n });\n };\n }\n },\n });\n }\n async setRealTarget(target) {\n this.target = target;\n for (const item of this.onQueue) {\n this.target.on[item.method](...item.args);\n }\n for (const item of this.targetQueue) {\n item.resolve(await this.target[item.method](...item.args));\n }\n }\n}\n", "import { getDevtoolsGlobalHook, getTarget, isProxyAvailable } from './env.js';\nimport { HOOK_SETUP } from './const.js';\nimport { ApiProxy } from './proxy.js';\nexport * from './api/index.js';\nexport * from './plugin.js';\nexport * from './time.js';\nexport function setupDevtoolsPlugin(pluginDescriptor, setupFn) {\n const descriptor = pluginDescriptor;\n const target = getTarget();\n const hook = getDevtoolsGlobalHook();\n const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy;\n if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {\n hook.emit(HOOK_SETUP, pluginDescriptor, setupFn);\n }\n else {\n const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null;\n const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];\n list.push({\n pluginDescriptor: descriptor,\n setupFn,\n proxy,\n });\n if (proxy) {\n setupFn(proxy.proxiedTarget);\n }\n }\n}\n"], + "mappings": "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", + "names": [] +} diff --git a/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js b/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js new file mode 100644 index 000000000..a0b724916 --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js @@ -0,0 +1,8 @@ +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + +export { + __publicField +}; +//# sourceMappingURL=chunk-V6TY7KAL.js.map diff --git a/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js.map b/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js.map new file mode 100644 index 000000000..98652118b --- /dev/null +++ b/src/.vuepress/.cache/deps/chunk-V6TY7KAL.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/src/.vuepress/.cache/deps/package.json b/src/.vuepress/.cache/deps/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/src/.vuepress/.cache/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/src/.vuepress/.cache/deps/slimsearch.js b/src/.vuepress/.cache/deps/slimsearch.js new file mode 100644 index 000000000..481b406b2 --- /dev/null +++ b/src/.vuepress/.cache/deps/slimsearch.js @@ -0,0 +1,617 @@ +import { + __publicField +} from "./chunk-V6TY7KAL.js"; + +// node_modules/slimsearch/dist/index.mjs +var _t = "ENTRIES"; +var U = "KEYS"; +var J = "VALUES"; +var F = ""; +var S = class { + constructor(e, n) { + __publicField(this, "set"); + __publicField(this, "_type"); + __publicField(this, "_path"); + const o = e._tree, s = Array.from(o.keys()); + this.set = e, this._type = n, this._path = s.length > 0 ? [{ node: o, keys: s }] : []; + } + next() { + const e = this.dive(); + return this.backtrack(), e; + } + dive() { + if (this._path.length === 0) return { done: true, value: void 0 }; + const { node: e, keys: n } = y(this._path); + if (y(n) === F) return { done: false, value: this.result() }; + const o = e.get(y(n)); + return this._path.push({ node: o, keys: Array.from(o.keys()) }), this.dive(); + } + backtrack() { + if (this._path.length === 0) return; + const e = y(this._path).keys; + e.pop(), !(e.length > 0) && (this._path.pop(), this.backtrack()); + } + key() { + return this.set._prefix + this._path.map(({ keys: e }) => y(e)).filter((e) => e !== F).join(""); + } + value() { + return y(this._path).node.get(F); + } + result() { + switch (this._type) { + case J: + return this.value(); + case U: + return this.key(); + default: + return [this.key(), this.value()]; + } + } + [Symbol.iterator]() { + return this; + } +}; +var y = (t) => t[t.length - 1]; +var gt = (t, e, n) => { + const o = /* @__PURE__ */ new Map(); + if (e === void 0) return o; + const s = e.length + 1, i = s + n, r = new Uint8Array(i * s).fill(n + 1); + for (let u = 0; u < s; ++u) r[u] = u; + for (let u = 1; u < i; ++u) r[u * s] = u; + return G(t, e, n, o, r, 1, s, ""), o; +}; +var G = (t, e, n, o, s, i, r, u) => { + const c = i * r; + t: for (const d of t.keys()) if (d === F) { + const a = s[c - 1]; + a <= n && o.set(u, [t.get(d), a]); + } else { + let a = i; + for (let h = 0; h < d.length; ++h, ++a) { + const f = d[h], _ = r * a, g = _ - r; + let l = s[_]; + const m = Math.max(0, a - n - 1), w = Math.min(r - 1, a + n); + for (let p = m; p < w; ++p) { + const D = f !== e[p], z = s[g + p] + +D, C = s[g + p + 1] + 1, x = s[_ + p] + 1, R = s[_ + p + 1] = Math.min(z, C, x); + R < l && (l = R); + } + if (l > n) continue t; + } + G(t.get(d), e, n, o, s, a, r, u + d); + } +}; +var A = class _A { + constructor(e = /* @__PURE__ */ new Map(), n = "") { + __publicField(this, "_tree"); + __publicField(this, "_prefix"); + __publicField(this, "_size"); + this._tree = e, this._prefix = n; + } + atPrefix(e) { + if (!e.startsWith(this._prefix)) throw new Error("Mismatched prefix"); + const [n, o] = E(this._tree, e.slice(this._prefix.length)); + if (n === void 0) { + const [s, i] = k(o); + for (const r of s.keys()) if (r !== F && r.startsWith(i)) { + const u = /* @__PURE__ */ new Map(); + return u.set(r.slice(i.length), s.get(r)), new _A(u, e); + } + } + return new _A(n, e); + } + clear() { + this._size = void 0, this._tree.clear(); + } + delete(e) { + return this._size = void 0, Ft(this._tree, e); + } + entries() { + return new S(this, _t); + } + forEach(e) { + for (const [n, o] of this) e(n, o, this); + } + fuzzyGet(e, n) { + return gt(this._tree, e, n); + } + get(e) { + const n = v(this._tree, e); + return n !== void 0 ? n.get(F) : void 0; + } + has(e) { + const n = v(this._tree, e); + return n !== void 0 && n.has(F); + } + keys() { + return new S(this, U); + } + set(e, n) { + if (typeof e != "string") throw new Error("key must be a string"); + return this._size = void 0, b(this._tree, e).set(F, n), this; + } + get size() { + if (this._size) return this._size; + this._size = 0; + const e = this.entries(); + for (; !e.next().done; ) this._size += 1; + return this._size; + } + update(e, n) { + if (typeof e != "string") throw new Error("key must be a string"); + this._size = void 0; + const o = b(this._tree, e); + return o.set(F, n(o.get(F))), this; + } + fetch(e, n) { + if (typeof e != "string") throw new Error("key must be a string"); + this._size = void 0; + const o = b(this._tree, e); + let s = o.get(F); + return s === void 0 && o.set(F, s = n()), s; + } + values() { + return new S(this, J); + } + [Symbol.iterator]() { + return this.entries(); + } + static from(e) { + const n = new _A(); + for (const [o, s] of e) n.set(o, s); + return n; + } + static fromObject(e) { + return _A.from(Object.entries(e)); + } +}; +var E = (t, e, n = []) => { + if (e.length === 0 || t == null) return [t, n]; + for (const o of t.keys()) if (o !== F && e.startsWith(o)) return n.push([t, o]), E(t.get(o), e.slice(o.length), n); + return n.push([t, e]), E(void 0, "", n); +}; +var v = (t, e) => { + if (e.length === 0 || t == null) return t; + for (const n of t.keys()) if (n !== F && e.startsWith(n)) return v(t.get(n), e.slice(n.length)); +}; +var b = (t, e) => { + const n = e.length; + t: for (let o = 0; t && o < n; ) { + for (const i of t.keys()) if (i !== F && e[o] === i[0]) { + const r = Math.min(n - o, i.length); + let u = 1; + for (; u < r && e[o + u] === i[u]; ) ++u; + const c = t.get(i); + if (u === i.length) t = c; + else { + const d = /* @__PURE__ */ new Map(); + d.set(i.slice(u), c), t.set(e.slice(o, o + u), d), t.delete(i), t = d; + } + o += u; + continue t; + } + const s = /* @__PURE__ */ new Map(); + return t.set(e.slice(o), s), s; + } + return t; +}; +var Ft = (t, e) => { + const [n, o] = E(t, e); + if (n !== void 0) { + if (n.delete(F), n.size === 0) Q(o); + else if (n.size === 1) { + const [s, i] = n.entries().next().value; + K(o, s, i); + } + } +}; +var Q = (t) => { + if (t.length === 0) return; + const [e, n] = k(t); + if (e.delete(n), e.size === 0) Q(t.slice(0, -1)); + else if (e.size === 1) { + const [o, s] = e.entries().next().value; + o !== F && K(t.slice(0, -1), o, s); + } +}; +var K = (t, e, n) => { + if (t.length === 0) return; + const [o, s] = k(t); + o.set(s + e, n), o.delete(s); +}; +var k = (t) => t[t.length - 1]; +var Y = (t, e) => t._idToShortId.has(e); +var pt = (t, e) => { + const n = t._idToShortId.get(e); + if (n != null) return t._storedFields.get(n); +}; +var wt = /[\n\r -#%-*,-/:;?@[-\]_{}\u00A0\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2000-\u200A\u2010-\u2029\u202F-\u2043\u2045-\u2051\u2053-\u205F\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3000-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/u; +var O = "or"; +var H = "and"; +var At = "and_not"; +var Ct = (t, e) => { + t.includes(e) || t.push(e); +}; +var X = (t, e) => { + for (const n of e) t.includes(n) || t.push(n); +}; +var Z = ({ score: t }, { score: e }) => e - t; +var tt = () => /* @__PURE__ */ new Map(); +var I = (t) => { + const e = /* @__PURE__ */ new Map(); + for (const n of Object.keys(t)) e.set(parseInt(n, 10), t[n]); + return e; +}; +var V = (t, e) => Object.prototype.hasOwnProperty.call(t, e) ? t[e] : void 0; +var yt = { [O]: (t, e) => { + for (const n of e.keys()) { + const o = t.get(n); + if (o == null) t.set(n, e.get(n)); + else { + const { score: s, terms: i, match: r } = e.get(n); + o.score = o.score + s, o.match = Object.assign(o.match, r), X(o.terms, i); + } + } + return t; +}, [H]: (t, e) => { + const n = /* @__PURE__ */ new Map(); + for (const o of e.keys()) { + const s = t.get(o); + if (s == null) continue; + const { score: i, terms: r, match: u } = e.get(o); + X(s.terms, r), n.set(o, { score: s.score + i, terms: s.terms, match: Object.assign(s.match, u) }); + } + return n; +}, [At]: (t, e) => { + for (const n of e.keys()) t.delete(n); + return t; +} }; +var zt = (t, e, n, o, s, i) => { + const { k: r, b: u, d: c } = i; + return Math.log(1 + (n - e + 0.5) / (e + 0.5)) * (c + t * (r + 1) / (t + r * (1 - u + u * o / s))); +}; +var xt = (t) => (e, n, o) => { + const s = typeof t.fuzzy == "function" ? t.fuzzy(e, n, o) : t.fuzzy || false, i = typeof t.prefix == "function" ? t.prefix(e, n, o) : t.prefix === true; + return { term: e, fuzzy: s, prefix: i }; +}; +var et = (t, e, n, o) => { + for (const s of Object.keys(t._fieldIds)) if (t._fieldIds[s] === n) { + t._options.logger("warn", `SlimSearch: document with ID ${t._documentIds.get(e)} has changed before removal: term "${o}" was not present in field "${s}". Removing a document after it has changed can corrupt the index!`, "version_conflict"); + return; + } +}; +var nt = (t, e, n, o) => { + const s = t._index.fetch(o, tt); + let i = s.get(e); + if (i == null) i = /* @__PURE__ */ new Map(), i.set(n, 1), s.set(e, i); + else { + const r = i.get(n); + i.set(n, (r || 0) + 1); + } +}; +var M = (t, e, n, o) => { + if (!t._index.has(o)) { + et(t, n, e, o); + return; + } + const s = t._index.fetch(o, tt), i = s.get(e); + i == null || i.get(n) == null ? et(t, n, e, o) : i.get(n) <= 1 ? i.size <= 1 ? s.delete(e) : i.delete(n) : i.set(n, i.get(n) - 1), t._index.get(o).size === 0 && t._index.delete(o); +}; +var Et = (t, e, n, o, s) => { + let i = t._fieldLength.get(e); + i == null && t._fieldLength.set(e, i = []), i[n] = s; + const r = (t._avgFieldLength[n] || 0) * o + s; + t._avgFieldLength[n] = r / (o + 1); +}; +var It = (t, e) => { + const n = t._nextId; + return t._idToShortId.set(e, n), t._documentIds.set(n, e), t._documentCount += 1, t._nextId += 1, n; +}; +var Dt = (t, e, n) => { + const { storeFields: o, extractField: s } = t._options; + if (o == null || o.length === 0) return; + let i = t._storedFields.get(e); + i === void 0 && t._storedFields.set(e, i = {}); + for (const r of o) { + const u = s(n, r); + u !== void 0 && (i[r] = u); + } +}; +var T = (t, e) => { + const { extractField: n, tokenize: o, processTerm: s, fields: i, idField: r } = t._options, u = n(e, r); + if (u == null) throw new Error(`SlimSearch: document does not have ID field "${r}"`); + if (Y(t, u)) throw new Error(`SlimSearch: duplicate ID ${u}`); + const c = It(t, u); + Dt(t, c, e); + for (const d of i) { + const a = n(e, d); + if (a == null) continue; + const h = o(a.toString(), d), f = t._fieldIds[d], _ = new Set(h).size; + Et(t, c, f, t._documentCount - 1, _); + for (const g of h) { + const l = s(g, d); + if (Array.isArray(l)) for (const m of l) nt(t, f, c, m); + else l && nt(t, f, c, l); + } + } +}; +var L = (t, e) => { + for (const n of e) T(t, n); +}; +var St = (t, e, n = {}) => { + const { chunkSize: o = 10 } = n, s = { chunk: [], promise: Promise.resolve() }, { chunk: i, promise: r } = e.reduce(({ chunk: u, promise: c }, d, a) => (u.push(d), (a + 1) % o === 0 ? { chunk: [], promise: c.then(() => new Promise((h) => setTimeout(h, 0))).then(() => L(t, u)) } : { chunk: u, promise: c }), s); + return r.then(() => L(t, i)); +}; +var vt = { k: 1.2, b: 0.7, d: 0.5 }; +var B = { idField: "id", extractField: (t, e) => t[e], tokenize: (t) => t.split(wt), processTerm: (t) => t.toLowerCase(), fields: void 0, searchOptions: void 0, storeFields: [], logger: (t, e) => { + typeof (console == null ? void 0 : console[t]) == "function" && console[t](e); +}, autoVacuum: true }; +var ot = { combineWith: O, prefix: false, fuzzy: false, maxFuzzy: 6, boost: {}, weights: { fuzzy: 0.45, prefix: 0.375 }, bm25: vt }; +var bt = { combineWith: H, prefix: (t, e, n) => e === n.length - 1 }; +var j = { batchSize: 1e3, batchWait: 10 }; +var q = { minDirtFactor: 0.1, minDirtCount: 20 }; +var $ = { ...j, ...q }; +var kt = (t) => { + if (B.hasOwnProperty(t)) return V(B, t); + throw new Error(`SlimSearch: unknown option "${t}"`); +}; +var W = Symbol("*"); +var Ot = (t, e) => { + const n = /* @__PURE__ */ new Map(), o = { ...t._options.searchOptions, ...e }; + for (const [s, i] of t._documentIds) { + const r = o.boostDocument ? o.boostDocument(i, "", t._storedFields.get(s)) : 1; + n.set(s, { score: r, terms: [], match: {} }); + } + return n; +}; +var st = (t, e = O) => { + if (t.length === 0) return /* @__PURE__ */ new Map(); + const n = e.toLowerCase(), o = yt[n]; + if (!o) throw new Error(`Invalid combination operator: ${e}`); + return t.reduce(o) || /* @__PURE__ */ new Map(); +}; +var N = (t, e, n, o, s, i, r, u, c = /* @__PURE__ */ new Map()) => { + if (s == null) return c; + for (const d of Object.keys(i)) { + const a = i[d], h = t._fieldIds[d], f = s.get(h); + if (f == null) continue; + let _ = f.size; + const g = t._avgFieldLength[h]; + for (const l of f.keys()) { + if (!t._documentIds.has(l)) { + M(t, h, l, n), _ -= 1; + continue; + } + const m = r ? r(t._documentIds.get(l), n, t._storedFields.get(l)) : 1; + if (!m) continue; + const w = f.get(l), p = t._fieldLength.get(l)[h], D = zt(w, _, t._documentCount, p, g, u), z = o * a * m * D, C = c.get(l); + if (C) { + C.score += z, Ct(C.terms, e); + const x = V(C.match, n); + x ? x.push(d) : C.match[n] = [d]; + } else c.set(l, { score: z, terms: [e], match: { [n]: [d] } }); + } + } + return c; +}; +var Vt = (t, e, n) => { + const o = { ...t._options.searchOptions, ...n }, s = (o.fields || t._options.fields).reduce((l, m) => ({ ...l, [m]: V(o.boost, m) || 1 }), {}), { boostDocument: i, weights: r, maxFuzzy: u, bm25: c } = o, { fuzzy: d, prefix: a } = { ...ot.weights, ...r }, h = t._index.get(e.term), f = N(t, e.term, e.term, 1, h, s, i, c); + let _, g; + if (e.prefix && (_ = t._index.atPrefix(e.term)), e.fuzzy) { + const l = e.fuzzy === true ? 0.2 : e.fuzzy, m = l < 1 ? Math.min(u, Math.round(e.term.length * l)) : l; + m && (g = t._index.fuzzyGet(e.term, m)); + } + if (_) for (const [l, m] of _) { + const w = l.length - e.term.length; + if (!w) continue; + g == null ? void 0 : g.delete(l); + const p = a * l.length / (l.length + 0.3 * w); + N(t, e.term, l, p, m, s, i, c, f); + } + if (g) for (const l of g.keys()) { + const [m, w] = g.get(l); + if (!w) continue; + const p = d * l.length / (l.length + w); + N(t, e.term, l, p, m, s, i, c, f); + } + return f; +}; +var it = (t, e, n = {}) => { + if (e === W) return Ot(t, n); + if (typeof e != "string") { + const a = { ...n, ...e, queries: void 0 }, h = e.queries.map((f) => it(t, f, a)); + return st(h, a.combineWith); + } + const { tokenize: o, processTerm: s, searchOptions: i } = t._options, r = { tokenize: o, processTerm: s, ...i, ...n }, { tokenize: u, processTerm: c } = r, d = u(e).flatMap((a) => c(a)).filter((a) => !!a).map(xt(r)).map((a) => Vt(t, a, r)); + return st(d, r.combineWith); +}; +var ut = (t, e, n = {}) => { + const o = it(t, e, n), s = []; + for (const [i, { score: r, terms: u, match: c }] of o) { + const d = u.length || 1, a = { id: t._documentIds.get(i), score: r * d, terms: Object.keys(c), queryTerms: u, match: c }; + Object.assign(a, t._storedFields.get(i)), (n.filter == null || n.filter(a)) && s.push(a); + } + return e === W && n.boostDocument == null && t._options.searchOptions.boostDocument == null || s.sort(Z), s; +}; +var Mt = (t, e, n = {}) => { + n = { ...t._options.autoSuggestOptions, ...n }; + const o = /* @__PURE__ */ new Map(); + for (const { score: i, terms: r } of ut(t, e, n)) { + const u = r.join(" "), c = o.get(u); + c != null ? (c.score += i, c.count += 1) : o.set(u, { score: i, terms: r, count: 1 }); + } + const s = []; + for (const [i, { score: r, terms: u, count: c }] of o) s.push({ suggestion: i, terms: u, score: r / c }); + return s.sort(Z), s; +}; +var rt = class { + constructor(e) { + __publicField(this, "_options"); + __publicField(this, "_index"); + __publicField(this, "_documentCount"); + __publicField(this, "_documentIds"); + __publicField(this, "_idToShortId"); + __publicField(this, "_fieldIds"); + __publicField(this, "_fieldLength"); + __publicField(this, "_avgFieldLength"); + __publicField(this, "_nextId"); + __publicField(this, "_storedFields"); + __publicField(this, "_dirtCount"); + __publicField(this, "_currentVacuum"); + __publicField(this, "_enqueuedVacuum"); + __publicField(this, "_enqueuedVacuumConditions"); + if ((e == null ? void 0 : e.fields) == null) throw new Error('SlimSearch: option "fields" must be provided'); + const n = e.autoVacuum == null || e.autoVacuum === true ? $ : e.autoVacuum; + this._options = { ...B, ...e, autoVacuum: n, searchOptions: { ...ot, ...e.searchOptions || {} }, autoSuggestOptions: { ...bt, ...e.autoSuggestOptions || {} } }, this._index = new A(), this._documentCount = 0, this._documentIds = /* @__PURE__ */ new Map(), this._idToShortId = /* @__PURE__ */ new Map(), this._fieldIds = {}, this._fieldLength = /* @__PURE__ */ new Map(), this._avgFieldLength = [], this._nextId = 0, this._storedFields = /* @__PURE__ */ new Map(), this._dirtCount = 0, this._currentVacuum = null, this._enqueuedVacuum = null, this._enqueuedVacuumConditions = q, this.addFields(this._options.fields); + } + get isVacuuming() { + return this._currentVacuum != null; + } + get dirtCount() { + return this._dirtCount; + } + get dirtFactor() { + return this._dirtCount / (1 + this._documentCount + this._dirtCount); + } + get documentCount() { + return this._documentCount; + } + get termCount() { + return this._index.size; + } + toJSON() { + const e = []; + for (const [n, o] of this._index) { + const s = {}; + for (const [i, r] of o) s[i] = Object.fromEntries(r); + e.push([n, s]); + } + return { documentCount: this._documentCount, nextId: this._nextId, documentIds: Object.fromEntries(this._documentIds), fieldIds: this._fieldIds, fieldLength: Object.fromEntries(this._fieldLength), averageFieldLength: this._avgFieldLength, storedFields: Object.fromEntries(this._storedFields), dirtCount: this._dirtCount, index: e, serializationVersion: 2 }; + } + addFields(e) { + for (let n = 0; n < e.length; n++) this._fieldIds[e[n]] = n; + } +}; +var Tt = (t) => new rt(t); +var ct = ({ index: t, documentCount: e, nextId: n, documentIds: o, fieldIds: s, fieldLength: i, averageFieldLength: r, storedFields: u, dirtCount: c, serializationVersion: d }, a) => { + if (d !== 1 && d !== 2) throw new Error("SlimSearch: cannot deserialize an index created with an incompatible version"); + const h = new rt(a); + h._documentCount = e, h._nextId = n, h._documentIds = I(o), h._idToShortId = /* @__PURE__ */ new Map(), h._fieldIds = s, h._fieldLength = I(i), h._avgFieldLength = r, h._storedFields = I(u), h._dirtCount = c || 0, h._index = new A(); + for (const [f, _] of h._documentIds) h._idToShortId.set(_, f); + for (const [f, _] of t) { + const g = /* @__PURE__ */ new Map(); + for (const l of Object.keys(_)) { + let m = _[l]; + d === 1 && (m = m.ds), g.set(parseInt(l, 10), I(m)); + } + h._index.set(f, g); + } + return h; +}; +var Lt = (t, e) => { + if (e == null) throw new Error("SlimSearch: loadJSON should be given the same options used when serializing the index"); + return ct(JSON.parse(t), e); +}; +var dt = (t, e) => { + if (e == null) return true; + const { minDirtCount: n = $.minDirtCount, minDirtFactor: o = $.minDirtFactor } = e; + return t.dirtCount >= n && t.dirtFactor >= o; +}; +var lt = async (t, e, n) => { + const o = t._dirtCount; + if (dt(t, n)) { + const s = e.batchSize || j.batchSize, i = e.batchWait || j.batchWait; + let r = 1; + for (const [u, c] of t._index) { + for (const [d, a] of c) for (const [h] of a) t._documentIds.has(h) || (a.size <= 1 ? c.delete(d) : a.delete(h)); + t._index.get(u).size === 0 && t._index.delete(u), r % s === 0 && await new Promise((d) => setTimeout(d, i)), r += 1; + } + t._dirtCount -= o; + } + await null, t._currentVacuum = t._enqueuedVacuum, t._enqueuedVacuum = null; +}; +var at = (t, e, n) => t._currentVacuum ? (t._enqueuedVacuumConditions = t._enqueuedVacuumConditions && n, t._enqueuedVacuum != null || (t._enqueuedVacuum = t._currentVacuum.then(() => { + const o = t._enqueuedVacuumConditions; + return t._enqueuedVacuumConditions = q, lt(t, e, o); +})), t._enqueuedVacuum) : dt(t, n) === false ? Promise.resolve() : (t._currentVacuum = lt(t, e), t._currentVacuum); +var ht = (t) => { + if (t._options.autoVacuum === false) return; + const { minDirtFactor: e, minDirtCount: n, batchSize: o, batchWait: s } = t._options.autoVacuum; + at(t, { batchSize: o, batchWait: s }, { minDirtCount: n, minDirtFactor: e }); +}; +var Bt = (t, e = {}) => at(t, e); +var ft = (t, e, n, o) => { + if (n === 1) { + t._avgFieldLength[e] = 0; + return; + } + const s = t._avgFieldLength[e] * n - o; + t._avgFieldLength[e] = s / (n - 1); +}; +var P = (t, e) => { + const n = t._idToShortId.get(e); + if (n == null) throw new Error(`SlimSearch: cannot discard document with ID ${e}: it is not in the index`); + t._idToShortId.delete(e), t._documentIds.delete(n), t._storedFields.delete(n), (t._fieldLength.get(n) || []).forEach((o, s) => { + ft(t, s, t._documentCount, o); + }), t._fieldLength.delete(n), t._documentCount -= 1, t._dirtCount += 1, ht(t); +}; +var jt = (t, e) => { + const n = t._options.autoVacuum; + try { + t._options.autoVacuum = false; + for (const o of e) P(t, o); + } finally { + t._options.autoVacuum = n; + } + ht(t); +}; +var mt = (t, e) => { + const { tokenize: n, processTerm: o, extractField: s, fields: i, idField: r } = t._options, u = s(e, r); + if (u == null) throw new Error(`SlimSearch: document does not have ID field "${r}"`); + const c = t._idToShortId.get(u); + if (c == null) throw new Error(`SlimSearch: cannot remove document with ID ${u}: it is not in the index`); + for (const d of i) { + const a = s(e, d); + if (a == null) continue; + const h = n(a.toString(), d), f = t._fieldIds[d], _ = new Set(h).size; + ft(t, f, t._documentCount, _); + for (const g of h) { + const l = o(g, d); + if (Array.isArray(l)) for (const m of l) M(t, f, c, m); + else l && M(t, f, c, l); + } + } + t._storedFields.delete(c), t._documentIds.delete(c), t._idToShortId.delete(u), t._fieldLength.delete(c), t._documentCount -= 1; +}; +var qt = function(t, e) { + if (e) for (const n of e) mt(t, n); + else { + if (arguments.length > 1) throw new Error("Expected documents to be present. Omit the argument to remove all documents."); + t._index = new A(), t._documentCount = 0, t._documentIds = /* @__PURE__ */ new Map(), t._idToShortId = /* @__PURE__ */ new Map(), t._fieldLength = /* @__PURE__ */ new Map(), t._avgFieldLength = [], t._storedFields = /* @__PURE__ */ new Map(), t._nextId = 0; + } +}; +var $t = (t, e) => { + const { idField: n, extractField: o } = t._options, s = o(e, n); + P(t, s), T(t, e); +}; +export { + A as SearchableMap, + W as WILDCARD, + T as add, + L as addAll, + St as addAllAsync, + Mt as autoSuggest, + Tt as createIndex, + P as discard, + jt as discardAll, + kt as getDefaultValue, + pt as getStoredFields, + Y as has, + ct as loadIndex, + Lt as loadJSONIndex, + mt as remove, + qt as removeAll, + $t as replace, + ut as search, + Bt as vacuum +}; +//# sourceMappingURL=slimsearch.js.map diff --git a/src/.vuepress/.cache/deps/slimsearch.js.map b/src/.vuepress/.cache/deps/slimsearch.js.map new file mode 100644 index 000000000..5dded5b83 --- /dev/null +++ b/src/.vuepress/.cache/deps/slimsearch.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/slimsearch/src/SearchableMap/TreeIterator.ts", "../../../../node_modules/slimsearch/src/SearchableMap/fuzzySearch.ts", "../../../../node_modules/slimsearch/src/SearchableMap/SearchableMap.ts", "../../../../node_modules/slimsearch/src/info.ts", "../../../../node_modules/slimsearch/src/constant.ts", "../../../../node_modules/slimsearch/src/utils.ts", "../../../../node_modules/slimsearch/src/warning.ts", "../../../../node_modules/slimsearch/src/term.ts", "../../../../node_modules/slimsearch/src/add.ts", "../../../../node_modules/slimsearch/src/defaults.ts", "../../../../node_modules/slimsearch/src/symbols.ts", "../../../../node_modules/slimsearch/src/results.ts", "../../../../node_modules/slimsearch/src/search.ts", "../../../../node_modules/slimsearch/src/autoSuggest.ts", "../../../../node_modules/slimsearch/src/SearchIndex.ts", "../../../../node_modules/slimsearch/src/init.ts", "../../../../node_modules/slimsearch/src/vacuum.ts", "../../../../node_modules/slimsearch/src/remove.ts", "../../../../node_modules/slimsearch/src/replace.ts"], + "sourcesContent": ["import { type Entry, type LeafType, type RadixTree } from \"./types.js\";\n\nconst ENTRIES = \"ENTRIES\";\n\nconst KEYS = \"KEYS\";\n\nconst VALUES = \"VALUES\";\n\nconst LEAF = \"\" as LeafType;\n\ninterface Iterators<T> {\n ENTRIES: Entry<T>;\n KEYS: string;\n VALUES: T;\n}\n\ntype Kind<T> = keyof Iterators<T>;\ntype Result<T, K extends keyof Iterators<T>> = Iterators<T>[K];\n\ntype IteratorPath<T> = {\n node: RadixTree<T>;\n keys: string[];\n}[];\n\nexport type IterableSet<T> = {\n _tree: RadixTree<T>;\n _prefix: string;\n};\n\n/**\n * @private\n */\nclass TreeIterator<T, K extends Kind<T>> implements Iterator<Result<T, K>> {\n set: IterableSet<T>;\n _type: K;\n _path: IteratorPath<T>;\n\n constructor(set: IterableSet<T>, type: K) {\n const node = set._tree;\n const keys = Array.from(node.keys());\n\n this.set = set;\n this._type = type;\n this._path = keys.length > 0 ? [{ node, keys }] : [];\n }\n\n next(): IteratorResult<Result<T, K>> {\n const value = this.dive();\n\n this.backtrack();\n\n return value;\n }\n\n dive(): IteratorResult<Result<T, K>> {\n if (this._path.length === 0) return { done: true, value: undefined };\n\n const { node, keys } = last(this._path)!;\n\n if (last(keys) === LEAF) return { done: false, value: this.result() };\n\n const child = node.get(last(keys)!)!;\n\n this._path.push({ node: child, keys: Array.from(child.keys()) });\n\n return this.dive();\n }\n\n backtrack(): void {\n if (this._path.length === 0) return;\n\n const keys = last(this._path)!.keys;\n\n keys.pop();\n if (keys.length > 0) return;\n\n this._path.pop();\n this.backtrack();\n }\n\n key(): string {\n return (\n this.set._prefix +\n this._path\n .map(({ keys }) => last(keys))\n .filter((key) => key !== LEAF)\n .join(\"\")\n );\n }\n\n value(): T {\n return last(this._path)!.node.get(LEAF)!;\n }\n\n result(): Result<T, K> {\n switch (this._type) {\n case VALUES:\n return this.value() as Result<T, K>;\n case KEYS:\n return this.key() as Result<T, K>;\n default:\n return [this.key(), this.value()] as Result<T, K>;\n }\n }\n\n [Symbol.iterator](): TreeIterator<T, K> {\n return this;\n }\n}\n\nconst last = <T>(array: T[]): T | undefined => {\n return array[array.length - 1];\n};\n\nexport { TreeIterator, ENTRIES, KEYS, VALUES, LEAF };\n", "/* eslint-disable no-labels */\nimport { LEAF } from \"./TreeIterator.js\";\nimport { type RadixTree } from \"./types.js\";\n\nexport type FuzzyResult<T> = [T, number];\n\nexport type FuzzyResults<T> = Map<string, FuzzyResult<T>>;\n\nexport const fuzzySearch = <Value = any>(\n node: RadixTree<Value>,\n query: string,\n maxDistance: number,\n): FuzzyResults<Value> => {\n const results: FuzzyResults<Value> = new Map();\n\n if (query === undefined) return results;\n\n // Number of columns in the Levenshtein matrix.\n const n = query.length + 1;\n\n // Matching terms can never be longer than N + maxDistance.\n const m = n + maxDistance;\n\n // Fill first matrix row and column with numbers: 0 1 2 3 ...\n const matrix = new Uint8Array(m * n).fill(maxDistance + 1);\n\n for (let j = 0; j < n; ++j) matrix[j] = j;\n for (let i = 1; i < m; ++i) matrix[i * n] = i;\n\n recurse(node, query, maxDistance, results, matrix, 1, n, \"\");\n\n return results;\n};\n\n// Modified version of http://stevehanov.ca/blog/?id=114\n\n// This builds a Levenshtein matrix for a given query and continuously updates\n// it for nodes in the radix tree that fall within the given maximum edit\n// distance. Keeping the same matrix around is beneficial especially for larger\n// edit distances.\n//\n// k a t e <-- query\n// 0 1 2 3 4\n// c 1 1 2 3 4\n// a 2 2 1 2 3\n// t 3 3 2 1 [2] <-- edit distance\n// ^\n// ^ term in radix tree, rows are added and removed as needed\n\nconst recurse = <Value = any>(\n node: RadixTree<Value>,\n query: string,\n maxDistance: number,\n results: FuzzyResults<Value>,\n matrix: Uint8Array,\n m: number,\n n: number,\n prefix: string,\n): void => {\n const offset = m * n;\n\n key: for (const key of node.keys())\n if (key === LEAF) {\n // We've reached a leaf node. Check if the edit distance acceptable and\n // store the result if it is.\n const distance = matrix[offset - 1];\n\n if (distance <= maxDistance)\n results.set(prefix, [node.get(key)!, distance]);\n } else {\n // Iterate over all characters in the key. Update the Levenshtein matrix\n // and check if the minimum distance in the last row is still within the\n // maximum edit distance. If it is, we can recurse over all child nodes.\n let i = m;\n\n for (let pos = 0; pos < key.length; ++pos, ++i) {\n const char = key[pos];\n const thisRowOffset = n * i;\n const prevRowOffset = thisRowOffset - n;\n\n // Set the first column based on the previous row, and initialize the\n // minimum distance in the current row.\n let minDistance = matrix[thisRowOffset];\n\n const jmin = Math.max(0, i - maxDistance - 1);\n const jmax = Math.min(n - 1, i + maxDistance);\n\n // Iterate over remaining columns (characters in the query).\n for (let j = jmin; j < jmax; ++j) {\n const different = char !== query[j];\n\n // It might make sense to only read the matrix positions used for\n // deletion/insertion if the characters are different. But we want to\n // avoid conditional reads for performance reasons.\n const rpl = matrix[prevRowOffset + j] + +different;\n const del = matrix[prevRowOffset + j + 1] + 1;\n const ins = matrix[thisRowOffset + j] + 1;\n\n const dist = (matrix[thisRowOffset + j + 1] = Math.min(\n rpl,\n del,\n ins,\n ));\n\n if (dist < minDistance) minDistance = dist;\n }\n\n // Because distance will never decrease, we can stop. There will be no\n // matching child nodes.\n if (minDistance > maxDistance) continue key;\n }\n\n recurse(\n node.get(key)!,\n query,\n maxDistance,\n results,\n matrix,\n i,\n n,\n prefix + key,\n );\n }\n};\n", "/* eslint-disable no-labels */\nimport { ENTRIES, KEYS, LEAF, TreeIterator, VALUES } from \"./TreeIterator.js\";\nimport { type FuzzyResults, fuzzySearch } from \"./fuzzySearch.js\";\nimport { type Entry, type Path, type RadixTree } from \"./types.js\";\n\n/**\n * A class implementing the same interface as a standard JavaScript\n * [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)\n * with string keys, but adding support for efficiently searching entries with\n * prefix or fuzzy search. This class is used internally by {@link SearchIndex} as\n * the inverted index data structure. The implementation is a radix tree\n * (compressed prefix tree).\n *\n * Since this class can be of general utility beyond _SlimSearch_, it is\n * exported by the `slimsearch` package and can be imported (or required) as\n * `slimsearch/SearchableMap`.\n *\n * @typeParam T The type of the values stored in the map.\n */\nexport class SearchableMap<T = any> {\n /**\n * @internal\n */\n _tree: RadixTree<T>;\n\n /**\n * @internal\n */\n _prefix: string;\n\n private _size: number | undefined = undefined;\n\n /**\n * The constructor is normally called without arguments, creating an empty\n * map. In order to create a {@link SearchableMap} from an iterable or from an\n * object, check {@link SearchableMap.from} and {@link SearchableMap.fromObject}.\n *\n * The constructor arguments are for internal use, when creating derived\n * mutable views of a map at a prefix.\n */\n constructor(tree: RadixTree<T> = new Map(), prefix = \"\") {\n this._tree = tree;\n this._prefix = prefix;\n }\n\n /**\n * Creates and returns a mutable view of this {@link SearchableMap}, containing only\n * entries that share the given prefix.\n *\n * ### Usage:\n *\n * ```js\n * const map = new SearchableMap()\n * map.set(\"unicorn\", 1)\n * map.set(\"universe\", 2)\n * map.set(\"university\", 3)\n * map.set(\"unique\", 4)\n * map.set(\"hello\", 5)\n *\n * const uni = map.atPrefix(\"uni\")\n * uni.get(\"unique\") // => 4\n * uni.get(\"unicorn\") // => 1\n * uni.get(\"hello\") // => undefined\n *\n * const univer = map.atPrefix(\"univer\")\n * univer.get(\"unique\") // => undefined\n * univer.get(\"universe\") // => 2\n * univer.get(\"university\") // => 3\n * ```\n *\n * @param prefix The prefix\n * @return A {@link SearchableMap} representing a mutable view of the original Map at the given prefix\n */\n atPrefix(prefix: string): SearchableMap<T> {\n if (!prefix.startsWith(this._prefix)) throw new Error(\"Mismatched prefix\");\n\n const [node, path] = trackDown(\n this._tree,\n prefix.slice(this._prefix.length),\n );\n\n if (node === undefined) {\n const [parentNode, key] = last(path);\n\n for (const k of parentNode!.keys())\n if (k !== LEAF && k.startsWith(key)) {\n const node = new Map();\n\n node.set(k.slice(key.length), parentNode!.get(k)!);\n\n return new SearchableMap<T>(node, prefix);\n }\n }\n\n return new SearchableMap<T>(node, prefix);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear\n */\n clear(): void {\n this._size = undefined;\n this._tree.clear();\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete\n * @param key Key to delete\n */\n delete(key: string): void {\n this._size = undefined;\n\n return remove(this._tree, key);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries\n * @return An iterator iterating through `[key, value]` entries.\n */\n entries(): TreeIterator<T, \"ENTRIES\"> {\n return new TreeIterator(this, ENTRIES);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach\n * @param fn Iteration function\n */\n forEach(fn: (key: string, value: T, map: SearchableMap) => void): void {\n for (const [key, value] of this) fn(key, value, this);\n }\n\n /**\n * Returns a Map of all the entries that have a key within the given edit\n * distance from the search key. The keys of the returned Map are the matching\n * keys, while the values are two-element arrays where the first element is\n * the value associated to the key, and the second is the edit distance of the\n * key to the search key.\n *\n * ### Usage:\n *\n * ```js\n * const map = new SearchableMap()\n * map.set('hello', 'world')\n * map.set('hell', 'yeah')\n * map.set('ciao', 'mondo')\n *\n * // Get all entries that match the key 'hallo' with a maximum edit distance of 2\n * map.fuzzyGet('hallo', 2)\n * // => Map(2) { 'hello' => ['world', 1], 'hell' => ['yeah', 2] }\n *\n * // In the example, the \"hello\" key has value \"world\" and edit distance of 1\n * // (change \"e\" to \"a\"), the key \"hell\" has value \"yeah\" and edit distance of 2\n * // (change \"e\" to \"a\", delete \"o\")\n * ```\n *\n * @param key The search key\n * @param maxEditDistance The maximum edit distance (Levenshtein)\n * @return A Map of the matching keys to their value and edit distance\n */\n fuzzyGet(key: string, maxEditDistance: number): FuzzyResults<T> {\n return fuzzySearch<T>(this._tree, key, maxEditDistance);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get\n * @param key Key to get\n * @return Value associated to the key, or `undefined` if the key is not\n * found.\n */\n get(key: string): T | undefined {\n const node = lookup<T>(this._tree, key);\n\n return node !== undefined ? node.get(LEAF) : undefined;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has\n * @param key Key\n * @return True if the key is in the map, false otherwise\n */\n has(key: string): boolean {\n const node = lookup(this._tree, key);\n\n return node !== undefined && node.has(LEAF);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys\n * @return An `Iterable` iterating through keys\n */\n keys(): TreeIterator<T, \"KEYS\"> {\n return new TreeIterator(this, KEYS);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set\n * @param key Key to set\n * @param value Value to associate to the key\n * @return The {@link SearchableMap} itself, to allow chaining\n */\n set(key: string, value: T): SearchableMap<T> {\n if (typeof key !== \"string\") throw new Error(\"key must be a string\");\n\n this._size = undefined;\n const node = createPath(this._tree, key);\n\n node.set(LEAF, value);\n\n return this;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/size\n */\n get size(): number {\n if (this._size) return this._size;\n\n /** @ignore */\n this._size = 0;\n\n const iter = this.entries();\n\n while (!iter.next().done) this._size += 1;\n\n return this._size;\n }\n\n /**\n * Updates the value at the given key using the provided function. The function\n * is called with the current value at the key, and its return value is used as\n * the new value to be set.\n *\n * ### Example:\n *\n * ```js\n * // Increment the current value by one\n * searchableMap.update('somekey', (currentValue) => currentValue == null ? 0 : currentValue + 1)\n * ```\n *\n * If the value at the given key is or will be an object, it might not require\n * re-assignment. In that case it is better to use `fetch()`, because it is\n * faster.\n *\n * @param key The key to update\n * @param fn The function used to compute the new value from the current one\n * @return The {@link SearchableMap} itself, to allow chaining\n */\n update(key: string, fn: (value: T | undefined) => T): SearchableMap<T> {\n if (typeof key !== \"string\") throw new Error(\"key must be a string\");\n\n this._size = undefined;\n const node = createPath(this._tree, key);\n\n node.set(LEAF, fn(node.get(LEAF)));\n\n return this;\n }\n\n /**\n * Fetches the value of the given key. If the value does not exist, calls the\n * given function to create a new value, which is inserted at the given key\n * and subsequently returned.\n *\n * ### Example:\n *\n * ```js\n * const map = searchableMap.fetch('somekey', () => new Map())\n * map.set('foo', 'bar')\n * ```\n *\n * @param key The key to update\n * @param initial A function that creates a new value if the key does not exist\n * @return The existing or new value at the given key\n */\n fetch(key: string, initial: () => T): T {\n if (typeof key !== \"string\") throw new Error(\"key must be a string\");\n\n this._size = undefined;\n const node = createPath(this._tree, key);\n\n let value = node.get(LEAF);\n\n if (value === undefined) node.set(LEAF, (value = initial()));\n\n return value;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values\n * @return An `Iterable` iterating through values.\n */\n values(): TreeIterator<T, \"VALUES\"> {\n return new TreeIterator(this, VALUES);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/@@iterator\n */\n [Symbol.iterator](): TreeIterator<T, \"ENTRIES\"> {\n return this.entries();\n }\n\n /**\n * Creates a {@link SearchableMap} from an `Iterable` of entries\n *\n * @param entries Entries to be inserted in the {@link SearchableMap}\n * @return A new {@link SearchableMap} with the given entries\n */\n static from<T = any>(\n entries: Iterable<Entry<T>> | Entry<T>[],\n ): SearchableMap<T> {\n const tree = new SearchableMap<T>();\n\n for (const [key, value] of entries) tree.set(key, value);\n\n return tree;\n }\n\n /**\n * Creates a {@link SearchableMap} from the iterable properties of a JavaScript object\n *\n * @param object Object of entries for the {@link SearchableMap}\n * @return A new {@link SearchableMap} with the given entries\n */\n static fromObject<T = any>(object: { [key: string]: T }): SearchableMap<T> {\n return SearchableMap.from<T>(Object.entries(object));\n }\n}\n\nconst trackDown = <T = any>(\n tree: RadixTree<T> | undefined,\n key: string,\n path: Path<T> = [],\n): [RadixTree<T> | undefined, Path<T>] => {\n if (key.length === 0 || tree == null) return [tree, path];\n\n for (const treeKey of tree.keys())\n if (treeKey !== LEAF && key.startsWith(treeKey)) {\n path.push([tree, treeKey]); // performance: update in place\n\n return trackDown(tree.get(treeKey), key.slice(treeKey.length), path);\n }\n\n path.push([tree, key]); // performance: update in place\n\n return trackDown(undefined, \"\", path);\n};\n\nconst lookup = <T = any>(\n tree: RadixTree<T>,\n key: string,\n): RadixTree<T> | undefined => {\n if (key.length === 0 || tree == null) return tree;\n\n for (const treeKey of tree.keys())\n if (treeKey !== LEAF && key.startsWith(treeKey))\n return lookup(tree.get(treeKey)!, key.slice(treeKey.length));\n};\n\n// Create a path in the radix tree for the given key, and returns the deepest\n// node. This function is in the hot path for indexing. It avoids unnecessary\n// string operations and recursion for performance.\nconst createPath = <T = any>(node: RadixTree<T>, key: string): RadixTree<T> => {\n const keyLength = key.length;\n\n outer: for (let pos = 0; node && pos < keyLength; ) {\n // Check whether this key is a candidate: the first characters must match.\n for (const k of node.keys())\n if (k !== LEAF && key[pos] === k[0]) {\n const len = Math.min(keyLength - pos, k.length);\n\n // Advance offset to the point where key and k no longer match.\n let offset = 1;\n\n while (offset < len && key[pos + offset] === k[offset]) ++offset;\n\n const child = node.get(k)!;\n\n if (offset === k.length) {\n // The existing key is shorter than the key we need to create.\n node = child;\n } else {\n // Partial match: we need to insert an intermediate node to contain\n // both the existing subtree and the new node.\n const intermediate = new Map();\n\n intermediate.set(k.slice(offset), child);\n node.set(key.slice(pos, pos + offset), intermediate);\n node.delete(k);\n node = intermediate;\n }\n\n pos += offset;\n continue outer;\n }\n\n // Create a final child node to contain the final suffix of the key.\n const child = new Map();\n\n node.set(key.slice(pos), child);\n\n return child;\n }\n\n return node;\n};\n\nconst remove = <T = any>(tree: RadixTree<T>, key: string): void => {\n const [node, path] = trackDown(tree, key);\n\n if (node === undefined) return;\n\n node.delete(LEAF);\n\n if (node.size === 0) {\n cleanup(path);\n } else if (node.size === 1) {\n const [key, value] = (<\n IteratorResult<[string, RadixTree<T>], [string, RadixTree<T>]>\n >node.entries().next()).value;\n\n merge(path, key, value);\n }\n};\n\nconst cleanup = <T = any>(path: Path<T>): void => {\n if (path.length === 0) return;\n\n const [node, key] = last(path);\n\n node!.delete(key);\n\n if (node!.size === 0) {\n cleanup(path.slice(0, -1));\n } else if (node!.size === 1) {\n const [key, value] = (<\n IteratorResult<[string, RadixTree<T>], [string, RadixTree<T>]>\n >node!.entries().next()).value;\n\n if (key !== LEAF) merge(path.slice(0, -1), key, value);\n }\n};\n\nconst merge = <T = any>(\n path: Path<T>,\n key: string,\n value: RadixTree<T>,\n): void => {\n if (path.length === 0) return;\n\n const [node, nodeKey] = last(path);\n\n node!.set(nodeKey + key, value);\n node!.delete(nodeKey);\n};\n\nconst last = <T = any>(array: T[]): T => {\n return array[array.length - 1];\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\n\n/**\n * Returns `true` if a document with the given ID is present in the index and\n * available for search, `false` otherwise\n *\n * @param searchIndex The search Index\n * @param id The document ID\n */\nexport const has = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n id: ID,\n): boolean => searchIndex._idToShortId.has(id);\n\n/**\n * Returns the stored fields (as configured in the `storeFields` constructor\n * option) for the given document ID. Returns `undefined` if the document is\n * not present in the index.\n *\n * @param searchIndex The search Index\n * @param id The document ID\n */\nexport const getStoredFields = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n id: ID,\n): Index | undefined => {\n const shortId = searchIndex._idToShortId.get(id);\n\n if (shortId == null) return undefined;\n\n return searchIndex._storedFields.get(shortId);\n};\n", "// This regular expression matches any Unicode space or punctuation character\n// Adapted from https://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5Cp%7BZ%7D%5Cp%7BP%7D&abb=on&c=on&esc=on\nexport const SPACE_OR_PUNCTUATION =\n /[\\n\\r -#%-*,-/:;?@[-\\]_{}\\u00A0\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u1680\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2000-\\u200A\\u2010-\\u2029\\u202F-\\u2043\\u2045-\\u2051\\u2053-\\u205F\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u3000-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]+/u;\n\nexport const OR = \"or\" as const;\nexport const AND = \"and\" as const;\nexport const AND_NOT = \"and_not\" as const;\n", "import { AND, AND_NOT, OR } from \"./constant.js\";\nimport {\n type BM25Params,\n type LowercaseCombinationOperator,\n type MatchInfo,\n type SearchOptions,\n} from \"./typings.js\";\n\nexport const assignUniqueTerm = (target: string[], term: string): void => {\n // Avoid adding duplicate terms.\n if (!target.includes(term)) target.push(term);\n};\n\nexport const assignUniqueTerms = (\n target: string[],\n source: readonly string[],\n): void => {\n // Avoid adding duplicate terms.\n for (const term of source) if (!target.includes(term)) target.push(term);\n};\n\ninterface Scored {\n score: number;\n}\n\nexport const byScore = ({ score: a }: Scored, { score: b }: Scored): number =>\n b - a;\n\nexport const createMap = <K, V>(): Map<K, V> => new Map<K, V>();\n\nexport const objectToNumericMap = <Value>(object: {\n [key: string]: Value;\n}): Map<number, Value> => {\n const map = new Map<number, Value>();\n\n for (const key of Object.keys(object))\n map.set(parseInt(key, 10), object[key]);\n\n return map;\n};\n\nexport const getOwnProperty = (object: any, property: string): unknown =>\n Object.prototype.hasOwnProperty.call(object, property)\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n object[property]\n : undefined;\n\ninterface RawResultValue {\n // Intermediate score, before applying the final score based on number of\n // matched terms.\n score: number;\n\n // Set of all query terms that were matched. They may not be present in the\n // text exactly in the case of prefix/fuzzy matches. We must check for\n // uniqueness before adding a new term. This is much faster than using a set,\n // because the number of elements is relatively small.\n terms: string[];\n\n // All terms that were found in the content, including the fields in which\n // they were present. This object will be provided as part of the final search\n // results.\n match: MatchInfo;\n}\n\nexport type RawResult = Map<number, RawResultValue>;\n\nexport type CombinatorFunction = (a: RawResult, b: RawResult) => RawResult;\n\nexport const combinators: Record<\n LowercaseCombinationOperator,\n CombinatorFunction\n> = {\n [OR]: (a: RawResult, b: RawResult) => {\n for (const docId of b.keys()) {\n const existing = a.get(docId);\n\n if (existing == null) {\n a.set(docId, b.get(docId)!);\n } else {\n const { score, terms, match } = b.get(docId)!;\n\n existing.score = existing.score + score;\n existing.match = Object.assign(existing.match, match);\n assignUniqueTerms(existing.terms, terms);\n }\n }\n\n return a;\n },\n [AND]: (a: RawResult, b: RawResult) => {\n const combined = new Map();\n\n for (const docId of b.keys()) {\n const existing = a.get(docId);\n\n if (existing == null) continue;\n\n const { score, terms, match } = b.get(docId)!;\n\n assignUniqueTerms(existing.terms, terms);\n combined.set(docId, {\n score: existing.score + score,\n terms: existing.terms,\n match: Object.assign(existing.match, match),\n });\n }\n\n return combined;\n },\n [AND_NOT]: (a: RawResult, b: RawResult) => {\n for (const docId of b.keys()) a.delete(docId);\n\n return a;\n },\n};\n\nexport const calcBM25Score = (\n termFreq: number,\n matchingCount: number,\n totalCount: number,\n fieldLength: number,\n avgFieldLength: number,\n bm25params: BM25Params,\n): number => {\n const { k, b, d } = bm25params;\n const invDocFreq = Math.log(\n 1 + (totalCount - matchingCount + 0.5) / (matchingCount + 0.5),\n );\n\n return (\n invDocFreq *\n (d +\n (termFreq * (k + 1)) /\n (termFreq + k * (1 - b + (b * fieldLength) / avgFieldLength)))\n );\n};\n\nexport type QuerySpec = {\n prefix: boolean;\n fuzzy: number | boolean;\n term: string;\n};\n\nexport const termToQuerySpec =\n (options: SearchOptions) =>\n (term: string, i: number, terms: string[]): QuerySpec => {\n const fuzzy =\n typeof options.fuzzy === \"function\"\n ? options.fuzzy(term, i, terms)\n : options.fuzzy || false;\n const prefix =\n typeof options.prefix === \"function\"\n ? options.prefix(term, i, terms)\n : options.prefix === true;\n\n return { term, fuzzy, prefix };\n };\n", "import { type SearchIndex } from \"./SearchIndex.js\";\n\nexport const warnDocumentChanged = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n shortDocumentId: number,\n fieldId: number,\n term: string,\n): void => {\n for (const fieldName of Object.keys(searchIndex._fieldIds))\n if (searchIndex._fieldIds[fieldName] === fieldId) {\n searchIndex._options.logger(\n \"warn\",\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `SlimSearch: document with ID ${searchIndex._documentIds.get(\n shortDocumentId,\n )} has changed before removal: term \"${term}\" was not present in field \"${fieldName}\". Removing a document after it has changed can corrupt the index!`,\n \"version_conflict\",\n );\n\n return;\n }\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { createMap } from \"./utils.js\";\nimport { warnDocumentChanged } from \"./warning.js\";\n\n/**\n * @ignore\n */\nexport const addTerm = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n fieldId: number,\n documentId: number,\n term: string,\n): void => {\n const indexData = searchIndex._index.fetch(term, createMap);\n\n let fieldIndex = indexData.get(fieldId);\n\n if (fieldIndex == null) {\n fieldIndex = new Map();\n fieldIndex.set(documentId, 1);\n indexData.set(fieldId, fieldIndex);\n } else {\n const docs = fieldIndex.get(documentId);\n\n fieldIndex.set(documentId, (docs || 0) + 1);\n }\n};\n\nexport const removeTerm = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n fieldId: number,\n documentId: number,\n term: string,\n): void => {\n if (!searchIndex._index.has(term)) {\n warnDocumentChanged(searchIndex, documentId, fieldId, term);\n\n return;\n }\n\n const indexData = searchIndex._index.fetch(term, createMap);\n\n const fieldIndex = indexData.get(fieldId);\n\n if (fieldIndex == null || fieldIndex.get(documentId) == null)\n warnDocumentChanged(searchIndex, documentId, fieldId, term);\n else if (fieldIndex.get(documentId)! <= 1)\n if (fieldIndex.size <= 1) indexData.delete(fieldId);\n else fieldIndex.delete(documentId);\n else fieldIndex.set(documentId, fieldIndex.get(documentId)! - 1);\n\n if (searchIndex._index.get(term)!.size === 0) searchIndex._index.delete(term);\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { has } from \"./info.js\";\nimport { addTerm } from \"./term.js\";\n\nconst addFieldLength = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documentId: number,\n fieldId: number,\n count: number,\n length: number,\n): void => {\n let fieldLengths = searchIndex._fieldLength.get(documentId);\n\n if (fieldLengths == null)\n searchIndex._fieldLength.set(documentId, (fieldLengths = []));\n fieldLengths[fieldId] = length;\n\n const averageFieldLength = searchIndex._avgFieldLength[fieldId] || 0;\n const totalFieldLength = averageFieldLength * count + length;\n\n searchIndex._avgFieldLength[fieldId] = totalFieldLength / (count + 1);\n};\n\nconst addDocumentId = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documentId: ID,\n): number => {\n const shortDocumentId = searchIndex._nextId;\n\n searchIndex._idToShortId.set(documentId, shortDocumentId);\n searchIndex._documentIds.set(shortDocumentId, documentId);\n searchIndex._documentCount += 1;\n searchIndex._nextId += 1;\n\n return shortDocumentId;\n};\n\nconst saveStoredFields = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documentId: number,\n doc: Document,\n): void => {\n const { storeFields, extractField } = searchIndex._options;\n\n if (storeFields == null || storeFields.length === 0) return;\n\n let documentFields: Record<string, unknown> | undefined =\n searchIndex._storedFields.get(documentId);\n\n if (documentFields === undefined)\n searchIndex._storedFields.set(documentId, <Index>(documentFields = {}));\n\n for (const fieldName of storeFields) {\n const fieldValue = extractField(doc, fieldName);\n\n if (fieldValue !== undefined) documentFields[fieldName] = fieldValue;\n }\n};\n\n/**\n * Adds a document to the index\n *\n * @param searchIndex The search index\n * @param document The document to be indexed\n */\nexport const add = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n document: Document,\n): void => {\n const { extractField, tokenize, processTerm, fields, idField } =\n searchIndex._options;\n const id = <ID>extractField(document, idField);\n\n if (id == null)\n throw new Error(`SlimSearch: document does not have ID field \"${idField}\"`);\n\n if (has(searchIndex, id))\n throw new Error(`SlimSearch: duplicate ID ${<string>id}`);\n\n // @ts-ignore\n const shortDocumentId = addDocumentId(searchIndex, id);\n\n saveStoredFields(searchIndex, shortDocumentId, document);\n\n for (const field of fields) {\n const fieldValue = extractField(document, field);\n\n if (fieldValue == null) continue;\n\n const tokens = tokenize(fieldValue.toString(), field);\n const fieldId = searchIndex._fieldIds[field];\n\n const uniqueTerms = new Set(tokens).size;\n\n addFieldLength(\n searchIndex,\n shortDocumentId,\n fieldId,\n searchIndex._documentCount - 1,\n uniqueTerms,\n );\n\n for (const term of tokens) {\n const processedTerm = processTerm(term, field);\n\n if (Array.isArray(processedTerm))\n for (const t of processedTerm)\n addTerm(searchIndex, fieldId, shortDocumentId, t);\n else if (processedTerm)\n addTerm(searchIndex, fieldId, shortDocumentId, processedTerm);\n }\n }\n};\n\n/**\n * Adds all the given documents to the index\n *\n * @param searchIndex The search index\n * @param documents An array of documents to be indexed\n */\nexport const addAll = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documents: readonly Document[],\n): void => {\n for (const document of documents) add(searchIndex, document);\n};\n\n/**\n * Adds all the given documents to the index asynchronously.\n *\n * Returns a promise that resolves (to `undefined`) when the indexing is done.\n * This method is useful when index many documents, to avoid blocking the main\n * thread. The indexing is performed asynchronously and in chunks.\n *\n * @param searchIndex The search index\n * @param documents An array of documents to be indexed\n * @param options Configuration options\n * @return A promise resolving to `undefined` when the indexing is done\n */\nexport const addAllAsync = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documents: readonly Document[],\n options: { chunkSize?: number } = {},\n): Promise<void> => {\n const { chunkSize = 10 } = options;\n const acc: { chunk: Document[]; promise: Promise<void> } = {\n chunk: [],\n promise: Promise.resolve(),\n };\n\n const { chunk, promise } = documents.reduce(\n ({ chunk, promise }, document, index) => {\n chunk.push(document);\n if ((index + 1) % chunkSize === 0)\n return {\n chunk: [],\n promise: promise\n .then(() => new Promise((resolve) => setTimeout(resolve, 0)))\n .then(() => addAll(searchIndex, chunk)),\n };\n else return { chunk, promise };\n },\n acc,\n );\n\n return promise.then(() => addAll(searchIndex, chunk));\n};\n", "import { AND, OR, SPACE_OR_PUNCTUATION } from \"./constant.js\";\nimport { type BM25Params, type LogLevel } from \"./typings.js\";\nimport { getOwnProperty } from \"./utils.js\";\n\nexport const defaultBM25params: BM25Params = { k: 1.2, b: 0.7, d: 0.5 };\n\nexport const defaultOptions = {\n idField: \"id\",\n extractField: (document: any, fieldName: string): unknown =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n document[fieldName],\n tokenize: (text: string): string[] => text.split(SPACE_OR_PUNCTUATION),\n processTerm: (term: string): string => term.toLowerCase(),\n fields: undefined,\n searchOptions: undefined,\n storeFields: [],\n logger: (level: LogLevel, message: string): void => {\n if (typeof console?.[level] === \"function\") console[level](message);\n },\n autoVacuum: true,\n};\n\nexport const defaultSearchOptions = {\n combineWith: OR,\n prefix: false,\n fuzzy: false,\n maxFuzzy: 6,\n boost: {},\n weights: { fuzzy: 0.45, prefix: 0.375 },\n bm25: defaultBM25params,\n};\n\nexport const defaultAutoSuggestOptions = {\n combineWith: AND,\n prefix: (_term: string, index: number, terms: string[]): boolean =>\n index === terms.length - 1,\n};\n\nexport const defaultVacuumOptions = { batchSize: 1000, batchWait: 10 };\nexport const defaultVacuumConditions = { minDirtFactor: 0.1, minDirtCount: 20 };\n\nexport const defaultAutoVacuumOptions = {\n ...defaultVacuumOptions,\n ...defaultVacuumConditions,\n};\n\n/**\n * Returns the default value of an option. It will throw an error if no option\n * with the given name exists.\n *\n * @param optionName Name of the option\n * @return The default value of the given option\n *\n * ### Usage:\n *\n * ```js\n * // Get default tokenizer\n * getDefaultValue('tokenize')\n *\n * // Get default term processor\n * getDefaultValue('processTerm')\n *\n * // Unknown options will throw an error\n * getDefaultValue('notExisting')\n * // => throws 'SlimSearch: unknown option \"notExisting\"'\n * ```\n */\nexport const getDefaultValue = (optionName: string): unknown => {\n // eslint-disable-next-line no-prototype-builtins\n if (defaultOptions.hasOwnProperty(optionName))\n return getOwnProperty(defaultOptions, optionName);\n else throw new Error(`SlimSearch: unknown option \"${optionName}\"`);\n};\n", "export const WILDCARD = Symbol(\"*\");\n", "import { FieldTermData, type SearchIndex } from \"./SearchIndex.js\";\nimport { OR } from \"./constant.js\";\nimport { defaultSearchOptions } from \"./defaults.js\";\nimport { WILDCARD } from \"./symbols.js\";\nimport { removeTerm } from \"./term.js\";\nimport {\n type BM25Params,\n type CombinationOperator,\n type LowercaseCombinationOperator,\n type Query,\n type SearchOptions,\n} from \"./typings.js\";\nimport {\n type QuerySpec,\n type RawResult,\n assignUniqueTerm,\n calcBM25Score,\n combinators,\n getOwnProperty,\n termToQuerySpec,\n} from \"./utils.js\";\n\nexport interface SearchOptionsWithDefaults<\n ID = any,\n Index extends Record<string, any> = Record<string, never>,\n> extends SearchOptions<ID, Index> {\n boost: { [fieldName: string]: number };\n\n weights: { fuzzy: number; prefix: number };\n\n prefix: boolean | ((term: string, index: number, terms: string[]) => boolean);\n\n fuzzy:\n | boolean\n | number\n | ((term: string, index: number, terms: string[]) => boolean | number);\n\n maxFuzzy: number;\n\n combineWith: CombinationOperator;\n\n bm25: BM25Params;\n}\n\nexport type DocumentTermFrequencies = Map<number, number>;\n\nconst executeWildcardQuery = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n searchOptions: SearchOptions<ID, Index>,\n): RawResult => {\n const results = new Map() as RawResult;\n const options: SearchOptionsWithDefaults<ID, Index> = {\n ...searchIndex._options.searchOptions,\n ...searchOptions,\n };\n\n for (const [shortId, id] of searchIndex._documentIds) {\n const score = options.boostDocument\n ? options.boostDocument(id, \"\", searchIndex._storedFields.get(shortId))\n : 1;\n\n results.set(shortId, {\n score,\n terms: [],\n match: {},\n });\n }\n\n return results;\n};\n\nconst combineResults = (\n results: RawResult[],\n combineWith: CombinationOperator = OR,\n): RawResult => {\n if (results.length === 0) return new Map();\n\n const operator = <LowercaseCombinationOperator>combineWith.toLowerCase();\n\n const combinator = combinators[<LowercaseCombinationOperator>operator];\n\n if (!combinator)\n throw new Error(`Invalid combination operator: ${combineWith}`);\n\n return results.reduce(combinator) || new Map();\n};\n\nconst termResults = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n sourceTerm: string,\n derivedTerm: string,\n termWeight: number,\n fieldTermData: FieldTermData | undefined,\n fieldBoosts: { [field: string]: number },\n boostDocumentFn:\n | ((id: ID, term: string, storedFields?: Index) => number)\n | undefined,\n bm25params: BM25Params,\n results: RawResult = new Map(),\n): RawResult => {\n if (fieldTermData == null) return results;\n\n for (const field of Object.keys(fieldBoosts)) {\n const fieldBoost = fieldBoosts[field];\n const fieldId = searchIndex._fieldIds[field];\n\n const fieldTermFrequencies = fieldTermData.get(fieldId);\n\n if (fieldTermFrequencies == null) continue;\n\n let matchingFields = fieldTermFrequencies.size;\n const avgFieldLength = searchIndex._avgFieldLength[fieldId];\n\n for (const docId of fieldTermFrequencies.keys()) {\n if (!searchIndex._documentIds.has(docId)) {\n removeTerm(searchIndex, fieldId, docId, derivedTerm);\n matchingFields -= 1;\n continue;\n }\n\n const docBoost = boostDocumentFn\n ? boostDocumentFn(\n searchIndex._documentIds.get(docId)!,\n derivedTerm,\n searchIndex._storedFields.get(docId),\n )\n : 1;\n\n if (!docBoost) continue;\n\n const termFreq = fieldTermFrequencies.get(docId)!;\n const fieldLength = searchIndex._fieldLength.get(docId)![fieldId];\n\n // NOTE: The total number of fields is set to the number of documents\n // `this._documentCount`. It could also make sense to use the number of\n // documents where the current field is non-blank as a normalization\n // factor. This will make a difference in scoring if the field is rarely\n // present. This is currently not supported, and may require further\n // analysis to see if it is a valid use case.\n const rawScore = calcBM25Score(\n termFreq,\n matchingFields,\n searchIndex._documentCount,\n fieldLength,\n avgFieldLength,\n bm25params,\n );\n const weightedScore = termWeight * fieldBoost * docBoost * rawScore;\n\n const result = results.get(docId);\n\n if (result) {\n result.score += weightedScore;\n assignUniqueTerm(result.terms, sourceTerm);\n const match = <string[]>getOwnProperty(result.match, derivedTerm);\n\n if (match) match.push(field);\n else result.match[derivedTerm] = [field];\n } else {\n results.set(docId, {\n score: weightedScore,\n terms: [sourceTerm],\n match: { [derivedTerm]: [field] },\n });\n }\n }\n }\n\n return results;\n};\n\nconst executeQuerySpec = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n query: QuerySpec,\n searchOptions: SearchOptions<ID, Index>,\n): RawResult => {\n const options: SearchOptionsWithDefaults<ID, Index> = {\n ...searchIndex._options.searchOptions,\n ...searchOptions,\n };\n\n const boosts = (options.fields || searchIndex._options.fields).reduce(\n (boosts, field) => ({\n ...boosts,\n [field]: getOwnProperty(options.boost, field) || 1,\n }),\n {},\n );\n\n const { boostDocument, weights, maxFuzzy, bm25: bm25params } = options;\n\n const { fuzzy: fuzzyWeight, prefix: prefixWeight } = {\n ...defaultSearchOptions.weights,\n ...weights,\n };\n\n const data = searchIndex._index.get(query.term);\n const results = termResults(\n searchIndex,\n query.term,\n query.term,\n 1,\n data,\n boosts,\n boostDocument,\n bm25params,\n );\n\n let prefixMatches;\n let fuzzyMatches;\n\n if (query.prefix) prefixMatches = searchIndex._index.atPrefix(query.term);\n\n if (query.fuzzy) {\n const fuzzy = query.fuzzy === true ? 0.2 : query.fuzzy;\n const maxDistance =\n fuzzy < 1\n ? Math.min(maxFuzzy, Math.round(query.term.length * fuzzy))\n : fuzzy;\n\n if (maxDistance)\n fuzzyMatches = searchIndex._index.fuzzyGet(query.term, maxDistance);\n }\n\n if (prefixMatches)\n for (const [term, data] of prefixMatches) {\n const distance = term.length - query.term.length;\n\n if (!distance) continue;\n // Skip exact match.\n\n // Delete the term from fuzzy results (if present) if it is also a\n // prefix result. This entry will always be scored as a prefix result.\n fuzzyMatches?.delete(term);\n\n // Weight gradually approaches 0 as distance goes to infinity, with the\n // weight for the hypothetical distance 0 being equal to prefixWeight.\n // The rate of change is much lower than that of fuzzy matches to\n // account for the fact that prefix matches stay more relevant than\n // fuzzy matches for longer distances.\n const weight =\n (prefixWeight * term.length) / (term.length + 0.3 * distance);\n\n termResults(\n searchIndex,\n query.term,\n term,\n weight,\n data,\n boosts,\n boostDocument,\n bm25params,\n results,\n );\n }\n\n if (fuzzyMatches)\n for (const term of fuzzyMatches.keys()) {\n const [data, distance] = fuzzyMatches.get(term)!;\n\n if (!distance) continue;\n // Skip exact match.\n\n // Weight gradually approaches 0 as distance goes to infinity, with the\n // weight for the hypothetical distance 0 being equal to fuzzyWeight.\n const weight = (fuzzyWeight * term.length) / (term.length + distance);\n\n termResults(\n searchIndex,\n query.term,\n term,\n weight,\n data,\n boosts,\n boostDocument,\n bm25params,\n results,\n );\n }\n\n return results;\n};\n\nexport const executeQuery = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n query: Query,\n searchOptions: SearchOptions<ID, Index> = {},\n): RawResult => {\n if (query === WILDCARD)\n return executeWildcardQuery(searchIndex, searchOptions);\n\n if (typeof query !== \"string\") {\n const options = { ...searchOptions, ...query, queries: undefined };\n const results = query.queries.map((subQuery) =>\n executeQuery(searchIndex, subQuery, options),\n );\n\n return combineResults(results, options.combineWith);\n }\n\n const {\n tokenize,\n processTerm,\n searchOptions: globalSearchOptions,\n } = searchIndex._options;\n const options = {\n tokenize,\n processTerm,\n ...globalSearchOptions,\n ...searchOptions,\n };\n const { tokenize: searchTokenize, processTerm: searchProcessTerm } = options;\n // @ts-ignore\n const terms = searchTokenize(query)\n // @ts-ignore\n .flatMap((term: string) => searchProcessTerm(term))\n .filter((term) => !!term) as string[];\n // @ts-ignore\n const queries: QuerySpec[] = terms.map(termToQuerySpec(options));\n const results = queries.map((query) =>\n // @ts-ignore\n executeQuerySpec(searchIndex, query, options),\n );\n\n return combineResults(results, options.combineWith);\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { executeQuery } from \"./results.js\";\nimport { WILDCARD } from \"./symbols.js\";\nimport {\n type Query,\n type SearchOptions,\n type SearchResult,\n} from \"./typings.js\";\nimport { byScore } from \"./utils.js\";\n\n/**\n * Search for documents matching the given search query.\n *\n * The result is a list of scored document IDs matching the query, sorted by\n * descending score, and each including data about which terms were matched and\n * in which fields.\n *\n * ### Basic usage:\n *\n * ```js\n * // Search for \"zen art motorcycle\" with default options: terms have to match\n * // exactly, and individual terms are joined with OR\n * search(searchIndex, 'zen art motorcycle')\n * // => [ { id: 2, score: 2.77258, match: { ... } }, { id: 4, score: 1.38629, match: { ... } } ]\n * ```\n *\n * ### Restrict search to specific fields:\n *\n * ```js\n * // Search only in the 'title' field\n * search(searchIndex, 'zen', { fields: ['title'] })\n * ```\n *\n * ### Field boosting:\n *\n * ```js\n * // Boost a field\n * search(searchIndex, 'zen', { boost: { title: 2 } })\n * ```\n *\n * ### Prefix search:\n *\n * ```js\n * // Search for \"moto\" with prefix search (it will match documents\n * // containing terms that start with \"moto\" or \"neuro\")\n * search(searchIndex, 'moto neuro', { prefix: true })\n * ```\n *\n * ### Fuzzy search:\n *\n * ```js\n * // Search for \"ismael\" with fuzzy search (it will match documents containing\n * // terms similar to \"ismael\", with a maximum edit distance of 0.2 term.length\n * // (rounded to nearest integer)\n * search(searchIndex, 'ismael', { fuzzy: 0.2 })\n * ```\n *\n * ### Combining strategies:\n *\n * ```js\n * // Mix of exact match, prefix search, and fuzzy search\n * search(searchIndex, 'ismael mob', {\n * prefix: true,\n * fuzzy: 0.2\n * })\n * ```\n *\n * ### Advanced prefix and fuzzy search:\n *\n * ```js\n * // Perform fuzzy and prefix search depending on the search term. Here\n * // performing prefix and fuzzy search only on terms longer than 3 characters\n * search(searchIndex, 'ismael mob', {\n * prefix: term => term.length > 3\n * fuzzy: term => term.length > 3 ? 0.2 : null\n * })\n * ```\n *\n * ### Combine with AND:\n *\n * ```js\n * // Combine search terms with AND (to match only documents that contain both\n * // \"motorcycle\" and \"art\")\n * search(searchIndex, 'motorcycle art', { combineWith: 'AND' })\n * ```\n *\n * ### Combine with AND_NOT:\n *\n * There is also an AND_NOT combinator, that finds documents that match the\n * first term, but do not match any of the other terms. This combinator is\n * rarely useful with simple queries, and is meant to be used with advanced\n * query combinations (see later for more details).\n *\n * ### Filtering results:\n *\n * ```js\n * // Filter only results in the 'fiction' category (assuming that 'category'\n * // is a stored field)\n * search(searchIndex, 'motorcycle art', {\n * filter: (result) => result.category === 'fiction'\n * })\n * ```\n *\n * ### Wildcard query\n *\n * Searching for an empty string (assuming the default tokenizer) returns no\n * results. Sometimes though, one needs to match all documents, like in a\n * \"wildcard\" search. This is possible by passing the special value\n * `wildcard` as the query:\n *\n * ```javascript\n * // Return search results for all documents\n * search(index, WILDCARD)\n * ```\n *\n * Note that search options such as `filter` and `boostDocument` are still\n * applied, influencing which results are returned, and their order:\n *\n * ```javascript\n * // Return search results for all documents in the 'fiction' category\n * search(index, WILDCARD, {\n * filter: (result) => result.category === 'fiction'\n * })\n * ```\n *\n * ### Advanced combination of queries:\n *\n * It is possible to combine different subqueries with OR, AND, and AND_NOT,\n * and even with different search options, by passing a query expression\n * tree object as the first argument, instead of a string.\n *\n * ```js\n * // Search for documents that contain \"zen\" and (\"motorcycle\" or \"archery\")\n * search(searchIndex, {\n * combineWith: 'AND',\n * queries: [\n * 'zen',\n * {\n * combineWith: 'OR',\n * queries: ['motorcycle', 'archery']\n * }\n * ]\n * })\n *\n * // Search for documents that contain (\"apple\" or \"pear\") but not \"juice\" and\n * // not \"tree\"\n * search(searchIndex, {\n * combineWith: 'AND_NOT',\n * queries: [\n * {\n * combineWith: 'OR',\n * queries: ['apple', 'pear']\n * },\n * 'juice',\n * 'tree'\n * ]\n * })\n * ```\n *\n * Each node in the expression tree can be either a string, or an object that\n * supports all `SearchOptions` fields, plus a `queries` array field for\n * subqueries.\n *\n * Note that, while this can become complicated to do by hand for complex or\n * deeply nested queries, it provides a formalized expression tree API for\n * external libraries that implement a parser for custom query languages.\n *\n * @param searchIndex Search Index\n * @param query Search query\n * @param options Search options. Each option, if not given, defaults to the corresponding value of `searchOptions` given to the constructor, or to the library default.\n */\nexport const search = <\n ID,\n Document,\n Index extends Record<string, any> = Partial<Document>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n query: Query,\n searchOptions: SearchOptions<ID, Index> = {},\n): SearchResult<ID, Index>[] => {\n const rawResults = executeQuery(searchIndex, query, searchOptions);\n\n const results: SearchResult<ID, Index>[] = [];\n\n for (const [docId, { score, terms, match }] of rawResults) {\n // terms are the matched query terms, which will be returned to the user\n // as queryTerms. The quality is calculated based on them, as opposed to\n // the matched terms in the document (which can be different due to\n // prefix and fuzzy match)\n const quality = terms.length || 1;\n\n const result = <SearchResult<ID, Index>>{\n id: searchIndex._documentIds.get(docId)!,\n score: score * quality,\n terms: Object.keys(match),\n queryTerms: terms,\n match,\n };\n\n Object.assign(result, searchIndex._storedFields.get(docId));\n if (searchOptions.filter == null || searchOptions.filter(result))\n results.push(result);\n }\n\n // If it's a wildcard query, and no document boost is applied, skip sorting\n // the results, as all results have the same score of 1\n if (\n query === WILDCARD &&\n searchOptions.boostDocument == null &&\n searchIndex._options.searchOptions.boostDocument == null\n )\n return results;\n\n results.sort(byScore);\n\n return results;\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { search } from \"./search.js\";\nimport { type SearchOptions, type Suggestion } from \"./typings.js\";\nimport { byScore } from \"./utils.js\";\n\n/**\n * Provide suggestions for the given search query\n *\n * The result is a list of suggested modified search queries, derived from the\n * given search query, each with a relevance score, sorted by descending score.\n *\n * By default, it uses the same options used for search, except that by\n * default it performs prefix search on the last term of the query, and\n * combine terms with `'AND'` (requiring all query terms to match). Custom\n * options can be passed as a second argument. Defaults can be changed by\n * passing an `autoSuggestOptions` option when initializing the index.\n *\n * ### Basic usage:\n *\n * ```js\n * // Get suggestions for 'neuro':\n * autoSuggest(searchIndex, 'neuro')\n * // => [ { suggestion: 'neuromancer', terms: [ 'neuromancer' ], score: 0.46240 } ]\n * ```\n *\n * ### Multiple words:\n *\n * ```js\n * // Get suggestions for 'zen ar':\n * autoSuggest(searchIndex, 'zen ar')\n * // => [\n * // { suggestion: 'zen archery art', terms: [ 'zen', 'archery', 'art' ], score: 1.73332 },\n * // { suggestion: 'zen art', terms: [ 'zen', 'art' ], score: 1.21313 }\n * // ]\n * ```\n *\n * ### Fuzzy suggestions:\n *\n * ```js\n * // Correct spelling mistakes using fuzzy search:\n * autoSuggest(searchIndex, 'neromancer', { fuzzy: 0.2 })\n * // => [ { suggestion: 'neuromancer', terms: [ 'neuromancer' ], score: 1.03998 } ]\n * ```\n *\n * ### Filtering:\n *\n * ```js\n * // Get suggestions for 'zen ar', but only within the 'fiction' category\n * // (assuming that 'category' is a stored field):\n * autoSuggest(searchIndex, 'zen ar', {\n * filter: (result) => result.category === 'fiction'\n * })\n * // => [\n * // { suggestion: 'zen archery art', terms: [ 'zen', 'archery', 'art' ], score: 1.73332 },\n * // { suggestion: 'zen art', terms: [ 'zen', 'art' ], score: 1.21313 }\n * // ]\n * ```\n *\n * @param searchIndex The search Index\n * @param queryString Query string to be expanded into suggestions\n * @param options Search options. The supported options and default values\n * are the same as for the `search` method, except that by default prefix\n * search is performed on the last term in the query, and terms are combined\n * with `'AND'`.\n * @return A sorted array of suggestions sorted by relevance score.\n */\nexport const autoSuggest = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n queryString: string,\n options: SearchOptions<ID, Index> = {},\n): Suggestion[] => {\n options = { ...searchIndex._options.autoSuggestOptions, ...options };\n\n const suggestions: Map<\n string,\n Omit<Suggestion, \"suggestion\"> & { count: number }\n > = new Map();\n\n for (const { score, terms } of search(searchIndex, queryString, options)) {\n const phrase = terms.join(\" \");\n const suggestion = suggestions.get(phrase);\n\n if (suggestion != null) {\n suggestion.score += score;\n suggestion.count += 1;\n } else {\n suggestions.set(phrase, { score, terms, count: 1 });\n }\n }\n\n const results = [];\n\n for (const [suggestion, { score, terms, count }] of suggestions)\n results.push({ suggestion, terms, score: score / count });\n\n results.sort(byScore);\n\n return results;\n};\n", "import { SearchableMap } from \"./SearchableMap/SearchableMap.js\";\nimport {\n defaultAutoSuggestOptions,\n defaultAutoVacuumOptions,\n defaultOptions,\n defaultSearchOptions,\n defaultVacuumConditions,\n} from \"./defaults.js\";\nimport {\n type DocumentTermFrequencies,\n type SearchOptionsWithDefaults,\n} from \"./results.js\";\nimport {\n type AutoVacuumOptions,\n type IndexObject,\n type LogLevel,\n type SearchIndexOptions,\n type SearchOptions,\n type SerializedIndexEntry,\n type VacuumConditions,\n} from \"./typings.js\";\n\ninterface OptionsWithDefaults<\n ID = any,\n Document = any,\n Index extends Record<string, any> = Record<string, never>,\n> extends Omit<\n SearchIndexOptions<ID, Document, Index>,\n \"processTerm\" | \"tokenize\"\n > {\n storeFields: string[];\n\n idField: string;\n\n extractField: (document: Document, fieldName: string) => string;\n\n tokenize: (text: string, fieldName: string) => string[];\n\n processTerm: (\n term: string,\n fieldName: string,\n ) => string | string[] | null | undefined | false;\n\n logger: (level: LogLevel, message: string, code?: string) => void;\n\n autoVacuum: false | AutoVacuumOptions;\n\n searchOptions: SearchOptionsWithDefaults<ID, Index>;\n\n autoSuggestOptions: SearchOptions<ID, Index>;\n}\n\nexport type FieldTermData = Map<number, DocumentTermFrequencies>;\n\n/**\n *\n * @typeParam ID The id type of the documents being indexed.\n * @typeParam Document The type of the documents being indexed.\n * @typeParam Index The type of the documents being indexed.\n *\n * ### Basic example:\n *\n * ```js\n * const documents = [\n * {\n * id: 1,\n * title: 'Moby Dick',\n * text: 'Call me Ishmael. Some years ago...',\n * category: 'fiction'\n * },\n * {\n * id: 2,\n * title: 'Zen and the Art of Motorcycle Maintenance',\n * text: 'I can see by my watch...',\n * category: 'fiction'\n * },\n * {\n * id: 3,\n * title: 'Neuromancer',\n * text: 'The sky above the port was...',\n * category: 'fiction'\n * },\n * {\n * id: 4,\n * title: 'Zen and the Art of Archery',\n * text: 'At first sight it must seem...',\n * category: 'non-fiction'\n * },\n * // ...and more\n * ]\n *\n * // Create a search engine that indexes the 'title' and 'text' fields for\n * // full-text search. Search results will include 'title' and 'category' (plus the\n * // id field, that is always stored and returned)\n * const searchIndex = createIndex({\n * fields: ['title', 'text'],\n * storeFields: ['title', 'category']\n * })\n *\n * // Add documents to the index\n * addAll(searchIndex, documents)\n *\n * // Search for documents:\n * const results = search(searchIndex, 'zen art motorcycle')\n * // => [\n * // { id: 2, title: 'Zen and the Art of Motorcycle Maintenance', category: 'fiction', score: 2.77258 },\n * // { id: 4, title: 'Zen and the Art of Archery', category: 'non-fiction', score: 1.38629 }\n * // ]\n * ```\n */\nexport class SearchIndex<\n ID = any,\n Document = any,\n Index extends Record<string, any> = Record<never, never>,\n> {\n _options: OptionsWithDefaults<ID, Document, Index>;\n _index: SearchableMap<FieldTermData>;\n _documentCount: number;\n _documentIds: Map<number, ID>;\n _idToShortId: Map<ID, number>;\n _fieldIds: { [key: string]: number };\n _fieldLength: Map<number, number[]>;\n _avgFieldLength: number[];\n _nextId: number;\n _storedFields: Map<number, Index>;\n _dirtCount: number;\n _currentVacuum: Promise<void> | null;\n _enqueuedVacuum: Promise<void> | null;\n _enqueuedVacuumConditions: VacuumConditions | undefined;\n\n constructor(options: SearchIndexOptions<ID, Document, Index>) {\n if (options?.fields == null)\n throw new Error('SlimSearch: option \"fields\" must be provided');\n\n const autoVacuum =\n options.autoVacuum == null || options.autoVacuum === true\n ? defaultAutoVacuumOptions\n : options.autoVacuum;\n\n // @ts-ignore\n this._options = {\n ...defaultOptions,\n ...options,\n autoVacuum,\n searchOptions: {\n ...defaultSearchOptions,\n ...(options.searchOptions || {}),\n },\n autoSuggestOptions: {\n ...defaultAutoSuggestOptions,\n ...(options.autoSuggestOptions || {}),\n },\n };\n\n this._index = new SearchableMap();\n\n this._documentCount = 0;\n\n this._documentIds = new Map();\n\n this._idToShortId = new Map();\n\n // Fields are defined during initialization, don't change, are few in\n // number, rarely need iterating over, and have string keys. Therefore in\n // this case an object is a better candidate than a Map to store the mapping\n // from field key to ID.\n this._fieldIds = {};\n\n this._fieldLength = new Map();\n\n this._avgFieldLength = [];\n\n this._nextId = 0;\n\n this._storedFields = new Map();\n\n this._dirtCount = 0;\n\n this._currentVacuum = null;\n\n this._enqueuedVacuum = null;\n this._enqueuedVacuumConditions = defaultVacuumConditions;\n\n this.addFields(this._options.fields);\n }\n\n /**\n * Is `true` if a vacuuming operation is ongoing, `false` otherwise\n */\n get isVacuuming(): boolean {\n return this._currentVacuum != null;\n }\n\n /**\n * The number of documents discarded since the most recent vacuuming\n */\n get dirtCount(): number {\n return this._dirtCount;\n }\n\n /**\n * A number between 0 and 1 giving an indication about the proportion of\n * documents that are discarded, and can therefore be cleaned up by vacuuming.\n * A value close to 0 means that the index is relatively clean, while a higher\n * value means that the index is relatively dirty, and vacuuming could release\n * memory.\n */\n get dirtFactor(): number {\n return this._dirtCount / (1 + this._documentCount + this._dirtCount);\n }\n\n /**\n * Total number of documents available to search\n */\n get documentCount(): number {\n return this._documentCount;\n }\n\n /**\n * Number of terms in the index\n */\n get termCount(): number {\n return this._index.size;\n }\n\n /**\n * Allows serialization of the index to JSON, to possibly store it and later\n * deserialize it with `loadJSONIndex`.\n *\n * Normally one does not directly call this method, but rather call the\n * standard JavaScript `JSON.stringify()` passing the `SearchIndex` instance,\n * and JavaScript will internally call this method. Upon deserialization, one\n * must pass to `loadJSONIndex` the same options used to create the original\n * instance that was serialized.\n *\n * ### Usage:\n *\n * ```js\n * // Serialize the index:\n * let searchIndex = createIndex({ fields: ['title', 'text'] })\n * addAll(searchIndex, documents)\n * const json = JSON.stringify(index)\n *\n * // Later, to deserialize it:\n * searchIndex = loadJSONIndex(json, { fields: ['title', 'text'] })\n * ```\n *\n * @return A plain-object serializable representation of the search index.\n */\n toJSON(): IndexObject<Index> {\n const index: [string, { [key: string]: SerializedIndexEntry }][] = [];\n\n for (const [term, fieldIndex] of this._index) {\n const data: { [key: string]: SerializedIndexEntry } = {};\n\n for (const [fieldId, frequencies] of fieldIndex)\n data[fieldId] = Object.fromEntries(frequencies);\n\n index.push([term, data]);\n }\n\n return {\n documentCount: this._documentCount,\n nextId: this._nextId,\n documentIds: Object.fromEntries(this._documentIds),\n fieldIds: this._fieldIds,\n fieldLength: Object.fromEntries(this._fieldLength),\n averageFieldLength: this._avgFieldLength,\n storedFields: Object.fromEntries(this._storedFields),\n dirtCount: this._dirtCount,\n index,\n serializationVersion: 2,\n };\n }\n\n /**\n * @ignore\n */\n private addFields(fields: string[]): void {\n for (let i = 0; i < fields.length; i++) this._fieldIds[fields[i]] = i;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type FieldTermData, SearchIndex } from \"./SearchIndex.js\";\nimport { SearchableMap } from \"./SearchableMap/SearchableMap.js\";\nimport { type DocumentTermFrequencies } from \"./results.js\";\nimport {\n type IndexObject,\n type SearchIndexOptions,\n type SerializedIndexEntry,\n} from \"./typings.js\";\nimport { objectToNumericMap } from \"./utils.js\";\n\n/**\n * @param options Configuration options\n *\n * ### Examples:\n *\n * ```js\n * // Create a search engine that indexes the 'title' and 'text' fields of your\n * // documents:\n * const searchIndex = createIndex({ fields: ['title', 'text'] })\n * ```\n *\n * ### ID Field:\n *\n * ```js\n * // Your documents are assumed to include a unique 'id' field, but if you want\n * // to use a different field for document identification, you can set the\n * // 'idField' option:\n * const searchIndex = createIndex({ idField: 'key', fields: ['title', 'text'] })\n * ```\n *\n * ### Options and defaults:\n *\n * ```js\n * // The full set of options (here with their default value) is:\n * const searchIndex = createIndex({\n * // idField: field that uniquely identifies a document\n * idField: 'id',\n *\n * // extractField: function used to get the value of a field in a document.\n * // By default, it assumes the document is a flat object with field names as\n * // property keys and field values as string property values, but custom logic\n * // can be implemented by setting this option to a custom extractor function.\n * extractField: (document, fieldName) => document[fieldName],\n *\n * // tokenize: function used to split fields into individual terms. By\n * // default, it is also used to tokenize search queries, unless a specific\n * // `tokenize` search option is supplied. When tokenizing an indexed field,\n * // the field name is passed as the second argument.\n * tokenize: (string, _fieldName) => string.split(SPACE_OR_PUNCTUATION),\n *\n * // processTerm: function used to process each tokenized term before\n * // indexing. It can be used for stemming and normalization. Return a falsy\n * // value in order to discard a term. By default, it is also used to process\n * // search queries, unless a specific `processTerm` option is supplied as a\n * // search option. When processing a term from a indexed field, the field\n * // name is passed as the second argument.\n * processTerm: (term, _fieldName) => term.toLowerCase(),\n *\n * // searchOptions: default search options, see the `search` method for\n * // details\n * searchOptions: undefined,\n *\n * // fields: document fields to be indexed. Mandatory, but not set by default\n * fields: undefined\n *\n * // storeFields: document fields to be stored and returned as part of the\n * // search results.\n * storeFields: []\n * })\n * ```\n */\nexport const createIndex = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n options: SearchIndexOptions<ID, Document, Index>,\n): SearchIndex<ID, Document, Index> => new SearchIndex(options);\n\nexport const loadIndex = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n {\n index,\n documentCount,\n nextId,\n documentIds,\n fieldIds,\n fieldLength,\n averageFieldLength,\n storedFields,\n dirtCount,\n serializationVersion,\n }: IndexObject<Index>,\n options: SearchIndexOptions<ID, Document, Index>,\n): SearchIndex<ID, Document, Index> => {\n if (serializationVersion !== 1 && serializationVersion !== 2)\n throw new Error(\n \"SlimSearch: cannot deserialize an index created with an incompatible version\",\n );\n\n const searchIndex = new SearchIndex(options);\n\n searchIndex._documentCount = documentCount;\n searchIndex._nextId = nextId;\n searchIndex._documentIds = objectToNumericMap<ID>(documentIds);\n searchIndex._idToShortId = new Map<ID, number>();\n searchIndex._fieldIds = fieldIds;\n searchIndex._fieldLength = objectToNumericMap(fieldLength);\n searchIndex._avgFieldLength = averageFieldLength;\n searchIndex._storedFields = objectToNumericMap(storedFields);\n searchIndex._dirtCount = dirtCount || 0;\n searchIndex._index = new SearchableMap();\n\n for (const [shortId, id] of searchIndex._documentIds)\n searchIndex._idToShortId.set(id, shortId);\n\n for (const [term, data] of index) {\n const dataMap = new Map() as FieldTermData;\n\n for (const fieldId of Object.keys(data)) {\n let indexEntry = data[fieldId];\n\n // Version 1 used to nest the index entry inside a field called ds\n if (serializationVersion === 1)\n indexEntry = indexEntry.ds as unknown as SerializedIndexEntry;\n\n dataMap.set(\n parseInt(fieldId, 10),\n objectToNumericMap(indexEntry) as DocumentTermFrequencies,\n );\n }\n\n searchIndex._index.set(term, dataMap);\n }\n\n return searchIndex;\n};\n\n/**\n * Deserializes a JSON index (serialized with `JSON.stringify(index)`)\n * and instantiates a SearchIndex instance. It should be given the same options\n * originally used when serializing the index.\n *\n * ### Usage:\n *\n * ```js\n * // If the index was serialized with:\n * let index = createIndex({ fields: ['title', 'text'] })\n *\n * addAll(index, documents)\n *\n * const json = JSON.stringify(index)\n * // It can later be deserialized like this:\n * index = loadJSONIndex(json, { fields: ['title', 'text'] })\n * ```\n *\n * @param json JSON-serialized index\n * @param options configuration options, same as the constructor\n * @return An instance of SearchIndex deserialized from the given JSON.\n */\nexport const loadJSONIndex = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n json: string,\n options: SearchIndexOptions<ID, Document, Index>,\n): SearchIndex<ID, Document, Index> => {\n if (options == null)\n throw new Error(\n \"SlimSearch: loadJSON should be given the same options used when serializing the index\",\n );\n\n return loadIndex(<IndexObject<Index>>JSON.parse(json), options);\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport {\n defaultAutoVacuumOptions,\n defaultVacuumConditions,\n defaultVacuumOptions,\n} from \"./defaults.js\";\nimport { type VacuumConditions, type VacuumOptions } from \"./typings.js\";\n\nconst shouldVacuum = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n conditions?: VacuumConditions,\n): boolean => {\n if (conditions == null) return true;\n\n const {\n minDirtCount = defaultAutoVacuumOptions.minDirtCount,\n minDirtFactor = defaultAutoVacuumOptions.minDirtFactor,\n } = conditions;\n\n return (\n searchIndex.dirtCount >= minDirtCount &&\n searchIndex.dirtFactor >= minDirtFactor\n );\n};\n\nconst doVacuum = async <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n options: VacuumOptions,\n conditions?: VacuumConditions,\n): Promise<void> => {\n const initialDirtCount = searchIndex._dirtCount;\n\n if (shouldVacuum(searchIndex, conditions)) {\n const batchSize = options.batchSize || defaultVacuumOptions.batchSize;\n const batchWait = options.batchWait || defaultVacuumOptions.batchWait;\n let i = 1;\n\n for (const [term, fieldsData] of searchIndex._index) {\n for (const [fieldId, fieldIndex] of fieldsData)\n for (const [shortId] of fieldIndex) {\n if (searchIndex._documentIds.has(shortId)) continue;\n\n if (fieldIndex.size <= 1) fieldsData.delete(fieldId);\n else fieldIndex.delete(shortId);\n }\n\n if (searchIndex._index.get(term)!.size === 0)\n searchIndex._index.delete(term);\n\n if (i % batchSize === 0)\n await new Promise((resolve) => setTimeout(resolve, batchWait));\n\n i += 1;\n }\n\n searchIndex._dirtCount -= initialDirtCount;\n }\n\n // Make the next lines always async, so they execute after this function returns\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await null;\n\n searchIndex._currentVacuum = searchIndex._enqueuedVacuum;\n searchIndex._enqueuedVacuum = null;\n};\n\nconst conditionalVacuum = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n options: VacuumOptions,\n conditions?: VacuumConditions,\n): Promise<void> => {\n // If a vacuum is already ongoing, schedule another as soon as it finishes,\n // unless there's already one enqueued. If one was already enqueued, do not\n // enqueue another on top, but make sure that the conditions are the\n // broadest.\n if (searchIndex._currentVacuum) {\n searchIndex._enqueuedVacuumConditions =\n searchIndex._enqueuedVacuumConditions && conditions;\n if (searchIndex._enqueuedVacuum != null) return searchIndex._enqueuedVacuum;\n\n searchIndex._enqueuedVacuum = searchIndex._currentVacuum.then(() => {\n const conditions = searchIndex._enqueuedVacuumConditions;\n\n searchIndex._enqueuedVacuumConditions = defaultVacuumConditions;\n\n return doVacuum(searchIndex, options, conditions);\n });\n\n return searchIndex._enqueuedVacuum;\n }\n\n if (shouldVacuum(searchIndex, conditions) === false) return Promise.resolve();\n\n searchIndex._currentVacuum = doVacuum(searchIndex, options);\n\n return searchIndex._currentVacuum;\n};\n\nexport const maybeAutoVacuum = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n): void => {\n if (searchIndex._options.autoVacuum === false) return;\n\n const { minDirtFactor, minDirtCount, batchSize, batchWait } =\n searchIndex._options.autoVacuum;\n\n void conditionalVacuum(\n searchIndex,\n { batchSize, batchWait },\n { minDirtCount, minDirtFactor },\n );\n};\n\n/**\n * Triggers a manual vacuuming, cleaning up references to discarded documents\n * from the inverted index\n *\n * Vacuuming is only useful for applications that use the\n * {@link discard} or {@link replace} methods.\n *\n * By default, vacuuming is performed automatically when needed (controlled by\n * the `autoVacuum` field in {@link SearchOptions}), so there is usually no need to call\n * this method, unless one wants to make sure to perform vacuuming at a\n * specific moment.\n *\n * Vacuuming traverses all terms in the inverted index in batches, and cleans\n * up references to discarded documents from the posting list, allowing memory\n * to be released.\n *\n * The method takes an optional object as argument with the following keys:\n *\n * - `batchSize`: the size of each batch (1000 by default)\n *\n * - `batchWait`: the number of milliseconds to wait between batches (10 by\n * default)\n *\n * On large indexes, vacuuming could have a non-negligible cost: batching\n * avoids blocking the thread for long, diluting this cost so that it is not\n * negatively affecting the application. Nonetheless, this method should only\n * be called when necessary, and relying on automatic vacuuming is usually\n * better.\n *\n * It returns a promise that resolves (to undefined) when the clean up is\n * completed. If vacuuming is already ongoing at the time this method is\n * called, a new one is enqueued immediately after the ongoing one, and a\n * corresponding promise is returned. However, no more than one vacuuming is\n * enqueued on top of the ongoing one, even if this method is called more\n * times (enqueuing multiple ones would be useless).\n *\n * @param searchIndex Search Index\n * @param options Configuration options for the batch size and delay. See\n * {@link VacuumOptions}.\n */\nexport const vacuum = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n options: VacuumOptions = {},\n): Promise<void> => conditionalVacuum(searchIndex, options);\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { SearchableMap } from \"./SearchableMap/SearchableMap.js\";\nimport { removeTerm } from \"./term.js\";\nimport { maybeAutoVacuum } from \"./vacuum.js\";\n\nconst removeFieldLength = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n fieldId: number,\n count: number,\n length: number,\n): void => {\n if (count === 1) {\n searchIndex._avgFieldLength[fieldId] = 0;\n\n return;\n }\n\n const totalFieldLength =\n searchIndex._avgFieldLength[fieldId] * count - length;\n\n searchIndex._avgFieldLength[fieldId] = totalFieldLength / (count - 1);\n};\n\n/**\n * Discards the document with the given ID, so it won't appear in search results\n *\n * It has the same visible effect of {@link remove} (both cause the\n * document to stop appearing in searches), but a different effect on the\n * internal data structures:\n *\n * - {@link remove} requires passing the full document to be removed\n * as argument, and removes it from the inverted index immediately.\n *\n * - {@link discard} instead only needs the document ID, and works by\n * marking the current version of the document as discarded, so it is\n * immediately ignored by searches. This is faster and more convenient than\n * `remove`, but the index is not immediately modified. To take care of\n * that, vacuuming is performed after a certain number of documents are\n * discarded, cleaning up the index and allowing memory to be released.\n *\n * After discarding a document, it is possible to re-add a new version, and\n * only the new version will appear in searches. In other words, discarding\n * and re-adding a document works exactly like removing and re-adding it. The\n * {@link replace} method can also be used to replace a document with a\n * new version.\n *\n * #### Details about vacuuming\n *\n * Repetitive calls to this method would leave obsolete document references in\n * the index, invisible to searches. Two mechanisms take care of cleaning up:\n * clean up during search, and vacuuming.\n *\n * - Upon search, whenever a discarded ID is found (and ignored for the\n * results), references to the discarded document are removed from the\n * inverted index entries for the search terms. This ensures that subsequent\n * searches for the same terms do not need to skip these obsolete references\n * again.\n *\n * - In addition, vacuuming is performed automatically by default (see the\n * `autoVacuum` field in {@link SearchOptions}) after a certain number of documents\n * are discarded. Vacuuming traverses all terms in the index, cleaning up\n * all references to discarded documents. Vacuuming can also be triggered\n * manually by calling {@link vacuum}.\n *\n * @param searchIndex The search Index\n * @param id The ID of the document to be discarded\n */\nexport const discard = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n id: ID,\n): void => {\n const shortId = searchIndex._idToShortId.get(id);\n\n if (shortId == null)\n throw new Error(\n `SlimSearch: cannot discard document with ID ${<string>(\n id\n )}: it is not in the index`,\n );\n\n searchIndex._idToShortId.delete(id);\n searchIndex._documentIds.delete(shortId);\n searchIndex._storedFields.delete(shortId);\n (searchIndex._fieldLength.get(shortId) || []).forEach(\n (fieldLength, fieldId) => {\n removeFieldLength(\n searchIndex,\n fieldId,\n searchIndex._documentCount,\n fieldLength,\n );\n },\n );\n\n searchIndex._fieldLength.delete(shortId);\n\n searchIndex._documentCount -= 1;\n searchIndex._dirtCount += 1;\n\n maybeAutoVacuum(searchIndex);\n};\n\n/**\n * Discards the documents with the given IDs, so they won't appear in search\n * results\n *\n * It is equivalent to calling {@link discard} for all the given IDs,\n * but with the optimization of triggering at most one automatic vacuuming at\n * the end.\n *\n * Note: to remove all documents from the index, it is faster and more\n * convenient to call {@link removeAll} with no argument, instead of\n * passing all IDs to this method.\n */\nexport const discardAll = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n ids: readonly ID[],\n): void => {\n const autoVacuum = searchIndex._options.autoVacuum;\n\n try {\n searchIndex._options.autoVacuum = false;\n\n for (const id of ids) discard(searchIndex, id);\n } finally {\n searchIndex._options.autoVacuum = autoVacuum;\n }\n\n maybeAutoVacuum(searchIndex);\n};\n\n/**\n * Removes the given document from the index.\n *\n * The document to remove must NOT have changed between indexing and removal,\n * otherwise the index will be corrupted.\n *\n * This method requires passing the full document to be removed (not just the\n * ID), and immediately removes the document from the inverted index, allowing\n * memory to be released. A convenient alternative is {@link discard},\n * which needs only the document ID, and has the same visible effect, but\n * delays cleaning up the index until the next vacuuming.\n *\n * @param searchIndex The search Index\n * @param document The document to be removed\n */\nexport const remove = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n document: Document,\n): void => {\n const { tokenize, processTerm, extractField, fields, idField } =\n searchIndex._options;\n const id = <ID>extractField(document, idField);\n\n if (id == null)\n throw new Error(`SlimSearch: document does not have ID field \"${idField}\"`);\n\n const shortId = searchIndex._idToShortId.get(id);\n\n if (shortId == null)\n throw new Error(\n `SlimSearch: cannot remove document with ID ${<string>(\n id\n )}: it is not in the index`,\n );\n\n for (const field of fields) {\n const fieldValue = extractField(document, field);\n\n if (fieldValue == null) continue;\n\n const tokens = tokenize(fieldValue.toString(), field);\n const fieldId = searchIndex._fieldIds[field];\n\n const uniqueTerms = new Set(tokens).size;\n\n removeFieldLength(\n searchIndex,\n fieldId,\n searchIndex._documentCount,\n uniqueTerms,\n );\n\n for (const term of tokens) {\n const processedTerm = processTerm(term, field);\n\n if (Array.isArray(processedTerm))\n for (const t of processedTerm)\n removeTerm(searchIndex, fieldId, shortId, t);\n else if (processedTerm)\n removeTerm(searchIndex, fieldId, shortId, processedTerm);\n }\n }\n\n searchIndex._storedFields.delete(shortId);\n searchIndex._documentIds.delete(shortId);\n searchIndex._idToShortId.delete(id);\n searchIndex._fieldLength.delete(shortId);\n searchIndex._documentCount -= 1;\n};\n\n/**\n * Removes all the given documents from the index. If called with no arguments,\n * it removes _all_ documents from the index.\n *\n * @param searchIndex The search Index\n * @param documents The documents to be removed. If this argument is omitted,\n * all documents are removed. Note that, for removing all documents, it is\n * more efficient to call this method with no arguments than to pass all\n * documents.\n */\nexport const removeAll = function removeAll<\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n documents?: readonly Document[],\n): void {\n if (documents) {\n for (const document of documents) remove(searchIndex, document);\n } else if (arguments.length > 1) {\n throw new Error(\n \"Expected documents to be present. Omit the argument to remove all documents.\",\n );\n } else {\n searchIndex._index = new SearchableMap();\n searchIndex._documentCount = 0;\n searchIndex._documentIds = new Map();\n searchIndex._idToShortId = new Map();\n searchIndex._fieldLength = new Map();\n searchIndex._avgFieldLength = [];\n searchIndex._storedFields = new Map();\n searchIndex._nextId = 0;\n }\n};\n", "import { type SearchIndex } from \"./SearchIndex.js\";\nimport { add } from \"./add.js\";\nimport { discard } from \"./remove.js\";\n\n/**\n * It replaces an existing document with the given updated version\n *\n * It works by discarding the current version and adding the updated one, so\n * it is functionally equivalent to calling {@link discard} followed by\n * {@link add}. The ID of the updated document should be the same as\n * the original one.\n *\n * Since it uses {@link discard} internally, this method relies on\n * vacuuming to clean up obsolete document references from the index, allowing\n * memory to be released (see {@link discard}).\n *\n * @param searchIndex The search Index\n * @param updatedDocument The updated document to replace the old version\n * with\n */\nexport const replace = <\n ID,\n Document,\n Index extends Record<string, any> = Record<never, never>,\n>(\n searchIndex: SearchIndex<ID, Document, Index>,\n updatedDocument: Document,\n): void => {\n const { idField, extractField } = searchIndex._options;\n const id = <ID>extractField(updatedDocument, idField);\n\n discard(searchIndex, id);\n add(searchIndex, updatedDocument);\n};\n"], + "mappings": "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", + "names": ["ENTRIES", "KEYS", "VALUES", "LEAF", "TreeIterator", "set", "type", "node", "keys", "value", "last", "child", "key", "array", "fuzzySearch", "query", "maxDistance", "results", "n", "m", "matrix", "j", "i", "recurse", "prefix", "offset", "distance", "pos", "char", "thisRowOffset", "prevRowOffset", "minDistance", "jmin", "jmax", "different", "rpl", "del", "ins", "dist", "SearchableMap", "tree", "path", "trackDown", "parentNode", "k", "remove", "fn", "maxEditDistance", "lookup", "createPath", "iter", "initial", "entries", "object", "treeKey", "keyLength", "outer", "len", "intermediate", "cleanup", "merge", "nodeKey", "has", "searchIndex", "id", "getStoredFields", "shortId", "SPACE_OR_PUNCTUATION", "OR", "AND", "AND_NOT", "assignUniqueTerm", "target", "term", "assignUniqueTerms", "source", "byScore", "a", "b", "createMap", "objectToNumericMap", "map", "getOwnProperty", "property", "combinators", "docId", "existing", "score", "terms", "match", "combined", "calcBM25Score", "termFreq", "matchingCount", "totalCount", "fieldLength", "avgFieldLength", "bm25params", "d", "termToQuerySpec", "options", "fuzzy", "warnDocumentChanged", "shortDocumentId", "fieldId", "fieldName", "addTerm", "documentId", "indexData", "fieldIndex", "docs", "removeTerm", "addFieldLength", "count", "length", "fieldLengths", "totalFieldLength", "addDocumentId", "saveStoredFields", "doc", "storeFields", "extractField", "documentFields", "fieldValue", "add", "document", "tokenize", "processTerm", "fields", "idField", "field", "tokens", "uniqueTerms", "processedTerm", "t", "addAll", "documents", "addAllAsync", "chunkSize", "acc", "chunk", "promise", "index", "resolve", "defaultBM25params", "defaultOptions", "text", "level", "message", "defaultSearchOptions", "defaultAutoSuggestOptions", "_term", "defaultVacuumOptions", "defaultVacuumConditions", "defaultAutoVacuumOptions", "getDefaultValue", "optionName", "WILDCARD", "executeWildcardQuery", "searchOptions", "combineResults", "combineWith", "operator", "combinator", "termResults", "sourceTerm", "derivedTerm", "termWeight", "fieldTermData", "fieldBoosts", "boostDocumentFn", "fieldBoost", "fieldTermFrequencies", "matchingFields", "docBoost", "rawScore", "weightedScore", "result", "executeQuerySpec", "boosts", "boostDocument", "weights", "maxFuzzy", "fuzzyWeight", "prefixWeight", "data", "prefixMatches", "fuzzyMatches", "weight", "executeQuery", "subQuery", "globalSearchOptions", "searchTokenize", "searchProcessTerm", "search", "rawResults", "quality", "autoSuggest", "queryString", "suggestions", "phrase", "suggestion", "SearchIndex", "autoVacuum", "frequencies", "createIndex", "loadIndex", "documentCount", "nextId", "documentIds", "fieldIds", "averageFieldLength", "storedFields", "dirtCount", "serializationVersion", "dataMap", "indexEntry", "loadJSONIndex", "json", "shouldVacuum", "conditions", "minDirtCount", "minDirtFactor", "doVacuum", "initialDirtCount", "batchSize", "batchWait", "fieldsData", "conditionalVacuum", "maybeAutoVacuum", "vacuum", "removeFieldLength", "discard", "discardAll", "ids", "removeAll", "replace", "updatedDocument"] +} diff --git a/src/.vuepress/.cache/deps/vue-router.js b/src/.vuepress/.cache/deps/vue-router.js new file mode 100644 index 000000000..e0adcd18f --- /dev/null +++ b/src/.vuepress/.cache/deps/vue-router.js @@ -0,0 +1,2745 @@ +import { + setupDevtoolsPlugin +} from "./chunk-UKCZNIRO.js"; +import { + computed, + defineComponent, + getCurrentInstance, + h, + inject, + nextTick, + onActivated, + onDeactivated, + onUnmounted, + provide, + reactive, + ref, + shallowReactive, + shallowRef, + unref, + watch, + watchEffect +} from "./chunk-PAUCAATC.js"; +import "./chunk-V6TY7KAL.js"; + +// node_modules/vue-router/dist/vue-router.mjs +var isBrowser = typeof document !== "undefined"; +function isESModule(obj) { + return obj.__esModule || obj[Symbol.toStringTag] === "Module"; +} +var assign = Object.assign; +function applyToParams(fn, params) { + const newParams = {}; + for (const key in params) { + const value = params[key]; + newParams[key] = isArray(value) ? value.map(fn) : fn(value); + } + return newParams; +} +var noop = () => { +}; +var isArray = Array.isArray; +function warn(msg) { + const args = Array.from(arguments).slice(1); + console.warn.apply(console, ["[Vue Router warn]: " + msg].concat(args)); +} +var HASH_RE = /#/g; +var AMPERSAND_RE = /&/g; +var SLASH_RE = /\//g; +var EQUAL_RE = /=/g; +var IM_RE = /\?/g; +var PLUS_RE = /\+/g; +var ENC_BRACKET_OPEN_RE = /%5B/g; +var ENC_BRACKET_CLOSE_RE = /%5D/g; +var ENC_CARET_RE = /%5E/g; +var ENC_BACKTICK_RE = /%60/g; +var ENC_CURLY_OPEN_RE = /%7B/g; +var ENC_PIPE_RE = /%7C/g; +var ENC_CURLY_CLOSE_RE = /%7D/g; +var ENC_SPACE_RE = /%20/g; +function commonEncode(text) { + return encodeURI("" + text).replace(ENC_PIPE_RE, "|").replace(ENC_BRACKET_OPEN_RE, "[").replace(ENC_BRACKET_CLOSE_RE, "]"); +} +function encodeHash(text) { + return commonEncode(text).replace(ENC_CURLY_OPEN_RE, "{").replace(ENC_CURLY_CLOSE_RE, "}").replace(ENC_CARET_RE, "^"); +} +function encodeQueryValue(text) { + return commonEncode(text).replace(PLUS_RE, "%2B").replace(ENC_SPACE_RE, "+").replace(HASH_RE, "%23").replace(AMPERSAND_RE, "%26").replace(ENC_BACKTICK_RE, "`").replace(ENC_CURLY_OPEN_RE, "{").replace(ENC_CURLY_CLOSE_RE, "}").replace(ENC_CARET_RE, "^"); +} +function encodeQueryKey(text) { + return encodeQueryValue(text).replace(EQUAL_RE, "%3D"); +} +function encodePath(text) { + return commonEncode(text).replace(HASH_RE, "%23").replace(IM_RE, "%3F"); +} +function encodeParam(text) { + return text == null ? "" : encodePath(text).replace(SLASH_RE, "%2F"); +} +function decode(text) { + try { + return decodeURIComponent("" + text); + } catch (err) { + warn(`Error decoding "${text}". Using original value`); + } + return "" + text; +} +var TRAILING_SLASH_RE = /\/$/; +var removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, ""); +function parseURL(parseQuery2, location2, currentLocation = "/") { + let path, query = {}, searchString = "", hash = ""; + const hashPos = location2.indexOf("#"); + let searchPos = location2.indexOf("?"); + if (hashPos < searchPos && hashPos >= 0) { + searchPos = -1; + } + if (searchPos > -1) { + path = location2.slice(0, searchPos); + searchString = location2.slice(searchPos + 1, hashPos > -1 ? hashPos : location2.length); + query = parseQuery2(searchString); + } + if (hashPos > -1) { + path = path || location2.slice(0, hashPos); + hash = location2.slice(hashPos, location2.length); + } + path = resolveRelativePath(path != null ? path : location2, currentLocation); + return { + fullPath: path + (searchString && "?") + searchString + hash, + path, + query, + hash: decode(hash) + }; +} +function stringifyURL(stringifyQuery2, location2) { + const query = location2.query ? stringifyQuery2(location2.query) : ""; + return location2.path + (query && "?") + query + (location2.hash || ""); +} +function stripBase(pathname, base) { + if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase())) + return pathname; + return pathname.slice(base.length) || "/"; +} +function isSameRouteLocation(stringifyQuery2, a, b) { + const aLastIndex = a.matched.length - 1; + const bLastIndex = b.matched.length - 1; + return aLastIndex > -1 && aLastIndex === bLastIndex && isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) && isSameRouteLocationParams(a.params, b.params) && stringifyQuery2(a.query) === stringifyQuery2(b.query) && a.hash === b.hash; +} +function isSameRouteRecord(a, b) { + return (a.aliasOf || a) === (b.aliasOf || b); +} +function isSameRouteLocationParams(a, b) { + if (Object.keys(a).length !== Object.keys(b).length) + return false; + for (const key in a) { + if (!isSameRouteLocationParamsValue(a[key], b[key])) + return false; + } + return true; +} +function isSameRouteLocationParamsValue(a, b) { + return isArray(a) ? isEquivalentArray(a, b) : isArray(b) ? isEquivalentArray(b, a) : a === b; +} +function isEquivalentArray(a, b) { + return isArray(b) ? a.length === b.length && a.every((value, i) => value === b[i]) : a.length === 1 && a[0] === b; +} +function resolveRelativePath(to, from) { + if (to.startsWith("/")) + return to; + if (!from.startsWith("/")) { + warn(`Cannot resolve a relative location without an absolute path. Trying to resolve "${to}" from "${from}". It should look like "/${from}".`); + return to; + } + if (!to) + return from; + const fromSegments = from.split("/"); + const toSegments = to.split("/"); + const lastToSegment = toSegments[toSegments.length - 1]; + if (lastToSegment === ".." || lastToSegment === ".") { + toSegments.push(""); + } + let position = fromSegments.length - 1; + let toPosition; + let segment; + for (toPosition = 0; toPosition < toSegments.length; toPosition++) { + segment = toSegments[toPosition]; + if (segment === ".") + continue; + if (segment === "..") { + if (position > 1) + position--; + } else + break; + } + return fromSegments.slice(0, position).join("/") + "/" + toSegments.slice(toPosition).join("/"); +} +var START_LOCATION_NORMALIZED = { + path: "/", + // TODO: could we use a symbol in the future? + name: void 0, + params: {}, + query: {}, + hash: "", + fullPath: "/", + matched: [], + meta: {}, + redirectedFrom: void 0 +}; +var NavigationType; +(function(NavigationType2) { + NavigationType2["pop"] = "pop"; + NavigationType2["push"] = "push"; +})(NavigationType || (NavigationType = {})); +var NavigationDirection; +(function(NavigationDirection2) { + NavigationDirection2["back"] = "back"; + NavigationDirection2["forward"] = "forward"; + NavigationDirection2["unknown"] = ""; +})(NavigationDirection || (NavigationDirection = {})); +var START = ""; +function normalizeBase(base) { + if (!base) { + if (isBrowser) { + const baseEl = document.querySelector("base"); + base = baseEl && baseEl.getAttribute("href") || "/"; + base = base.replace(/^\w+:\/\/[^\/]+/, ""); + } else { + base = "/"; + } + } + if (base[0] !== "/" && base[0] !== "#") + base = "/" + base; + return removeTrailingSlash(base); +} +var BEFORE_HASH_RE = /^[^#]+#/; +function createHref(base, location2) { + return base.replace(BEFORE_HASH_RE, "#") + location2; +} +function getElementPosition(el, offset) { + const docRect = document.documentElement.getBoundingClientRect(); + const elRect = el.getBoundingClientRect(); + return { + behavior: offset.behavior, + left: elRect.left - docRect.left - (offset.left || 0), + top: elRect.top - docRect.top - (offset.top || 0) + }; +} +var computeScrollPosition = () => ({ + left: window.scrollX, + top: window.scrollY +}); +function scrollToPosition(position) { + let scrollToOptions; + if ("el" in position) { + const positionEl = position.el; + const isIdSelector = typeof positionEl === "string" && positionEl.startsWith("#"); + if (typeof position.el === "string") { + if (!isIdSelector || !document.getElementById(position.el.slice(1))) { + try { + const foundEl = document.querySelector(position.el); + if (isIdSelector && foundEl) { + warn(`The selector "${position.el}" should be passed as "el: document.querySelector('${position.el}')" because it starts with "#".`); + return; + } + } catch (err) { + warn(`The selector "${position.el}" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`); + return; + } + } + } + const el = typeof positionEl === "string" ? isIdSelector ? document.getElementById(positionEl.slice(1)) : document.querySelector(positionEl) : positionEl; + if (!el) { + warn(`Couldn't find element using selector "${position.el}" returned by scrollBehavior.`); + return; + } + scrollToOptions = getElementPosition(el, position); + } else { + scrollToOptions = position; + } + if ("scrollBehavior" in document.documentElement.style) + window.scrollTo(scrollToOptions); + else { + window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.scrollX, scrollToOptions.top != null ? scrollToOptions.top : window.scrollY); + } +} +function getScrollKey(path, delta) { + const position = history.state ? history.state.position - delta : -1; + return position + path; +} +var scrollPositions = /* @__PURE__ */ new Map(); +function saveScrollPosition(key, scrollPosition) { + scrollPositions.set(key, scrollPosition); +} +function getSavedScrollPosition(key) { + const scroll = scrollPositions.get(key); + scrollPositions.delete(key); + return scroll; +} +var createBaseLocation = () => location.protocol + "//" + location.host; +function createCurrentLocation(base, location2) { + const { pathname, search, hash } = location2; + const hashPos = base.indexOf("#"); + if (hashPos > -1) { + let slicePos = hash.includes(base.slice(hashPos)) ? base.slice(hashPos).length : 1; + let pathFromHash = hash.slice(slicePos); + if (pathFromHash[0] !== "/") + pathFromHash = "/" + pathFromHash; + return stripBase(pathFromHash, ""); + } + const path = stripBase(pathname, base); + return path + search + hash; +} +function useHistoryListeners(base, historyState, currentLocation, replace) { + let listeners = []; + let teardowns = []; + let pauseState = null; + const popStateHandler = ({ state }) => { + const to = createCurrentLocation(base, location); + const from = currentLocation.value; + const fromState = historyState.value; + let delta = 0; + if (state) { + currentLocation.value = to; + historyState.value = state; + if (pauseState && pauseState === from) { + pauseState = null; + return; + } + delta = fromState ? state.position - fromState.position : 0; + } else { + replace(to); + } + listeners.forEach((listener) => { + listener(currentLocation.value, from, { + delta, + type: NavigationType.pop, + direction: delta ? delta > 0 ? NavigationDirection.forward : NavigationDirection.back : NavigationDirection.unknown + }); + }); + }; + function pauseListeners() { + pauseState = currentLocation.value; + } + function listen(callback) { + listeners.push(callback); + const teardown = () => { + const index = listeners.indexOf(callback); + if (index > -1) + listeners.splice(index, 1); + }; + teardowns.push(teardown); + return teardown; + } + function beforeUnloadListener() { + const { history: history2 } = window; + if (!history2.state) + return; + history2.replaceState(assign({}, history2.state, { scroll: computeScrollPosition() }), ""); + } + function destroy() { + for (const teardown of teardowns) + teardown(); + teardowns = []; + window.removeEventListener("popstate", popStateHandler); + window.removeEventListener("beforeunload", beforeUnloadListener); + } + window.addEventListener("popstate", popStateHandler); + window.addEventListener("beforeunload", beforeUnloadListener, { + passive: true + }); + return { + pauseListeners, + listen, + destroy + }; +} +function buildState(back, current, forward, replaced = false, computeScroll = false) { + return { + back, + current, + forward, + replaced, + position: window.history.length, + scroll: computeScroll ? computeScrollPosition() : null + }; +} +function useHistoryStateNavigation(base) { + const { history: history2, location: location2 } = window; + const currentLocation = { + value: createCurrentLocation(base, location2) + }; + const historyState = { value: history2.state }; + if (!historyState.value) { + changeLocation(currentLocation.value, { + back: null, + current: currentLocation.value, + forward: null, + // the length is off by one, we need to decrease it + position: history2.length - 1, + replaced: true, + // don't add a scroll as the user may have an anchor, and we want + // scrollBehavior to be triggered without a saved position + scroll: null + }, true); + } + function changeLocation(to, state, replace2) { + const hashIndex = base.indexOf("#"); + const url = hashIndex > -1 ? (location2.host && document.querySelector("base") ? base : base.slice(hashIndex)) + to : createBaseLocation() + base + to; + try { + history2[replace2 ? "replaceState" : "pushState"](state, "", url); + historyState.value = state; + } catch (err) { + if (true) { + warn("Error with push/replace State", err); + } else { + console.error(err); + } + location2[replace2 ? "replace" : "assign"](url); + } + } + function replace(to, data) { + const state = assign({}, history2.state, buildState( + historyState.value.back, + // keep back and forward entries but override current position + to, + historyState.value.forward, + true + ), data, { position: historyState.value.position }); + changeLocation(to, state, true); + currentLocation.value = to; + } + function push(to, data) { + const currentState = assign( + {}, + // use current history state to gracefully handle a wrong call to + // history.replaceState + // https://github.com/vuejs/router/issues/366 + historyState.value, + history2.state, + { + forward: to, + scroll: computeScrollPosition() + } + ); + if (!history2.state) { + warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState: + +history.replaceState(history.state, '', url) + +You can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state`); + } + changeLocation(currentState.current, currentState, true); + const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data); + changeLocation(to, state, false); + currentLocation.value = to; + } + return { + location: currentLocation, + state: historyState, + push, + replace + }; +} +function createWebHistory(base) { + base = normalizeBase(base); + const historyNavigation = useHistoryStateNavigation(base); + const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace); + function go(delta, triggerListeners = true) { + if (!triggerListeners) + historyListeners.pauseListeners(); + history.go(delta); + } + const routerHistory = assign({ + // it's overridden right after + location: "", + base, + go, + createHref: createHref.bind(null, base) + }, historyNavigation, historyListeners); + Object.defineProperty(routerHistory, "location", { + enumerable: true, + get: () => historyNavigation.location.value + }); + Object.defineProperty(routerHistory, "state", { + enumerable: true, + get: () => historyNavigation.state.value + }); + return routerHistory; +} +function createMemoryHistory(base = "") { + let listeners = []; + let queue = [START]; + let position = 0; + base = normalizeBase(base); + function setLocation(location2) { + position++; + if (position !== queue.length) { + queue.splice(position); + } + queue.push(location2); + } + function triggerListeners(to, from, { direction, delta }) { + const info = { + direction, + delta, + type: NavigationType.pop + }; + for (const callback of listeners) { + callback(to, from, info); + } + } + const routerHistory = { + // rewritten by Object.defineProperty + location: START, + // TODO: should be kept in queue + state: {}, + base, + createHref: createHref.bind(null, base), + replace(to) { + queue.splice(position--, 1); + setLocation(to); + }, + push(to, data) { + setLocation(to); + }, + listen(callback) { + listeners.push(callback); + return () => { + const index = listeners.indexOf(callback); + if (index > -1) + listeners.splice(index, 1); + }; + }, + destroy() { + listeners = []; + queue = [START]; + position = 0; + }, + go(delta, shouldTrigger = true) { + const from = this.location; + const direction = ( + // we are considering delta === 0 going forward, but in abstract mode + // using 0 for the delta doesn't make sense like it does in html5 where + // it reloads the page + delta < 0 ? NavigationDirection.back : NavigationDirection.forward + ); + position = Math.max(0, Math.min(position + delta, queue.length - 1)); + if (shouldTrigger) { + triggerListeners(this.location, from, { + direction, + delta + }); + } + } + }; + Object.defineProperty(routerHistory, "location", { + enumerable: true, + get: () => queue[position] + }); + return routerHistory; +} +function createWebHashHistory(base) { + base = location.host ? base || location.pathname + location.search : ""; + if (!base.includes("#")) + base += "#"; + if (!base.endsWith("#/") && !base.endsWith("#")) { + warn(`A hash base must end with a "#": +"${base}" should be "${base.replace(/#.*$/, "#")}".`); + } + return createWebHistory(base); +} +function isRouteLocation(route) { + return typeof route === "string" || route && typeof route === "object"; +} +function isRouteName(name) { + return typeof name === "string" || typeof name === "symbol"; +} +var NavigationFailureSymbol = Symbol(true ? "navigation failure" : ""); +var NavigationFailureType; +(function(NavigationFailureType2) { + NavigationFailureType2[NavigationFailureType2["aborted"] = 4] = "aborted"; + NavigationFailureType2[NavigationFailureType2["cancelled"] = 8] = "cancelled"; + NavigationFailureType2[NavigationFailureType2["duplicated"] = 16] = "duplicated"; +})(NavigationFailureType || (NavigationFailureType = {})); +var ErrorTypeMessages = { + [ + 1 + /* ErrorTypes.MATCHER_NOT_FOUND */ + ]({ location: location2, currentLocation }) { + return `No match for + ${JSON.stringify(location2)}${currentLocation ? "\nwhile being at\n" + JSON.stringify(currentLocation) : ""}`; + }, + [ + 2 + /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */ + ]({ from, to }) { + return `Redirected from "${from.fullPath}" to "${stringifyRoute(to)}" via a navigation guard.`; + }, + [ + 4 + /* ErrorTypes.NAVIGATION_ABORTED */ + ]({ from, to }) { + return `Navigation aborted from "${from.fullPath}" to "${to.fullPath}" via a navigation guard.`; + }, + [ + 8 + /* ErrorTypes.NAVIGATION_CANCELLED */ + ]({ from, to }) { + return `Navigation cancelled from "${from.fullPath}" to "${to.fullPath}" with a new navigation.`; + }, + [ + 16 + /* ErrorTypes.NAVIGATION_DUPLICATED */ + ]({ from, to }) { + return `Avoided redundant navigation to current location: "${from.fullPath}".`; + } +}; +function createRouterError(type, params) { + if (true) { + return assign(new Error(ErrorTypeMessages[type](params)), { + type, + [NavigationFailureSymbol]: true + }, params); + } else { + return assign(new Error(), { + type, + [NavigationFailureSymbol]: true + }, params); + } +} +function isNavigationFailure(error, type) { + return error instanceof Error && NavigationFailureSymbol in error && (type == null || !!(error.type & type)); +} +var propertiesToLog = ["params", "query", "hash"]; +function stringifyRoute(to) { + if (typeof to === "string") + return to; + if (to.path != null) + return to.path; + const location2 = {}; + for (const key of propertiesToLog) { + if (key in to) + location2[key] = to[key]; + } + return JSON.stringify(location2, null, 2); +} +var BASE_PARAM_PATTERN = "[^/]+?"; +var BASE_PATH_PARSER_OPTIONS = { + sensitive: false, + strict: false, + start: true, + end: true +}; +var REGEX_CHARS_RE = /[.+*?^${}()[\]/\\]/g; +function tokensToParser(segments, extraOptions) { + const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions); + const score = []; + let pattern = options.start ? "^" : ""; + const keys = []; + for (const segment of segments) { + const segmentScores = segment.length ? [] : [ + 90 + /* PathScore.Root */ + ]; + if (options.strict && !segment.length) + pattern += "/"; + for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) { + const token = segment[tokenIndex]; + let subSegmentScore = 40 + (options.sensitive ? 0.25 : 0); + if (token.type === 0) { + if (!tokenIndex) + pattern += "/"; + pattern += token.value.replace(REGEX_CHARS_RE, "\\$&"); + subSegmentScore += 40; + } else if (token.type === 1) { + const { value, repeatable, optional, regexp } = token; + keys.push({ + name: value, + repeatable, + optional + }); + const re2 = regexp ? regexp : BASE_PARAM_PATTERN; + if (re2 !== BASE_PARAM_PATTERN) { + subSegmentScore += 10; + try { + new RegExp(`(${re2})`); + } catch (err) { + throw new Error(`Invalid custom RegExp for param "${value}" (${re2}): ` + err.message); + } + } + let subPattern = repeatable ? `((?:${re2})(?:/(?:${re2}))*)` : `(${re2})`; + if (!tokenIndex) + subPattern = // avoid an optional / if there are more segments e.g. /:p?-static + // or /:p?-:p2 + optional && segment.length < 2 ? `(?:/${subPattern})` : "/" + subPattern; + if (optional) + subPattern += "?"; + pattern += subPattern; + subSegmentScore += 20; + if (optional) + subSegmentScore += -8; + if (repeatable) + subSegmentScore += -20; + if (re2 === ".*") + subSegmentScore += -50; + } + segmentScores.push(subSegmentScore); + } + score.push(segmentScores); + } + if (options.strict && options.end) { + const i = score.length - 1; + score[i][score[i].length - 1] += 0.7000000000000001; + } + if (!options.strict) + pattern += "/?"; + if (options.end) + pattern += "$"; + else if (options.strict) + pattern += "(?:/|$)"; + const re = new RegExp(pattern, options.sensitive ? "" : "i"); + function parse(path) { + const match = path.match(re); + const params = {}; + if (!match) + return null; + for (let i = 1; i < match.length; i++) { + const value = match[i] || ""; + const key = keys[i - 1]; + params[key.name] = value && key.repeatable ? value.split("/") : value; + } + return params; + } + function stringify(params) { + let path = ""; + let avoidDuplicatedSlash = false; + for (const segment of segments) { + if (!avoidDuplicatedSlash || !path.endsWith("/")) + path += "/"; + avoidDuplicatedSlash = false; + for (const token of segment) { + if (token.type === 0) { + path += token.value; + } else if (token.type === 1) { + const { value, repeatable, optional } = token; + const param = value in params ? params[value] : ""; + if (isArray(param) && !repeatable) { + throw new Error(`Provided param "${value}" is an array but it is not repeatable (* or + modifiers)`); + } + const text = isArray(param) ? param.join("/") : param; + if (!text) { + if (optional) { + if (segment.length < 2) { + if (path.endsWith("/")) + path = path.slice(0, -1); + else + avoidDuplicatedSlash = true; + } + } else + throw new Error(`Missing required param "${value}"`); + } + path += text; + } + } + } + return path || "/"; + } + return { + re, + score, + keys, + parse, + stringify + }; +} +function compareScoreArray(a, b) { + let i = 0; + while (i < a.length && i < b.length) { + const diff = b[i] - a[i]; + if (diff) + return diff; + i++; + } + if (a.length < b.length) { + return a.length === 1 && a[0] === 40 + 40 ? -1 : 1; + } else if (a.length > b.length) { + return b.length === 1 && b[0] === 40 + 40 ? 1 : -1; + } + return 0; +} +function comparePathParserScore(a, b) { + let i = 0; + const aScore = a.score; + const bScore = b.score; + while (i < aScore.length && i < bScore.length) { + const comp = compareScoreArray(aScore[i], bScore[i]); + if (comp) + return comp; + i++; + } + if (Math.abs(bScore.length - aScore.length) === 1) { + if (isLastScoreNegative(aScore)) + return 1; + if (isLastScoreNegative(bScore)) + return -1; + } + return bScore.length - aScore.length; +} +function isLastScoreNegative(score) { + const last = score[score.length - 1]; + return score.length > 0 && last[last.length - 1] < 0; +} +var ROOT_TOKEN = { + type: 0, + value: "" +}; +var VALID_PARAM_RE = /[a-zA-Z0-9_]/; +function tokenizePath(path) { + if (!path) + return [[]]; + if (path === "/") + return [[ROOT_TOKEN]]; + if (!path.startsWith("/")) { + throw new Error(true ? `Route paths should start with a "/": "${path}" should be "/${path}".` : `Invalid path "${path}"`); + } + function crash(message) { + throw new Error(`ERR (${state})/"${buffer}": ${message}`); + } + let state = 0; + let previousState = state; + const tokens = []; + let segment; + function finalizeSegment() { + if (segment) + tokens.push(segment); + segment = []; + } + let i = 0; + let char; + let buffer = ""; + let customRe = ""; + function consumeBuffer() { + if (!buffer) + return; + if (state === 0) { + segment.push({ + type: 0, + value: buffer + }); + } else if (state === 1 || state === 2 || state === 3) { + if (segment.length > 1 && (char === "*" || char === "+")) + crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`); + segment.push({ + type: 1, + value: buffer, + regexp: customRe, + repeatable: char === "*" || char === "+", + optional: char === "*" || char === "?" + }); + } else { + crash("Invalid state to consume buffer"); + } + buffer = ""; + } + function addCharToBuffer() { + buffer += char; + } + while (i < path.length) { + char = path[i++]; + if (char === "\\" && state !== 2) { + previousState = state; + state = 4; + continue; + } + switch (state) { + case 0: + if (char === "/") { + if (buffer) { + consumeBuffer(); + } + finalizeSegment(); + } else if (char === ":") { + consumeBuffer(); + state = 1; + } else { + addCharToBuffer(); + } + break; + case 4: + addCharToBuffer(); + state = previousState; + break; + case 1: + if (char === "(") { + state = 2; + } else if (VALID_PARAM_RE.test(char)) { + addCharToBuffer(); + } else { + consumeBuffer(); + state = 0; + if (char !== "*" && char !== "?" && char !== "+") + i--; + } + break; + case 2: + if (char === ")") { + if (customRe[customRe.length - 1] == "\\") + customRe = customRe.slice(0, -1) + char; + else + state = 3; + } else { + customRe += char; + } + break; + case 3: + consumeBuffer(); + state = 0; + if (char !== "*" && char !== "?" && char !== "+") + i--; + customRe = ""; + break; + default: + crash("Unknown state"); + break; + } + } + if (state === 2) + crash(`Unfinished custom RegExp for param "${buffer}"`); + consumeBuffer(); + finalizeSegment(); + return tokens; +} +function createRouteRecordMatcher(record, parent, options) { + const parser = tokensToParser(tokenizePath(record.path), options); + if (true) { + const existingKeys = /* @__PURE__ */ new Set(); + for (const key of parser.keys) { + if (existingKeys.has(key.name)) + warn(`Found duplicated params with name "${key.name}" for path "${record.path}". Only the last one will be available on "$route.params".`); + existingKeys.add(key.name); + } + } + const matcher = assign(parser, { + record, + parent, + // these needs to be populated by the parent + children: [], + alias: [] + }); + if (parent) { + if (!matcher.record.aliasOf === !parent.record.aliasOf) + parent.children.push(matcher); + } + return matcher; +} +function createRouterMatcher(routes, globalOptions) { + const matchers = []; + const matcherMap = /* @__PURE__ */ new Map(); + globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions); + function getRecordMatcher(name) { + return matcherMap.get(name); + } + function addRoute(record, parent, originalRecord) { + const isRootAdd = !originalRecord; + const mainNormalizedRecord = normalizeRouteRecord(record); + if (true) { + checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent); + } + mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record; + const options = mergeOptions(globalOptions, record); + const normalizedRecords = [ + mainNormalizedRecord + ]; + if ("alias" in record) { + const aliases = typeof record.alias === "string" ? [record.alias] : record.alias; + for (const alias of aliases) { + normalizedRecords.push(assign({}, mainNormalizedRecord, { + // this allows us to hold a copy of the `components` option + // so that async components cache is hold on the original record + components: originalRecord ? originalRecord.record.components : mainNormalizedRecord.components, + path: alias, + // we might be the child of an alias + aliasOf: originalRecord ? originalRecord.record : mainNormalizedRecord + // the aliases are always of the same kind as the original since they + // are defined on the same record + })); + } + } + let matcher; + let originalMatcher; + for (const normalizedRecord of normalizedRecords) { + const { path } = normalizedRecord; + if (parent && path[0] !== "/") { + const parentPath = parent.record.path; + const connectingSlash = parentPath[parentPath.length - 1] === "/" ? "" : "/"; + normalizedRecord.path = parent.record.path + (path && connectingSlash + path); + } + if (normalizedRecord.path === "*") { + throw new Error('Catch all routes ("*") must now be defined using a param with a custom regexp.\nSee more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.'); + } + matcher = createRouteRecordMatcher(normalizedRecord, parent, options); + if (parent && path[0] === "/") + checkMissingParamsInAbsolutePath(matcher, parent); + if (originalRecord) { + originalRecord.alias.push(matcher); + if (true) { + checkSameParams(originalRecord, matcher); + } + } else { + originalMatcher = originalMatcher || matcher; + if (originalMatcher !== matcher) + originalMatcher.alias.push(matcher); + if (isRootAdd && record.name && !isAliasRecord(matcher)) + removeRoute(record.name); + } + if (isMatchable(matcher)) { + insertMatcher(matcher); + } + if (mainNormalizedRecord.children) { + const children = mainNormalizedRecord.children; + for (let i = 0; i < children.length; i++) { + addRoute(children[i], matcher, originalRecord && originalRecord.children[i]); + } + } + originalRecord = originalRecord || matcher; + } + return originalMatcher ? () => { + removeRoute(originalMatcher); + } : noop; + } + function removeRoute(matcherRef) { + if (isRouteName(matcherRef)) { + const matcher = matcherMap.get(matcherRef); + if (matcher) { + matcherMap.delete(matcherRef); + matchers.splice(matchers.indexOf(matcher), 1); + matcher.children.forEach(removeRoute); + matcher.alias.forEach(removeRoute); + } + } else { + const index = matchers.indexOf(matcherRef); + if (index > -1) { + matchers.splice(index, 1); + if (matcherRef.record.name) + matcherMap.delete(matcherRef.record.name); + matcherRef.children.forEach(removeRoute); + matcherRef.alias.forEach(removeRoute); + } + } + } + function getRoutes() { + return matchers; + } + function insertMatcher(matcher) { + const index = findInsertionIndex(matcher, matchers); + matchers.splice(index, 0, matcher); + if (matcher.record.name && !isAliasRecord(matcher)) + matcherMap.set(matcher.record.name, matcher); + } + function resolve(location2, currentLocation) { + let matcher; + let params = {}; + let path; + let name; + if ("name" in location2 && location2.name) { + matcher = matcherMap.get(location2.name); + if (!matcher) + throw createRouterError(1, { + location: location2 + }); + if (true) { + const invalidParams = Object.keys(location2.params || {}).filter((paramName) => !matcher.keys.find((k) => k.name === paramName)); + if (invalidParams.length) { + warn(`Discarded invalid param(s) "${invalidParams.join('", "')}" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`); + } + } + name = matcher.record.name; + params = assign( + // paramsFromLocation is a new object + paramsFromLocation( + currentLocation.params, + // only keep params that exist in the resolved location + // only keep optional params coming from a parent record + matcher.keys.filter((k) => !k.optional).concat(matcher.parent ? matcher.parent.keys.filter((k) => k.optional) : []).map((k) => k.name) + ), + // discard any existing params in the current location that do not exist here + // #1497 this ensures better active/exact matching + location2.params && paramsFromLocation(location2.params, matcher.keys.map((k) => k.name)) + ); + path = matcher.stringify(params); + } else if (location2.path != null) { + path = location2.path; + if (!path.startsWith("/")) { + warn(`The Matcher cannot resolve relative paths but received "${path}". Unless you directly called \`matcher.resolve("${path}")\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`); + } + matcher = matchers.find((m) => m.re.test(path)); + if (matcher) { + params = matcher.parse(path); + name = matcher.record.name; + } + } else { + matcher = currentLocation.name ? matcherMap.get(currentLocation.name) : matchers.find((m) => m.re.test(currentLocation.path)); + if (!matcher) + throw createRouterError(1, { + location: location2, + currentLocation + }); + name = matcher.record.name; + params = assign({}, currentLocation.params, location2.params); + path = matcher.stringify(params); + } + const matched = []; + let parentMatcher = matcher; + while (parentMatcher) { + matched.unshift(parentMatcher.record); + parentMatcher = parentMatcher.parent; + } + return { + name, + path, + params, + matched, + meta: mergeMetaFields(matched) + }; + } + routes.forEach((route) => addRoute(route)); + function clearRoutes() { + matchers.length = 0; + matcherMap.clear(); + } + return { + addRoute, + resolve, + removeRoute, + clearRoutes, + getRoutes, + getRecordMatcher + }; +} +function paramsFromLocation(params, keys) { + const newParams = {}; + for (const key of keys) { + if (key in params) + newParams[key] = params[key]; + } + return newParams; +} +function normalizeRouteRecord(record) { + return { + path: record.path, + redirect: record.redirect, + name: record.name, + meta: record.meta || {}, + aliasOf: void 0, + beforeEnter: record.beforeEnter, + props: normalizeRecordProps(record), + children: record.children || [], + instances: {}, + leaveGuards: /* @__PURE__ */ new Set(), + updateGuards: /* @__PURE__ */ new Set(), + enterCallbacks: {}, + components: "components" in record ? record.components || null : record.component && { default: record.component } + }; +} +function normalizeRecordProps(record) { + const propsObject = {}; + const props = record.props || false; + if ("component" in record) { + propsObject.default = props; + } else { + for (const name in record.components) + propsObject[name] = typeof props === "object" ? props[name] : props; + } + return propsObject; +} +function isAliasRecord(record) { + while (record) { + if (record.record.aliasOf) + return true; + record = record.parent; + } + return false; +} +function mergeMetaFields(matched) { + return matched.reduce((meta, record) => assign(meta, record.meta), {}); +} +function mergeOptions(defaults, partialOptions) { + const options = {}; + for (const key in defaults) { + options[key] = key in partialOptions ? partialOptions[key] : defaults[key]; + } + return options; +} +function isSameParam(a, b) { + return a.name === b.name && a.optional === b.optional && a.repeatable === b.repeatable; +} +function checkSameParams(a, b) { + for (const key of a.keys) { + if (!key.optional && !b.keys.find(isSameParam.bind(null, key))) + return warn(`Alias "${b.record.path}" and the original record: "${a.record.path}" must have the exact same param named "${key.name}"`); + } + for (const key of b.keys) { + if (!key.optional && !a.keys.find(isSameParam.bind(null, key))) + return warn(`Alias "${b.record.path}" and the original record: "${a.record.path}" must have the exact same param named "${key.name}"`); + } +} +function checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) { + if (parent && parent.record.name && !mainNormalizedRecord.name && !mainNormalizedRecord.path) { + warn(`The route named "${String(parent.record.name)}" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`); + } +} +function checkMissingParamsInAbsolutePath(record, parent) { + for (const key of parent.keys) { + if (!record.keys.find(isSameParam.bind(null, key))) + return warn(`Absolute path "${record.record.path}" must have the exact same param named "${key.name}" as its parent "${parent.record.path}".`); + } +} +function findInsertionIndex(matcher, matchers) { + let lower = 0; + let upper = matchers.length; + while (lower !== upper) { + const mid = lower + upper >> 1; + const sortOrder = comparePathParserScore(matcher, matchers[mid]); + if (sortOrder < 0) { + upper = mid; + } else { + lower = mid + 1; + } + } + const insertionAncestor = getInsertionAncestor(matcher); + if (insertionAncestor) { + upper = matchers.lastIndexOf(insertionAncestor, upper - 1); + if (upper < 0) { + warn(`Finding ancestor route "${insertionAncestor.record.path}" failed for "${matcher.record.path}"`); + } + } + return upper; +} +function getInsertionAncestor(matcher) { + let ancestor = matcher; + while (ancestor = ancestor.parent) { + if (isMatchable(ancestor) && comparePathParserScore(matcher, ancestor) === 0) { + return ancestor; + } + } + return; +} +function isMatchable({ record }) { + return !!(record.name || record.components && Object.keys(record.components).length || record.redirect); +} +function parseQuery(search) { + const query = {}; + if (search === "" || search === "?") + return query; + const hasLeadingIM = search[0] === "?"; + const searchParams = (hasLeadingIM ? search.slice(1) : search).split("&"); + for (let i = 0; i < searchParams.length; ++i) { + const searchParam = searchParams[i].replace(PLUS_RE, " "); + const eqPos = searchParam.indexOf("="); + const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos)); + const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1)); + if (key in query) { + let currentValue = query[key]; + if (!isArray(currentValue)) { + currentValue = query[key] = [currentValue]; + } + currentValue.push(value); + } else { + query[key] = value; + } + } + return query; +} +function stringifyQuery(query) { + let search = ""; + for (let key in query) { + const value = query[key]; + key = encodeQueryKey(key); + if (value == null) { + if (value !== void 0) { + search += (search.length ? "&" : "") + key; + } + continue; + } + const values = isArray(value) ? value.map((v) => v && encodeQueryValue(v)) : [value && encodeQueryValue(value)]; + values.forEach((value2) => { + if (value2 !== void 0) { + search += (search.length ? "&" : "") + key; + if (value2 != null) + search += "=" + value2; + } + }); + } + return search; +} +function normalizeQuery(query) { + const normalizedQuery = {}; + for (const key in query) { + const value = query[key]; + if (value !== void 0) { + normalizedQuery[key] = isArray(value) ? value.map((v) => v == null ? null : "" + v) : value == null ? value : "" + value; + } + } + return normalizedQuery; +} +var matchedRouteKey = Symbol(true ? "router view location matched" : ""); +var viewDepthKey = Symbol(true ? "router view depth" : ""); +var routerKey = Symbol(true ? "router" : ""); +var routeLocationKey = Symbol(true ? "route location" : ""); +var routerViewLocationKey = Symbol(true ? "router view location" : ""); +function useCallbacks() { + let handlers = []; + function add(handler) { + handlers.push(handler); + return () => { + const i = handlers.indexOf(handler); + if (i > -1) + handlers.splice(i, 1); + }; + } + function reset() { + handlers = []; + } + return { + add, + list: () => handlers.slice(), + reset + }; +} +function registerGuard(record, name, guard) { + const removeFromList = () => { + record[name].delete(guard); + }; + onUnmounted(removeFromList); + onDeactivated(removeFromList); + onActivated(() => { + record[name].add(guard); + }); + record[name].add(guard); +} +function onBeforeRouteLeave(leaveGuard) { + if (!getCurrentInstance()) { + warn("getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function"); + return; + } + const activeRecord = inject( + matchedRouteKey, + // to avoid warning + {} + ).value; + if (!activeRecord) { + warn("No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?"); + return; + } + registerGuard(activeRecord, "leaveGuards", leaveGuard); +} +function onBeforeRouteUpdate(updateGuard) { + if (!getCurrentInstance()) { + warn("getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function"); + return; + } + const activeRecord = inject( + matchedRouteKey, + // to avoid warning + {} + ).value; + if (!activeRecord) { + warn("No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?"); + return; + } + registerGuard(activeRecord, "updateGuards", updateGuard); +} +function guardToPromiseFn(guard, to, from, record, name, runWithContext = (fn) => fn()) { + const enterCallbackArray = record && // name is defined if record is because of the function overload + (record.enterCallbacks[name] = record.enterCallbacks[name] || []); + return () => new Promise((resolve, reject) => { + const next = (valid) => { + if (valid === false) { + reject(createRouterError(4, { + from, + to + })); + } else if (valid instanceof Error) { + reject(valid); + } else if (isRouteLocation(valid)) { + reject(createRouterError(2, { + from: to, + to: valid + })); + } else { + if (enterCallbackArray && // since enterCallbackArray is truthy, both record and name also are + record.enterCallbacks[name] === enterCallbackArray && typeof valid === "function") { + enterCallbackArray.push(valid); + } + resolve(); + } + }; + const guardReturn = runWithContext(() => guard.call(record && record.instances[name], to, from, true ? canOnlyBeCalledOnce(next, to, from) : next)); + let guardCall = Promise.resolve(guardReturn); + if (guard.length < 3) + guardCall = guardCall.then(next); + if (guard.length > 2) { + const message = `The "next" callback was never called inside of ${guard.name ? '"' + guard.name + '"' : ""}: +${guard.toString()} +. If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function.`; + if (typeof guardReturn === "object" && "then" in guardReturn) { + guardCall = guardCall.then((resolvedValue) => { + if (!next._called) { + warn(message); + return Promise.reject(new Error("Invalid navigation guard")); + } + return resolvedValue; + }); + } else if (guardReturn !== void 0) { + if (!next._called) { + warn(message); + reject(new Error("Invalid navigation guard")); + return; + } + } + } + guardCall.catch((err) => reject(err)); + }); +} +function canOnlyBeCalledOnce(next, to, from) { + let called = 0; + return function() { + if (called++ === 1) + warn(`The "next" callback was called more than once in one navigation guard when going from "${from.fullPath}" to "${to.fullPath}". It should be called exactly one time in each navigation guard. This will fail in production.`); + next._called = true; + if (called === 1) + next.apply(null, arguments); + }; +} +function extractComponentsGuards(matched, guardType, to, from, runWithContext = (fn) => fn()) { + const guards = []; + for (const record of matched) { + if (!record.components && !record.children.length) { + warn(`Record with path "${record.path}" is either missing a "component(s)" or "children" property.`); + } + for (const name in record.components) { + let rawComponent = record.components[name]; + if (true) { + if (!rawComponent || typeof rawComponent !== "object" && typeof rawComponent !== "function") { + warn(`Component "${name}" in record with path "${record.path}" is not a valid component. Received "${String(rawComponent)}".`); + throw new Error("Invalid route component"); + } else if ("then" in rawComponent) { + warn(`Component "${name}" in record with path "${record.path}" is a Promise instead of a function that returns a Promise. Did you write "import('./MyPage.vue')" instead of "() => import('./MyPage.vue')" ? This will break in production if not fixed.`); + const promise = rawComponent; + rawComponent = () => promise; + } else if (rawComponent.__asyncLoader && // warn only once per component + !rawComponent.__warnedDefineAsync) { + rawComponent.__warnedDefineAsync = true; + warn(`Component "${name}" in record with path "${record.path}" is defined using "defineAsyncComponent()". Write "() => import('./MyPage.vue')" instead of "defineAsyncComponent(() => import('./MyPage.vue'))".`); + } + } + if (guardType !== "beforeRouteEnter" && !record.instances[name]) + continue; + if (isRouteComponent(rawComponent)) { + const options = rawComponent.__vccOpts || rawComponent; + const guard = options[guardType]; + guard && guards.push(guardToPromiseFn(guard, to, from, record, name, runWithContext)); + } else { + let componentPromise = rawComponent(); + if (!("catch" in componentPromise)) { + warn(`Component "${name}" in record with path "${record.path}" is a function that does not return a Promise. If you were passing a functional component, make sure to add a "displayName" to the component. This will break in production if not fixed.`); + componentPromise = Promise.resolve(componentPromise); + } + guards.push(() => componentPromise.then((resolved) => { + if (!resolved) + return Promise.reject(new Error(`Couldn't resolve component "${name}" at "${record.path}"`)); + const resolvedComponent = isESModule(resolved) ? resolved.default : resolved; + record.components[name] = resolvedComponent; + const options = resolvedComponent.__vccOpts || resolvedComponent; + const guard = options[guardType]; + return guard && guardToPromiseFn(guard, to, from, record, name, runWithContext)(); + })); + } + } + } + return guards; +} +function isRouteComponent(component) { + return typeof component === "object" || "displayName" in component || "props" in component || "__vccOpts" in component; +} +function loadRouteLocation(route) { + return route.matched.every((record) => record.redirect) ? Promise.reject(new Error("Cannot load a route that redirects.")) : Promise.all(route.matched.map((record) => record.components && Promise.all(Object.keys(record.components).reduce((promises, name) => { + const rawComponent = record.components[name]; + if (typeof rawComponent === "function" && !("displayName" in rawComponent)) { + promises.push(rawComponent().then((resolved) => { + if (!resolved) + return Promise.reject(new Error(`Couldn't resolve component "${name}" at "${record.path}". Ensure you passed a function that returns a promise.`)); + const resolvedComponent = isESModule(resolved) ? resolved.default : resolved; + record.components[name] = resolvedComponent; + return; + })); + } + return promises; + }, [])))).then(() => route); +} +function useLink(props) { + const router = inject(routerKey); + const currentRoute = inject(routeLocationKey); + let hasPrevious = false; + let previousTo = null; + const route = computed(() => { + const to = unref(props.to); + if (!hasPrevious || to !== previousTo) { + if (!isRouteLocation(to)) { + if (hasPrevious) { + warn(`Invalid value for prop "to" in useLink() +- to:`, to, ` +- previous to:`, previousTo, ` +- props:`, props); + } else { + warn(`Invalid value for prop "to" in useLink() +- to:`, to, ` +- props:`, props); + } + } + previousTo = to; + hasPrevious = true; + } + return router.resolve(to); + }); + const activeRecordIndex = computed(() => { + const { matched } = route.value; + const { length } = matched; + const routeMatched = matched[length - 1]; + const currentMatched = currentRoute.matched; + if (!routeMatched || !currentMatched.length) + return -1; + const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched)); + if (index > -1) + return index; + const parentRecordPath = getOriginalPath(matched[length - 2]); + return ( + // we are dealing with nested routes + length > 1 && // if the parent and matched route have the same path, this link is + // referring to the empty child. Or we currently are on a different + // child of the same parent + getOriginalPath(routeMatched) === parentRecordPath && // avoid comparing the child with its parent + currentMatched[currentMatched.length - 1].path !== parentRecordPath ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2])) : index + ); + }); + const isActive = computed(() => activeRecordIndex.value > -1 && includesParams(currentRoute.params, route.value.params)); + const isExactActive = computed(() => activeRecordIndex.value > -1 && activeRecordIndex.value === currentRoute.matched.length - 1 && isSameRouteLocationParams(currentRoute.params, route.value.params)); + function navigate(e = {}) { + if (guardEvent(e)) { + return router[unref(props.replace) ? "replace" : "push"]( + unref(props.to) + // avoid uncaught errors are they are logged anyway + ).catch(noop); + } + return Promise.resolve(); + } + if (isBrowser) { + const instance = getCurrentInstance(); + if (instance) { + const linkContextDevtools = { + route: route.value, + isActive: isActive.value, + isExactActive: isExactActive.value, + error: null + }; + instance.__vrl_devtools = instance.__vrl_devtools || []; + instance.__vrl_devtools.push(linkContextDevtools); + watchEffect(() => { + linkContextDevtools.route = route.value; + linkContextDevtools.isActive = isActive.value; + linkContextDevtools.isExactActive = isExactActive.value; + linkContextDevtools.error = isRouteLocation(unref(props.to)) ? null : 'Invalid "to" value'; + }, { flush: "post" }); + } + } + return { + route, + href: computed(() => route.value.href), + isActive, + isExactActive, + navigate + }; +} +var RouterLinkImpl = defineComponent({ + name: "RouterLink", + compatConfig: { MODE: 3 }, + props: { + to: { + type: [String, Object], + required: true + }, + replace: Boolean, + activeClass: String, + // inactiveClass: String, + exactActiveClass: String, + custom: Boolean, + ariaCurrentValue: { + type: String, + default: "page" + } + }, + useLink, + setup(props, { slots }) { + const link = reactive(useLink(props)); + const { options } = inject(routerKey); + const elClass = computed(() => ({ + [getLinkClass(props.activeClass, options.linkActiveClass, "router-link-active")]: link.isActive, + // [getLinkClass( + // props.inactiveClass, + // options.linkInactiveClass, + // 'router-link-inactive' + // )]: !link.isExactActive, + [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, "router-link-exact-active")]: link.isExactActive + })); + return () => { + const children = slots.default && slots.default(link); + return props.custom ? children : h("a", { + "aria-current": link.isExactActive ? props.ariaCurrentValue : null, + href: link.href, + // this would override user added attrs but Vue will still add + // the listener, so we end up triggering both + onClick: link.navigate, + class: elClass.value + }, children); + }; + } +}); +var RouterLink = RouterLinkImpl; +function guardEvent(e) { + if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) + return; + if (e.defaultPrevented) + return; + if (e.button !== void 0 && e.button !== 0) + return; + if (e.currentTarget && e.currentTarget.getAttribute) { + const target = e.currentTarget.getAttribute("target"); + if (/\b_blank\b/i.test(target)) + return; + } + if (e.preventDefault) + e.preventDefault(); + return true; +} +function includesParams(outer, inner) { + for (const key in inner) { + const innerValue = inner[key]; + const outerValue = outer[key]; + if (typeof innerValue === "string") { + if (innerValue !== outerValue) + return false; + } else { + if (!isArray(outerValue) || outerValue.length !== innerValue.length || innerValue.some((value, i) => value !== outerValue[i])) + return false; + } + } + return true; +} +function getOriginalPath(record) { + return record ? record.aliasOf ? record.aliasOf.path : record.path : ""; +} +var getLinkClass = (propClass, globalClass, defaultClass) => propClass != null ? propClass : globalClass != null ? globalClass : defaultClass; +var RouterViewImpl = defineComponent({ + name: "RouterView", + // #674 we manually inherit them + inheritAttrs: false, + props: { + name: { + type: String, + default: "default" + }, + route: Object + }, + // Better compat for @vue/compat users + // https://github.com/vuejs/router/issues/1315 + compatConfig: { MODE: 3 }, + setup(props, { attrs, slots }) { + warnDeprecatedUsage(); + const injectedRoute = inject(routerViewLocationKey); + const routeToDisplay = computed(() => props.route || injectedRoute.value); + const injectedDepth = inject(viewDepthKey, 0); + const depth = computed(() => { + let initialDepth = unref(injectedDepth); + const { matched } = routeToDisplay.value; + let matchedRoute; + while ((matchedRoute = matched[initialDepth]) && !matchedRoute.components) { + initialDepth++; + } + return initialDepth; + }); + const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]); + provide(viewDepthKey, computed(() => depth.value + 1)); + provide(matchedRouteKey, matchedRouteRef); + provide(routerViewLocationKey, routeToDisplay); + const viewRef = ref(); + watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => { + if (to) { + to.instances[name] = instance; + if (from && from !== to && instance && instance === oldInstance) { + if (!to.leaveGuards.size) { + to.leaveGuards = from.leaveGuards; + } + if (!to.updateGuards.size) { + to.updateGuards = from.updateGuards; + } + } + } + if (instance && to && // if there is no instance but to and from are the same this might be + // the first visit + (!from || !isSameRouteRecord(to, from) || !oldInstance)) { + (to.enterCallbacks[name] || []).forEach((callback) => callback(instance)); + } + }, { flush: "post" }); + return () => { + const route = routeToDisplay.value; + const currentName = props.name; + const matchedRoute = matchedRouteRef.value; + const ViewComponent = matchedRoute && matchedRoute.components[currentName]; + if (!ViewComponent) { + return normalizeSlot(slots.default, { Component: ViewComponent, route }); + } + const routePropsOption = matchedRoute.props[currentName]; + const routeProps = routePropsOption ? routePropsOption === true ? route.params : typeof routePropsOption === "function" ? routePropsOption(route) : routePropsOption : null; + const onVnodeUnmounted = (vnode) => { + if (vnode.component.isUnmounted) { + matchedRoute.instances[currentName] = null; + } + }; + const component = h(ViewComponent, assign({}, routeProps, attrs, { + onVnodeUnmounted, + ref: viewRef + })); + if (isBrowser && component.ref) { + const info = { + depth: depth.value, + name: matchedRoute.name, + path: matchedRoute.path, + meta: matchedRoute.meta + }; + const internalInstances = isArray(component.ref) ? component.ref.map((r) => r.i) : [component.ref.i]; + internalInstances.forEach((instance) => { + instance.__vrv_devtools = info; + }); + } + return ( + // pass the vnode to the slot as a prop. + // h and <component :is="..."> both accept vnodes + normalizeSlot(slots.default, { Component: component, route }) || component + ); + }; + } +}); +function normalizeSlot(slot, data) { + if (!slot) + return null; + const slotContent = slot(data); + return slotContent.length === 1 ? slotContent[0] : slotContent; +} +var RouterView = RouterViewImpl; +function warnDeprecatedUsage() { + const instance = getCurrentInstance(); + const parentName = instance.parent && instance.parent.type.name; + const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type; + if (parentName && (parentName === "KeepAlive" || parentName.includes("Transition")) && typeof parentSubTreeType === "object" && parentSubTreeType.name === "RouterView") { + const comp = parentName === "KeepAlive" ? "keep-alive" : "transition"; + warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>. +Use slot props instead: + +<router-view v-slot="{ Component }"> + <${comp}> + <component :is="Component" /> + </${comp}> +</router-view>`); + } +} +function formatRouteLocation(routeLocation, tooltip) { + const copy = assign({}, routeLocation, { + // remove variables that can contain vue instances + matched: routeLocation.matched.map((matched) => omit(matched, ["instances", "children", "aliasOf"])) + }); + return { + _custom: { + type: null, + readOnly: true, + display: routeLocation.fullPath, + tooltip, + value: copy + } + }; +} +function formatDisplay(display) { + return { + _custom: { + display + } + }; +} +var routerId = 0; +function addDevtools(app, router, matcher) { + if (router.__hasDevtools) + return; + router.__hasDevtools = true; + const id = routerId++; + setupDevtoolsPlugin({ + id: "org.vuejs.router" + (id ? "." + id : ""), + label: "Vue Router", + packageName: "vue-router", + homepage: "https://router.vuejs.org", + logo: "https://router.vuejs.org/logo.png", + componentStateTypes: ["Routing"], + app + }, (api) => { + if (typeof api.now !== "function") { + console.warn("[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html."); + } + api.on.inspectComponent((payload, ctx) => { + if (payload.instanceData) { + payload.instanceData.state.push({ + type: "Routing", + key: "$route", + editable: false, + value: formatRouteLocation(router.currentRoute.value, "Current Route") + }); + } + }); + api.on.visitComponentTree(({ treeNode: node, componentInstance }) => { + if (componentInstance.__vrv_devtools) { + const info = componentInstance.__vrv_devtools; + node.tags.push({ + label: (info.name ? `${info.name.toString()}: ` : "") + info.path, + textColor: 0, + tooltip: "This component is rendered by <router-view>", + backgroundColor: PINK_500 + }); + } + if (isArray(componentInstance.__vrl_devtools)) { + componentInstance.__devtoolsApi = api; + componentInstance.__vrl_devtools.forEach((devtoolsData) => { + let label = devtoolsData.route.path; + let backgroundColor = ORANGE_400; + let tooltip = ""; + let textColor = 0; + if (devtoolsData.error) { + label = devtoolsData.error; + backgroundColor = RED_100; + textColor = RED_700; + } else if (devtoolsData.isExactActive) { + backgroundColor = LIME_500; + tooltip = "This is exactly active"; + } else if (devtoolsData.isActive) { + backgroundColor = BLUE_600; + tooltip = "This link is active"; + } + node.tags.push({ + label, + textColor, + tooltip, + backgroundColor + }); + }); + } + }); + watch(router.currentRoute, () => { + refreshRoutesView(); + api.notifyComponentUpdate(); + api.sendInspectorTree(routerInspectorId); + api.sendInspectorState(routerInspectorId); + }); + const navigationsLayerId = "router:navigations:" + id; + api.addTimelineLayer({ + id: navigationsLayerId, + label: `Router${id ? " " + id : ""} Navigations`, + color: 4237508 + }); + router.onError((error, to) => { + api.addTimelineEvent({ + layerId: navigationsLayerId, + event: { + title: "Error during Navigation", + subtitle: to.fullPath, + logType: "error", + time: api.now(), + data: { error }, + groupId: to.meta.__navigationId + } + }); + }); + let navigationId = 0; + router.beforeEach((to, from) => { + const data = { + guard: formatDisplay("beforeEach"), + from: formatRouteLocation(from, "Current Location during this navigation"), + to: formatRouteLocation(to, "Target location") + }; + Object.defineProperty(to.meta, "__navigationId", { + value: navigationId++ + }); + api.addTimelineEvent({ + layerId: navigationsLayerId, + event: { + time: api.now(), + title: "Start of navigation", + subtitle: to.fullPath, + data, + groupId: to.meta.__navigationId + } + }); + }); + router.afterEach((to, from, failure) => { + const data = { + guard: formatDisplay("afterEach") + }; + if (failure) { + data.failure = { + _custom: { + type: Error, + readOnly: true, + display: failure ? failure.message : "", + tooltip: "Navigation Failure", + value: failure + } + }; + data.status = formatDisplay("❌"); + } else { + data.status = formatDisplay("✅"); + } + data.from = formatRouteLocation(from, "Current Location during this navigation"); + data.to = formatRouteLocation(to, "Target location"); + api.addTimelineEvent({ + layerId: navigationsLayerId, + event: { + title: "End of navigation", + subtitle: to.fullPath, + time: api.now(), + data, + logType: failure ? "warning" : "default", + groupId: to.meta.__navigationId + } + }); + }); + const routerInspectorId = "router-inspector:" + id; + api.addInspector({ + id: routerInspectorId, + label: "Routes" + (id ? " " + id : ""), + icon: "book", + treeFilterPlaceholder: "Search routes" + }); + function refreshRoutesView() { + if (!activeRoutesPayload) + return; + const payload = activeRoutesPayload; + let routes = matcher.getRoutes().filter((route) => !route.parent || // these routes have a parent with no component which will not appear in the view + // therefore we still need to include them + !route.parent.record.components); + routes.forEach(resetMatchStateOnRouteRecord); + if (payload.filter) { + routes = routes.filter((route) => ( + // save matches state based on the payload + isRouteMatching(route, payload.filter.toLowerCase()) + )); + } + routes.forEach((route) => markRouteRecordActive(route, router.currentRoute.value)); + payload.rootNodes = routes.map(formatRouteRecordForInspector); + } + let activeRoutesPayload; + api.on.getInspectorTree((payload) => { + activeRoutesPayload = payload; + if (payload.app === app && payload.inspectorId === routerInspectorId) { + refreshRoutesView(); + } + }); + api.on.getInspectorState((payload) => { + if (payload.app === app && payload.inspectorId === routerInspectorId) { + const routes = matcher.getRoutes(); + const route = routes.find((route2) => route2.record.__vd_id === payload.nodeId); + if (route) { + payload.state = { + options: formatRouteRecordMatcherForStateInspector(route) + }; + } + } + }); + api.sendInspectorTree(routerInspectorId); + api.sendInspectorState(routerInspectorId); + }); +} +function modifierForKey(key) { + if (key.optional) { + return key.repeatable ? "*" : "?"; + } else { + return key.repeatable ? "+" : ""; + } +} +function formatRouteRecordMatcherForStateInspector(route) { + const { record } = route; + const fields = [ + { editable: false, key: "path", value: record.path } + ]; + if (record.name != null) { + fields.push({ + editable: false, + key: "name", + value: record.name + }); + } + fields.push({ editable: false, key: "regexp", value: route.re }); + if (route.keys.length) { + fields.push({ + editable: false, + key: "keys", + value: { + _custom: { + type: null, + readOnly: true, + display: route.keys.map((key) => `${key.name}${modifierForKey(key)}`).join(" "), + tooltip: "Param keys", + value: route.keys + } + } + }); + } + if (record.redirect != null) { + fields.push({ + editable: false, + key: "redirect", + value: record.redirect + }); + } + if (route.alias.length) { + fields.push({ + editable: false, + key: "aliases", + value: route.alias.map((alias) => alias.record.path) + }); + } + if (Object.keys(route.record.meta).length) { + fields.push({ + editable: false, + key: "meta", + value: route.record.meta + }); + } + fields.push({ + key: "score", + editable: false, + value: { + _custom: { + type: null, + readOnly: true, + display: route.score.map((score) => score.join(", ")).join(" | "), + tooltip: "Score used to sort routes", + value: route.score + } + } + }); + return fields; +} +var PINK_500 = 15485081; +var BLUE_600 = 2450411; +var LIME_500 = 8702998; +var CYAN_400 = 2282478; +var ORANGE_400 = 16486972; +var DARK = 6710886; +var RED_100 = 16704226; +var RED_700 = 12131356; +function formatRouteRecordForInspector(route) { + const tags = []; + const { record } = route; + if (record.name != null) { + tags.push({ + label: String(record.name), + textColor: 0, + backgroundColor: CYAN_400 + }); + } + if (record.aliasOf) { + tags.push({ + label: "alias", + textColor: 0, + backgroundColor: ORANGE_400 + }); + } + if (route.__vd_match) { + tags.push({ + label: "matches", + textColor: 0, + backgroundColor: PINK_500 + }); + } + if (route.__vd_exactActive) { + tags.push({ + label: "exact", + textColor: 0, + backgroundColor: LIME_500 + }); + } + if (route.__vd_active) { + tags.push({ + label: "active", + textColor: 0, + backgroundColor: BLUE_600 + }); + } + if (record.redirect) { + tags.push({ + label: typeof record.redirect === "string" ? `redirect: ${record.redirect}` : "redirects", + textColor: 16777215, + backgroundColor: DARK + }); + } + let id = record.__vd_id; + if (id == null) { + id = String(routeRecordId++); + record.__vd_id = id; + } + return { + id, + label: record.path, + tags, + children: route.children.map(formatRouteRecordForInspector) + }; +} +var routeRecordId = 0; +var EXTRACT_REGEXP_RE = /^\/(.*)\/([a-z]*)$/; +function markRouteRecordActive(route, currentRoute) { + const isExactActive = currentRoute.matched.length && isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record); + route.__vd_exactActive = route.__vd_active = isExactActive; + if (!isExactActive) { + route.__vd_active = currentRoute.matched.some((match) => isSameRouteRecord(match, route.record)); + } + route.children.forEach((childRoute) => markRouteRecordActive(childRoute, currentRoute)); +} +function resetMatchStateOnRouteRecord(route) { + route.__vd_match = false; + route.children.forEach(resetMatchStateOnRouteRecord); +} +function isRouteMatching(route, filter) { + const found = String(route.re).match(EXTRACT_REGEXP_RE); + route.__vd_match = false; + if (!found || found.length < 3) { + return false; + } + const nonEndingRE = new RegExp(found[1].replace(/\$$/, ""), found[2]); + if (nonEndingRE.test(filter)) { + route.children.forEach((child) => isRouteMatching(child, filter)); + if (route.record.path !== "/" || filter === "/") { + route.__vd_match = route.re.test(filter); + return true; + } + return false; + } + const path = route.record.path.toLowerCase(); + const decodedPath = decode(path); + if (!filter.startsWith("/") && (decodedPath.includes(filter) || path.includes(filter))) + return true; + if (decodedPath.startsWith(filter) || path.startsWith(filter)) + return true; + if (route.record.name && String(route.record.name).includes(filter)) + return true; + return route.children.some((child) => isRouteMatching(child, filter)); +} +function omit(obj, keys) { + const ret = {}; + for (const key in obj) { + if (!keys.includes(key)) { + ret[key] = obj[key]; + } + } + return ret; +} +function createRouter(options) { + const matcher = createRouterMatcher(options.routes, options); + const parseQuery$1 = options.parseQuery || parseQuery; + const stringifyQuery$1 = options.stringifyQuery || stringifyQuery; + const routerHistory = options.history; + if (!routerHistory) + throw new Error('Provide the "history" option when calling "createRouter()": https://router.vuejs.org/api/interfaces/RouterOptions.html#history'); + const beforeGuards = useCallbacks(); + const beforeResolveGuards = useCallbacks(); + const afterGuards = useCallbacks(); + const currentRoute = shallowRef(START_LOCATION_NORMALIZED); + let pendingLocation = START_LOCATION_NORMALIZED; + if (isBrowser && options.scrollBehavior && "scrollRestoration" in history) { + history.scrollRestoration = "manual"; + } + const normalizeParams = applyToParams.bind(null, (paramValue) => "" + paramValue); + const encodeParams = applyToParams.bind(null, encodeParam); + const decodeParams = ( + // @ts-expect-error: intentionally avoid the type check + applyToParams.bind(null, decode) + ); + function addRoute(parentOrRoute, route) { + let parent; + let record; + if (isRouteName(parentOrRoute)) { + parent = matcher.getRecordMatcher(parentOrRoute); + if (!parent) { + warn(`Parent route "${String(parentOrRoute)}" not found when adding child route`, route); + } + record = route; + } else { + record = parentOrRoute; + } + return matcher.addRoute(record, parent); + } + function removeRoute(name) { + const recordMatcher = matcher.getRecordMatcher(name); + if (recordMatcher) { + matcher.removeRoute(recordMatcher); + } else if (true) { + warn(`Cannot remove non-existent route "${String(name)}"`); + } + } + function getRoutes() { + return matcher.getRoutes().map((routeMatcher) => routeMatcher.record); + } + function hasRoute(name) { + return !!matcher.getRecordMatcher(name); + } + function resolve(rawLocation, currentLocation) { + currentLocation = assign({}, currentLocation || currentRoute.value); + if (typeof rawLocation === "string") { + const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path); + const matchedRoute2 = matcher.resolve({ path: locationNormalized.path }, currentLocation); + const href2 = routerHistory.createHref(locationNormalized.fullPath); + if (true) { + if (href2.startsWith("//")) + warn(`Location "${rawLocation}" resolved to "${href2}". A resolved location cannot start with multiple slashes.`); + else if (!matchedRoute2.matched.length) { + warn(`No match found for location with path "${rawLocation}"`); + } + } + return assign(locationNormalized, matchedRoute2, { + params: decodeParams(matchedRoute2.params), + hash: decode(locationNormalized.hash), + redirectedFrom: void 0, + href: href2 + }); + } + if (!isRouteLocation(rawLocation)) { + warn(`router.resolve() was passed an invalid location. This will fail in production. +- Location:`, rawLocation); + return resolve({}); + } + let matcherLocation; + if (rawLocation.path != null) { + if ("params" in rawLocation && !("name" in rawLocation) && // @ts-expect-error: the type is never + Object.keys(rawLocation.params).length) { + warn(`Path "${rawLocation.path}" was passed with params but they will be ignored. Use a named route alongside params instead.`); + } + matcherLocation = assign({}, rawLocation, { + path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path + }); + } else { + const targetParams = assign({}, rawLocation.params); + for (const key in targetParams) { + if (targetParams[key] == null) { + delete targetParams[key]; + } + } + matcherLocation = assign({}, rawLocation, { + params: encodeParams(targetParams) + }); + currentLocation.params = encodeParams(currentLocation.params); + } + const matchedRoute = matcher.resolve(matcherLocation, currentLocation); + const hash = rawLocation.hash || ""; + if (hash && !hash.startsWith("#")) { + warn(`A \`hash\` should always start with the character "#". Replace "${hash}" with "#${hash}".`); + } + matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params)); + const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, { + hash: encodeHash(hash), + path: matchedRoute.path + })); + const href = routerHistory.createHref(fullPath); + if (true) { + if (href.startsWith("//")) { + warn(`Location "${rawLocation}" resolved to "${href}". A resolved location cannot start with multiple slashes.`); + } else if (!matchedRoute.matched.length) { + warn(`No match found for location with path "${rawLocation.path != null ? rawLocation.path : rawLocation}"`); + } + } + return assign({ + fullPath, + // keep the hash encoded so fullPath is effectively path + encodedQuery + + // hash + hash, + query: ( + // if the user is using a custom query lib like qs, we might have + // nested objects, so we keep the query as is, meaning it can contain + // numbers at `$route.query`, but at the point, the user will have to + // use their own type anyway. + // https://github.com/vuejs/router/issues/328#issuecomment-649481567 + stringifyQuery$1 === stringifyQuery ? normalizeQuery(rawLocation.query) : rawLocation.query || {} + ) + }, matchedRoute, { + redirectedFrom: void 0, + href + }); + } + function locationAsObject(to) { + return typeof to === "string" ? parseURL(parseQuery$1, to, currentRoute.value.path) : assign({}, to); + } + function checkCanceledNavigation(to, from) { + if (pendingLocation !== to) { + return createRouterError(8, { + from, + to + }); + } + } + function push(to) { + return pushWithRedirect(to); + } + function replace(to) { + return push(assign(locationAsObject(to), { replace: true })); + } + function handleRedirectRecord(to) { + const lastMatched = to.matched[to.matched.length - 1]; + if (lastMatched && lastMatched.redirect) { + const { redirect } = lastMatched; + let newTargetLocation = typeof redirect === "function" ? redirect(to) : redirect; + if (typeof newTargetLocation === "string") { + newTargetLocation = newTargetLocation.includes("?") || newTargetLocation.includes("#") ? newTargetLocation = locationAsObject(newTargetLocation) : ( + // force empty params + { path: newTargetLocation } + ); + newTargetLocation.params = {}; + } + if (newTargetLocation.path == null && !("name" in newTargetLocation)) { + warn(`Invalid redirect found: +${JSON.stringify(newTargetLocation, null, 2)} + when navigating to "${to.fullPath}". A redirect must contain a name or path. This will break in production.`); + throw new Error("Invalid redirect"); + } + return assign({ + query: to.query, + hash: to.hash, + // avoid transferring params if the redirect has a path + params: newTargetLocation.path != null ? {} : to.params + }, newTargetLocation); + } + } + function pushWithRedirect(to, redirectedFrom) { + const targetLocation = pendingLocation = resolve(to); + const from = currentRoute.value; + const data = to.state; + const force = to.force; + const replace2 = to.replace === true; + const shouldRedirect = handleRedirectRecord(targetLocation); + if (shouldRedirect) + return pushWithRedirect( + assign(locationAsObject(shouldRedirect), { + state: typeof shouldRedirect === "object" ? assign({}, data, shouldRedirect.state) : data, + force, + replace: replace2 + }), + // keep original redirectedFrom if it exists + redirectedFrom || targetLocation + ); + const toLocation = targetLocation; + toLocation.redirectedFrom = redirectedFrom; + let failure; + if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) { + failure = createRouterError(16, { to: toLocation, from }); + handleScroll( + from, + from, + // this is a push, the only way for it to be triggered from a + // history.listen is with a redirect, which makes it become a push + true, + // This cannot be the first navigation because the initial location + // cannot be manually navigated to + false + ); + } + return (failure ? Promise.resolve(failure) : navigate(toLocation, from)).catch((error) => isNavigationFailure(error) ? ( + // navigation redirects still mark the router as ready + isNavigationFailure( + error, + 2 + /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */ + ) ? error : markAsReady(error) + ) : ( + // reject any unknown error + triggerError(error, toLocation, from) + )).then((failure2) => { + if (failure2) { + if (isNavigationFailure( + failure2, + 2 + /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */ + )) { + if (// we are redirecting to the same location we were already at + isSameRouteLocation(stringifyQuery$1, resolve(failure2.to), toLocation) && // and we have done it a couple of times + redirectedFrom && // @ts-expect-error: added only in dev + (redirectedFrom._count = redirectedFrom._count ? ( + // @ts-expect-error + redirectedFrom._count + 1 + ) : 1) > 30) { + warn(`Detected a possibly infinite redirection in a navigation guard when going from "${from.fullPath}" to "${toLocation.fullPath}". Aborting to avoid a Stack Overflow. + Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`); + return Promise.reject(new Error("Infinite redirect in navigation guard")); + } + return pushWithRedirect( + // keep options + assign({ + // preserve an existing replacement but allow the redirect to override it + replace: replace2 + }, locationAsObject(failure2.to), { + state: typeof failure2.to === "object" ? assign({}, data, failure2.to.state) : data, + force + }), + // preserve the original redirectedFrom if any + redirectedFrom || toLocation + ); + } + } else { + failure2 = finalizeNavigation(toLocation, from, true, replace2, data); + } + triggerAfterEach(toLocation, from, failure2); + return failure2; + }); + } + function checkCanceledNavigationAndReject(to, from) { + const error = checkCanceledNavigation(to, from); + return error ? Promise.reject(error) : Promise.resolve(); + } + function runWithContext(fn) { + const app = installedApps.values().next().value; + return app && typeof app.runWithContext === "function" ? app.runWithContext(fn) : fn(); + } + function navigate(to, from) { + let guards; + const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from); + guards = extractComponentsGuards(leavingRecords.reverse(), "beforeRouteLeave", to, from); + for (const record of leavingRecords) { + record.leaveGuards.forEach((guard) => { + guards.push(guardToPromiseFn(guard, to, from)); + }); + } + const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from); + guards.push(canceledNavigationCheck); + return runGuardQueue(guards).then(() => { + guards = []; + for (const guard of beforeGuards.list()) { + guards.push(guardToPromiseFn(guard, to, from)); + } + guards.push(canceledNavigationCheck); + return runGuardQueue(guards); + }).then(() => { + guards = extractComponentsGuards(updatingRecords, "beforeRouteUpdate", to, from); + for (const record of updatingRecords) { + record.updateGuards.forEach((guard) => { + guards.push(guardToPromiseFn(guard, to, from)); + }); + } + guards.push(canceledNavigationCheck); + return runGuardQueue(guards); + }).then(() => { + guards = []; + for (const record of enteringRecords) { + if (record.beforeEnter) { + if (isArray(record.beforeEnter)) { + for (const beforeEnter of record.beforeEnter) + guards.push(guardToPromiseFn(beforeEnter, to, from)); + } else { + guards.push(guardToPromiseFn(record.beforeEnter, to, from)); + } + } + } + guards.push(canceledNavigationCheck); + return runGuardQueue(guards); + }).then(() => { + to.matched.forEach((record) => record.enterCallbacks = {}); + guards = extractComponentsGuards(enteringRecords, "beforeRouteEnter", to, from, runWithContext); + guards.push(canceledNavigationCheck); + return runGuardQueue(guards); + }).then(() => { + guards = []; + for (const guard of beforeResolveGuards.list()) { + guards.push(guardToPromiseFn(guard, to, from)); + } + guards.push(canceledNavigationCheck); + return runGuardQueue(guards); + }).catch((err) => isNavigationFailure( + err, + 8 + /* ErrorTypes.NAVIGATION_CANCELLED */ + ) ? err : Promise.reject(err)); + } + function triggerAfterEach(to, from, failure) { + afterGuards.list().forEach((guard) => runWithContext(() => guard(to, from, failure))); + } + function finalizeNavigation(toLocation, from, isPush, replace2, data) { + const error = checkCanceledNavigation(toLocation, from); + if (error) + return error; + const isFirstNavigation = from === START_LOCATION_NORMALIZED; + const state = !isBrowser ? {} : history.state; + if (isPush) { + if (replace2 || isFirstNavigation) + routerHistory.replace(toLocation.fullPath, assign({ + scroll: isFirstNavigation && state && state.scroll + }, data)); + else + routerHistory.push(toLocation.fullPath, data); + } + currentRoute.value = toLocation; + handleScroll(toLocation, from, isPush, isFirstNavigation); + markAsReady(); + } + let removeHistoryListener; + function setupListeners() { + if (removeHistoryListener) + return; + removeHistoryListener = routerHistory.listen((to, _from, info) => { + if (!router.listening) + return; + const toLocation = resolve(to); + const shouldRedirect = handleRedirectRecord(toLocation); + if (shouldRedirect) { + pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop); + return; + } + pendingLocation = toLocation; + const from = currentRoute.value; + if (isBrowser) { + saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition()); + } + navigate(toLocation, from).catch((error) => { + if (isNavigationFailure( + error, + 4 | 8 + /* ErrorTypes.NAVIGATION_CANCELLED */ + )) { + return error; + } + if (isNavigationFailure( + error, + 2 + /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */ + )) { + pushWithRedirect( + error.to, + toLocation + // avoid an uncaught rejection, let push call triggerError + ).then((failure) => { + if (isNavigationFailure( + failure, + 4 | 16 + /* ErrorTypes.NAVIGATION_DUPLICATED */ + ) && !info.delta && info.type === NavigationType.pop) { + routerHistory.go(-1, false); + } + }).catch(noop); + return Promise.reject(); + } + if (info.delta) { + routerHistory.go(-info.delta, false); + } + return triggerError(error, toLocation, from); + }).then((failure) => { + failure = failure || finalizeNavigation( + // after navigation, all matched components are resolved + toLocation, + from, + false + ); + if (failure) { + if (info.delta && // a new navigation has been triggered, so we do not want to revert, that will change the current history + // entry while a different route is displayed + !isNavigationFailure( + failure, + 8 + /* ErrorTypes.NAVIGATION_CANCELLED */ + )) { + routerHistory.go(-info.delta, false); + } else if (info.type === NavigationType.pop && isNavigationFailure( + failure, + 4 | 16 + /* ErrorTypes.NAVIGATION_DUPLICATED */ + )) { + routerHistory.go(-1, false); + } + } + triggerAfterEach(toLocation, from, failure); + }).catch(noop); + }); + } + let readyHandlers = useCallbacks(); + let errorListeners = useCallbacks(); + let ready; + function triggerError(error, to, from) { + markAsReady(error); + const list = errorListeners.list(); + if (list.length) { + list.forEach((handler) => handler(error, to, from)); + } else { + if (true) { + warn("uncaught error during route navigation:"); + } + console.error(error); + } + return Promise.reject(error); + } + function isReady() { + if (ready && currentRoute.value !== START_LOCATION_NORMALIZED) + return Promise.resolve(); + return new Promise((resolve2, reject) => { + readyHandlers.add([resolve2, reject]); + }); + } + function markAsReady(err) { + if (!ready) { + ready = !err; + setupListeners(); + readyHandlers.list().forEach(([resolve2, reject]) => err ? reject(err) : resolve2()); + readyHandlers.reset(); + } + return err; + } + function handleScroll(to, from, isPush, isFirstNavigation) { + const { scrollBehavior } = options; + if (!isBrowser || !scrollBehavior) + return Promise.resolve(); + const scrollPosition = !isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0)) || (isFirstNavigation || !isPush) && history.state && history.state.scroll || null; + return nextTick().then(() => scrollBehavior(to, from, scrollPosition)).then((position) => position && scrollToPosition(position)).catch((err) => triggerError(err, to, from)); + } + const go = (delta) => routerHistory.go(delta); + let started; + const installedApps = /* @__PURE__ */ new Set(); + const router = { + currentRoute, + listening: true, + addRoute, + removeRoute, + clearRoutes: matcher.clearRoutes, + hasRoute, + getRoutes, + resolve, + options, + push, + replace, + go, + back: () => go(-1), + forward: () => go(1), + beforeEach: beforeGuards.add, + beforeResolve: beforeResolveGuards.add, + afterEach: afterGuards.add, + onError: errorListeners.add, + isReady, + install(app) { + const router2 = this; + app.component("RouterLink", RouterLink); + app.component("RouterView", RouterView); + app.config.globalProperties.$router = router2; + Object.defineProperty(app.config.globalProperties, "$route", { + enumerable: true, + get: () => unref(currentRoute) + }); + if (isBrowser && // used for the initial navigation client side to avoid pushing + // multiple times when the router is used in multiple apps + !started && currentRoute.value === START_LOCATION_NORMALIZED) { + started = true; + push(routerHistory.location).catch((err) => { + if (true) + warn("Unexpected error when starting the router:", err); + }); + } + const reactiveRoute = {}; + for (const key in START_LOCATION_NORMALIZED) { + Object.defineProperty(reactiveRoute, key, { + get: () => currentRoute.value[key], + enumerable: true + }); + } + app.provide(routerKey, router2); + app.provide(routeLocationKey, shallowReactive(reactiveRoute)); + app.provide(routerViewLocationKey, currentRoute); + const unmountApp = app.unmount; + installedApps.add(app); + app.unmount = function() { + installedApps.delete(app); + if (installedApps.size < 1) { + pendingLocation = START_LOCATION_NORMALIZED; + removeHistoryListener && removeHistoryListener(); + removeHistoryListener = null; + currentRoute.value = START_LOCATION_NORMALIZED; + started = false; + ready = false; + } + unmountApp(); + }; + if (isBrowser) { + addDevtools(app, router2, matcher); + } + } + }; + function runGuardQueue(guards) { + return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve()); + } + return router; +} +function extractChangingRecords(to, from) { + const leavingRecords = []; + const updatingRecords = []; + const enteringRecords = []; + const len = Math.max(from.matched.length, to.matched.length); + for (let i = 0; i < len; i++) { + const recordFrom = from.matched[i]; + if (recordFrom) { + if (to.matched.find((record) => isSameRouteRecord(record, recordFrom))) + updatingRecords.push(recordFrom); + else + leavingRecords.push(recordFrom); + } + const recordTo = to.matched[i]; + if (recordTo) { + if (!from.matched.find((record) => isSameRouteRecord(record, recordTo))) { + enteringRecords.push(recordTo); + } + } + } + return [leavingRecords, updatingRecords, enteringRecords]; +} +function useRouter() { + return inject(routerKey); +} +function useRoute(_name) { + return inject(routeLocationKey); +} +export { + NavigationFailureType, + RouterLink, + RouterView, + START_LOCATION_NORMALIZED as START_LOCATION, + createMemoryHistory, + createRouter, + createRouterMatcher, + createWebHashHistory, + createWebHistory, + isNavigationFailure, + loadRouteLocation, + matchedRouteKey, + onBeforeRouteLeave, + onBeforeRouteUpdate, + parseQuery, + routeLocationKey, + routerKey, + routerViewLocationKey, + stringifyQuery, + useLink, + useRoute, + useRouter, + viewDepthKey +}; +/*! Bundled license information: + +vue-router/dist/vue-router.mjs: + (*! + * vue-router v4.4.3 + * (c) 2024 Eduardo San Martin Morote + * @license MIT + *) +*/ +//# sourceMappingURL=vue-router.js.map diff --git a/src/.vuepress/.cache/deps/vue-router.js.map b/src/.vuepress/.cache/deps/vue-router.js.map new file mode 100644 index 000000000..ff0ff3a4c --- /dev/null +++ b/src/.vuepress/.cache/deps/vue-router.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../node_modules/vue-router/dist/vue-router.mjs"], + "sourcesContent": ["/*!\n * vue-router v4.4.3\n * (c) 2024 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, onUnmounted, onDeactivated, onActivated, computed, unref, watchEffect, defineComponent, reactive, h, provide, ref, watch, shallowRef, shallowReactive, nextTick } from 'vue';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\nconst isBrowser = typeof document !== 'undefined';\n\nfunction isESModule(obj) {\n return obj.__esModule || obj[Symbol.toStringTag] === 'Module';\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n const newParams = {};\n for (const key in params) {\n const value = params[key];\n newParams[key] = isArray(value)\n ? value.map(fn)\n : fn(value);\n }\n return newParams;\n}\nconst noop = () => { };\n/**\n * Typesafe alternative to Array.isArray\n * https://github.com/microsoft/TypeScript/pull/48228\n */\nconst isArray = Array.isArray;\n\nfunction warn(msg) {\n // avoid using ...args as it breaks in older Edge builds\n const args = Array.from(arguments).slice(1);\n console.warn.apply(console, ['[Vue Router warn]: ' + msg].concat(args));\n}\n\n/**\n * Encoding Rules (␣ = Space)\n * - Path: ␣ \" < > # ? { }\n * - Query: ␣ \" < > # & =\n * - Hash: ␣ \" < > `\n *\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n * defines some extra characters to be encoded. Most browsers do not encode them\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n * plus `-._~`. This extra safety should be applied to query by patching the\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\n * encoded everywhere because some browsers like FF encode it when directly\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n */\n// const EXTRA_RESERVED_RE = /[!'()*]/g\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\nconst HASH_RE = /#/g; // %23\nconst AMPERSAND_RE = /&/g; // %26\nconst SLASH_RE = /\\//g; // %2F\nconst EQUAL_RE = /=/g; // %3D\nconst IM_RE = /\\?/g; // %3F\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\n * seems to be less flexible than not doing so and I can't find out the legacy\n * systems requiring this for regular requests like text/html. In the standard,\n * the encoding of the plus character is only mentioned for\n * application/x-www-form-urlencoded\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n * leave the plus character as is in queries. To be more flexible, we allow the\n * plus character on the query, but it can also be manually encoded by the user.\n *\n * Resources:\n * - https://url.spec.whatwg.org/#urlencoded-parsing\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n */\nconst ENC_BRACKET_OPEN_RE = /%5B/g; // [\nconst ENC_BRACKET_CLOSE_RE = /%5D/g; // ]\nconst ENC_CARET_RE = /%5E/g; // ^\nconst ENC_BACKTICK_RE = /%60/g; // `\nconst ENC_CURLY_OPEN_RE = /%7B/g; // {\nconst ENC_PIPE_RE = /%7C/g; // |\nconst ENC_CURLY_CLOSE_RE = /%7D/g; // }\nconst ENC_SPACE_RE = /%20/g; // }\n/**\n * Encode characters that need to be encoded on the path, search and hash\n * sections of the URL.\n *\n * @internal\n * @param text - string to encode\n * @returns encoded string\n */\nfunction commonEncode(text) {\n return encodeURI('' + text)\n .replace(ENC_PIPE_RE, '|')\n .replace(ENC_BRACKET_OPEN_RE, '[')\n .replace(ENC_BRACKET_CLOSE_RE, ']');\n}\n/**\n * Encode characters that need to be encoded on the hash section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeHash(text) {\n return commonEncode(text)\n .replace(ENC_CURLY_OPEN_RE, '{')\n .replace(ENC_CURLY_CLOSE_RE, '}')\n .replace(ENC_CARET_RE, '^');\n}\n/**\n * Encode characters that need to be encoded query values on the query\n * section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeQueryValue(text) {\n return (commonEncode(text)\n // Encode the space as +, encode the + to differentiate it from the space\n .replace(PLUS_RE, '%2B')\n .replace(ENC_SPACE_RE, '+')\n .replace(HASH_RE, '%23')\n .replace(AMPERSAND_RE, '%26')\n .replace(ENC_BACKTICK_RE, '`')\n .replace(ENC_CURLY_OPEN_RE, '{')\n .replace(ENC_CURLY_CLOSE_RE, '}')\n .replace(ENC_CARET_RE, '^'));\n}\n/**\n * Like `encodeQueryValue` but also encodes the `=` character.\n *\n * @param text - string to encode\n */\nfunction encodeQueryKey(text) {\n return encodeQueryValue(text).replace(EQUAL_RE, '%3D');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodePath(text) {\n return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL as a\n * param. This function encodes everything {@link encodePath} does plus the\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n * string instead.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeParam(text) {\n return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F');\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n try {\n return decodeURIComponent('' + text);\n }\n catch (err) {\n (process.env.NODE_ENV !== 'production') && warn(`Error decoding \"${text}\". Using original value`);\n }\n return '' + text;\n}\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, '');\n/**\n * Transforms a URI into a normalized history location\n *\n * @param parseQuery\n * @param location - URI to normalize\n * @param currentLocation - current absolute location. Allows resolving relative\n * paths. Must start with `/`. Defaults to `/`\n * @returns a normalized history location\n */\nfunction parseURL(parseQuery, location, currentLocation = '/') {\n let path, query = {}, searchString = '', hash = '';\n // Could use URL and URLSearchParams but IE 11 doesn't support it\n // TODO: move to new URL()\n const hashPos = location.indexOf('#');\n let searchPos = location.indexOf('?');\n // the hash appears before the search, so it's not part of the search string\n if (hashPos < searchPos && hashPos >= 0) {\n searchPos = -1;\n }\n if (searchPos > -1) {\n path = location.slice(0, searchPos);\n searchString = location.slice(searchPos + 1, hashPos > -1 ? hashPos : location.length);\n query = parseQuery(searchString);\n }\n if (hashPos > -1) {\n path = path || location.slice(0, hashPos);\n // keep the # character\n hash = location.slice(hashPos, location.length);\n }\n // no search and no query\n path = resolveRelativePath(path != null ? path : location, currentLocation);\n // empty path means a relative query or hash `?foo=f`, `#thing`\n return {\n fullPath: path + (searchString && '?') + searchString + hash,\n path,\n query,\n hash: decode(hash),\n };\n}\n/**\n * Stringifies a URL object\n *\n * @param stringifyQuery\n * @param location\n */\nfunction stringifyURL(stringifyQuery, location) {\n const query = location.query ? stringifyQuery(location.query) : '';\n return location.path + (query && '?') + query + (location.hash || '');\n}\n/**\n * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n *\n * @param pathname - location.pathname\n * @param base - base to strip off\n */\nfunction stripBase(pathname, base) {\n // no base or base is not found at the beginning\n if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))\n return pathname;\n return pathname.slice(base.length) || '/';\n}\n/**\n * Checks if two RouteLocation are equal. This means that both locations are\n * pointing towards the same {@link RouteRecord} and that all `params`, `query`\n * parameters and `hash` are the same\n *\n * @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n * @param a - first {@link RouteLocation}\n * @param b - second {@link RouteLocation}\n */\nfunction isSameRouteLocation(stringifyQuery, a, b) {\n const aLastIndex = a.matched.length - 1;\n const bLastIndex = b.matched.length - 1;\n return (aLastIndex > -1 &&\n aLastIndex === bLastIndex &&\n isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) &&\n isSameRouteLocationParams(a.params, b.params) &&\n stringifyQuery(a.query) === stringifyQuery(b.query) &&\n a.hash === b.hash);\n}\n/**\n * Check if two `RouteRecords` are equal. Takes into account aliases: they are\n * considered equal to the `RouteRecord` they are aliasing.\n *\n * @param a - first {@link RouteRecord}\n * @param b - second {@link RouteRecord}\n */\nfunction isSameRouteRecord(a, b) {\n // since the original record has an undefined value for aliasOf\n // but all aliases point to the original record, this will always compare\n // the original record\n return (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n if (Object.keys(a).length !== Object.keys(b).length)\n return false;\n for (const key in a) {\n if (!isSameRouteLocationParamsValue(a[key], b[key]))\n return false;\n }\n return true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n return isArray(a)\n ? isEquivalentArray(a, b)\n : isArray(b)\n ? isEquivalentArray(b, a)\n : a === b;\n}\n/**\n * Check if two arrays are the same or if an array with one single entry is the\n * same as another primitive value. Used to check query and parameters\n *\n * @param a - array of values\n * @param b - array of values or a single value\n */\nfunction isEquivalentArray(a, b) {\n return isArray(b)\n ? a.length === b.length && a.every((value, i) => value === b[i])\n : a.length === 1 && a[0] === b;\n}\n/**\n * Resolves a relative path that starts with `.`.\n *\n * @param to - path location we are resolving\n * @param from - currentLocation.path, should start with `/`\n */\nfunction resolveRelativePath(to, from) {\n if (to.startsWith('/'))\n return to;\n if ((process.env.NODE_ENV !== 'production') && !from.startsWith('/')) {\n warn(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n return to;\n }\n if (!to)\n return from;\n const fromSegments = from.split('/');\n const toSegments = to.split('/');\n const lastToSegment = toSegments[toSegments.length - 1];\n // make . and ./ the same (../ === .., ../../ === ../..)\n // this is the same behavior as new URL()\n if (lastToSegment === '..' || lastToSegment === '.') {\n toSegments.push('');\n }\n let position = fromSegments.length - 1;\n let toPosition;\n let segment;\n for (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n segment = toSegments[toPosition];\n // we stay on the same position\n if (segment === '.')\n continue;\n // go up in the from array\n if (segment === '..') {\n // we can't go below zero, but we still need to increment toPosition\n if (position > 1)\n position--;\n // continue\n }\n // we reached a non-relative path, we stop here\n else\n break;\n }\n return (fromSegments.slice(0, position).join('/') +\n '/' +\n toSegments.slice(toPosition).join('/'));\n}\n/**\n * Initial route location where the router is. Can be used in navigation guards\n * to differentiate the initial navigation.\n *\n * @example\n * ```js\n * import { START_LOCATION } from 'vue-router'\n *\n * router.beforeEach((to, from) => {\n * if (from === START_LOCATION) {\n * // initial navigation\n * }\n * })\n * ```\n */\nconst START_LOCATION_NORMALIZED = {\n path: '/',\n // TODO: could we use a symbol in the future?\n name: undefined,\n params: {},\n query: {},\n hash: '',\n fullPath: '/',\n matched: [],\n meta: {},\n redirectedFrom: undefined,\n};\n\nvar NavigationType;\n(function (NavigationType) {\n NavigationType[\"pop\"] = \"pop\";\n NavigationType[\"push\"] = \"push\";\n})(NavigationType || (NavigationType = {}));\nvar NavigationDirection;\n(function (NavigationDirection) {\n NavigationDirection[\"back\"] = \"back\";\n NavigationDirection[\"forward\"] = \"forward\";\n NavigationDirection[\"unknown\"] = \"\";\n})(NavigationDirection || (NavigationDirection = {}));\n/**\n * Starting location for Histories\n */\nconst START = '';\n// Generic utils\n/**\n * Normalizes a base by removing any trailing slash and reading the base tag if\n * present.\n *\n * @param base - base to normalize\n */\nfunction normalizeBase(base) {\n if (!base) {\n if (isBrowser) {\n // respect <base> tag\n const baseEl = document.querySelector('base');\n base = (baseEl && baseEl.getAttribute('href')) || '/';\n // strip full URL origin\n base = base.replace(/^\\w+:\\/\\/[^\\/]+/, '');\n }\n else {\n base = '/';\n }\n }\n // ensure leading slash when it was removed by the regex above avoid leading\n // slash with hash because the file could be read from the disk like file://\n // and the leading slash would cause problems\n if (base[0] !== '/' && base[0] !== '#')\n base = '/' + base;\n // remove the trailing slash so all other method can just do `base + fullPath`\n // to build an href\n return removeTrailingSlash(base);\n}\n// remove any character before the hash\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n return base.replace(BEFORE_HASH_RE, '#') + location;\n}\n\nfunction getElementPosition(el, offset) {\n const docRect = document.documentElement.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n return {\n behavior: offset.behavior,\n left: elRect.left - docRect.left - (offset.left || 0),\n top: elRect.top - docRect.top - (offset.top || 0),\n };\n}\nconst computeScrollPosition = () => ({\n left: window.scrollX,\n top: window.scrollY,\n});\nfunction scrollToPosition(position) {\n let scrollToOptions;\n if ('el' in position) {\n const positionEl = position.el;\n const isIdSelector = typeof positionEl === 'string' && positionEl.startsWith('#');\n /**\n * `id`s can accept pretty much any characters, including CSS combinators\n * like `>` or `~`. It's still possible to retrieve elements using\n * `document.getElementById('~')` but it needs to be escaped when using\n * `document.querySelector('#\\\\~')` for it to be valid. The only\n * requirements for `id`s are them to be unique on the page and to not be\n * empty (`id=\"\"`). Because of that, when passing an id selector, it should\n * be properly escaped for it to work with `querySelector`. We could check\n * for the id selector to be simple (no CSS combinators `+ >~`) but that\n * would make things inconsistent since they are valid characters for an\n * `id` but would need to be escaped when using `querySelector`, breaking\n * their usage and ending up in no selector returned. Selectors need to be\n * escaped:\n *\n * - `#1-thing` becomes `#\\31 -thing`\n * - `#with~symbols` becomes `#with\\\\~symbols`\n *\n * - More information about the topic can be found at\n * https://mathiasbynens.be/notes/html5-id-class.\n * - Practical example: https://mathiasbynens.be/demo/html5-id\n */\n if ((process.env.NODE_ENV !== 'production') && typeof position.el === 'string') {\n if (!isIdSelector || !document.getElementById(position.el.slice(1))) {\n try {\n const foundEl = document.querySelector(position.el);\n if (isIdSelector && foundEl) {\n warn(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n // return to avoid other warnings\n return;\n }\n }\n catch (err) {\n warn(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n // return to avoid other warnings\n return;\n }\n }\n }\n const el = typeof positionEl === 'string'\n ? isIdSelector\n ? document.getElementById(positionEl.slice(1))\n : document.querySelector(positionEl)\n : positionEl;\n if (!el) {\n (process.env.NODE_ENV !== 'production') &&\n warn(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n return;\n }\n scrollToOptions = getElementPosition(el, position);\n }\n else {\n scrollToOptions = position;\n }\n if ('scrollBehavior' in document.documentElement.style)\n window.scrollTo(scrollToOptions);\n else {\n window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.scrollX, scrollToOptions.top != null ? scrollToOptions.top : window.scrollY);\n }\n}\nfunction getScrollKey(path, delta) {\n const position = history.state ? history.state.position - delta : -1;\n return position + path;\n}\nconst scrollPositions = new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n scrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n const scroll = scrollPositions.get(key);\n // consume it so it's not used again\n scrollPositions.delete(key);\n return scroll;\n}\n// TODO: RFC about how to save scroll position\n/**\n * ScrollBehavior instance used by the router to compute and restore the scroll\n * position when navigating.\n */\n// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {\n// // returns a scroll position that can be saved in history\n// compute(): ScrollPositionEntry\n// // can take an extended ScrollPositionEntry\n// scroll(position: ScrollPosition): void\n// }\n// export const scrollHandler: ScrollHandler<ScrollPosition> = {\n// compute: computeScroll,\n// scroll: scrollToPosition,\n// }\n\nlet createBaseLocation = () => location.protocol + '//' + location.host;\n/**\n * Creates a normalized history location from a window.location object\n * @param base - The base path\n * @param location - The window.location object\n */\nfunction createCurrentLocation(base, location) {\n const { pathname, search, hash } = location;\n // allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end\n const hashPos = base.indexOf('#');\n if (hashPos > -1) {\n let slicePos = hash.includes(base.slice(hashPos))\n ? base.slice(hashPos).length\n : 1;\n let pathFromHash = hash.slice(slicePos);\n // prepend the starting slash to hash so the url starts with /#\n if (pathFromHash[0] !== '/')\n pathFromHash = '/' + pathFromHash;\n return stripBase(pathFromHash, '');\n }\n const path = stripBase(pathname, base);\n return path + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n let listeners = [];\n let teardowns = [];\n // TODO: should it be a stack? a Dict. Check if the popstate listener\n // can trigger twice\n let pauseState = null;\n const popStateHandler = ({ state, }) => {\n const to = createCurrentLocation(base, location);\n const from = currentLocation.value;\n const fromState = historyState.value;\n let delta = 0;\n if (state) {\n currentLocation.value = to;\n historyState.value = state;\n // ignore the popstate and reset the pauseState\n if (pauseState && pauseState === from) {\n pauseState = null;\n return;\n }\n delta = fromState ? state.position - fromState.position : 0;\n }\n else {\n replace(to);\n }\n // Here we could also revert the navigation by calling history.go(-delta)\n // this listener will have to be adapted to not trigger again and to wait for the url\n // to be updated before triggering the listeners. Some kind of validation function would also\n // need to be passed to the listeners so the navigation can be accepted\n // call all listeners\n listeners.forEach(listener => {\n listener(currentLocation.value, from, {\n delta,\n type: NavigationType.pop,\n direction: delta\n ? delta > 0\n ? NavigationDirection.forward\n : NavigationDirection.back\n : NavigationDirection.unknown,\n });\n });\n };\n function pauseListeners() {\n pauseState = currentLocation.value;\n }\n function listen(callback) {\n // set up the listener and prepare teardown callbacks\n listeners.push(callback);\n const teardown = () => {\n const index = listeners.indexOf(callback);\n if (index > -1)\n listeners.splice(index, 1);\n };\n teardowns.push(teardown);\n return teardown;\n }\n function beforeUnloadListener() {\n const { history } = window;\n if (!history.state)\n return;\n history.replaceState(assign({}, history.state, { scroll: computeScrollPosition() }), '');\n }\n function destroy() {\n for (const teardown of teardowns)\n teardown();\n teardowns = [];\n window.removeEventListener('popstate', popStateHandler);\n window.removeEventListener('beforeunload', beforeUnloadListener);\n }\n // set up the listeners and prepare teardown callbacks\n window.addEventListener('popstate', popStateHandler);\n // TODO: could we use 'pagehide' or 'visibilitychange' instead?\n // https://developer.chrome.com/blog/page-lifecycle-api/\n window.addEventListener('beforeunload', beforeUnloadListener, {\n passive: true,\n });\n return {\n pauseListeners,\n listen,\n destroy,\n };\n}\n/**\n * Creates a state object\n */\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n return {\n back,\n current,\n forward,\n replaced,\n position: window.history.length,\n scroll: computeScroll ? computeScrollPosition() : null,\n };\n}\nfunction useHistoryStateNavigation(base) {\n const { history, location } = window;\n // private variables\n const currentLocation = {\n value: createCurrentLocation(base, location),\n };\n const historyState = { value: history.state };\n // build current history entry as this is a fresh navigation\n if (!historyState.value) {\n changeLocation(currentLocation.value, {\n back: null,\n current: currentLocation.value,\n forward: null,\n // the length is off by one, we need to decrease it\n position: history.length - 1,\n replaced: true,\n // don't add a scroll as the user may have an anchor, and we want\n // scrollBehavior to be triggered without a saved position\n scroll: null,\n }, true);\n }\n function changeLocation(to, state, replace) {\n /**\n * if a base tag is provided, and we are on a normal domain, we have to\n * respect the provided `base` attribute because pushState() will use it and\n * potentially erase anything before the `#` like at\n * https://github.com/vuejs/router/issues/685 where a base of\n * `/folder/#` but a base of `/` would erase the `/folder/` section. If\n * there is no host, the `<base>` tag makes no sense and if there isn't a\n * base tag we can just use everything after the `#`.\n */\n const hashIndex = base.indexOf('#');\n const url = hashIndex > -1\n ? (location.host && document.querySelector('base')\n ? base\n : base.slice(hashIndex)) + to\n : createBaseLocation() + base + to;\n try {\n // BROWSER QUIRK\n // NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds\n history[replace ? 'replaceState' : 'pushState'](state, '', url);\n historyState.value = state;\n }\n catch (err) {\n if ((process.env.NODE_ENV !== 'production')) {\n warn('Error with push/replace State', err);\n }\n else {\n console.error(err);\n }\n // Force the navigation, this also resets the call count\n location[replace ? 'replace' : 'assign'](url);\n }\n }\n function replace(to, data) {\n const state = assign({}, history.state, buildState(historyState.value.back, \n // keep back and forward entries but override current position\n to, historyState.value.forward, true), data, { position: historyState.value.position });\n changeLocation(to, state, true);\n currentLocation.value = to;\n }\n function push(to, data) {\n // Add to current entry the information of where we are going\n // as well as saving the current position\n const currentState = assign({}, \n // use current history state to gracefully handle a wrong call to\n // history.replaceState\n // https://github.com/vuejs/router/issues/366\n historyState.value, history.state, {\n forward: to,\n scroll: computeScrollPosition(),\n });\n if ((process.env.NODE_ENV !== 'production') && !history.state) {\n warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\n` +\n `history.replaceState(history.state, '', url)\\n\\n` +\n `You can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state`);\n }\n changeLocation(currentState.current, currentState, true);\n const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);\n changeLocation(to, state, false);\n currentLocation.value = to;\n }\n return {\n location: currentLocation,\n state: historyState,\n push,\n replace,\n };\n}\n/**\n * Creates an HTML5 history. Most common history for single page applications.\n *\n * @param base -\n */\nfunction createWebHistory(base) {\n base = normalizeBase(base);\n const historyNavigation = useHistoryStateNavigation(base);\n const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n function go(delta, triggerListeners = true) {\n if (!triggerListeners)\n historyListeners.pauseListeners();\n history.go(delta);\n }\n const routerHistory = assign({\n // it's overridden right after\n location: '',\n base,\n go,\n createHref: createHref.bind(null, base),\n }, historyNavigation, historyListeners);\n Object.defineProperty(routerHistory, 'location', {\n enumerable: true,\n get: () => historyNavigation.location.value,\n });\n Object.defineProperty(routerHistory, 'state', {\n enumerable: true,\n get: () => historyNavigation.state.value,\n });\n return routerHistory;\n}\n\n/**\n * Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n * It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n *\n * @param base - Base applied to all urls, defaults to '/'\n * @returns a history object that can be passed to the router constructor\n */\nfunction createMemoryHistory(base = '') {\n let listeners = [];\n let queue = [START];\n let position = 0;\n base = normalizeBase(base);\n function setLocation(location) {\n position++;\n if (position !== queue.length) {\n // we are in the middle, we remove everything from here in the queue\n queue.splice(position);\n }\n queue.push(location);\n }\n function triggerListeners(to, from, { direction, delta }) {\n const info = {\n direction,\n delta,\n type: NavigationType.pop,\n };\n for (const callback of listeners) {\n callback(to, from, info);\n }\n }\n const routerHistory = {\n // rewritten by Object.defineProperty\n location: START,\n // TODO: should be kept in queue\n state: {},\n base,\n createHref: createHref.bind(null, base),\n replace(to) {\n // remove current entry and decrement position\n queue.splice(position--, 1);\n setLocation(to);\n },\n push(to, data) {\n setLocation(to);\n },\n listen(callback) {\n listeners.push(callback);\n return () => {\n const index = listeners.indexOf(callback);\n if (index > -1)\n listeners.splice(index, 1);\n };\n },\n destroy() {\n listeners = [];\n queue = [START];\n position = 0;\n },\n go(delta, shouldTrigger = true) {\n const from = this.location;\n const direction = \n // we are considering delta === 0 going forward, but in abstract mode\n // using 0 for the delta doesn't make sense like it does in html5 where\n // it reloads the page\n delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n position = Math.max(0, Math.min(position + delta, queue.length - 1));\n if (shouldTrigger) {\n triggerListeners(this.location, from, {\n direction,\n delta,\n });\n }\n },\n };\n Object.defineProperty(routerHistory, 'location', {\n enumerable: true,\n get: () => queue[position],\n });\n return routerHistory;\n}\n\n/**\n * Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n * handle any URL is not possible.\n *\n * @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n * in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n * calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n * after the `#`).\n *\n * @example\n * ```js\n * // at https://example.com/folder\n * createWebHashHistory() // gives a url of `https://example.com/folder#`\n * createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n * // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n * createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n * // you should avoid doing this because it changes the original url and breaks copying urls\n * createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n *\n * // at file:///usr/etc/folder/index.html\n * // for locations with no `host`, the base is ignored\n * createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n * ```\n */\nfunction createWebHashHistory(base) {\n // Make sure this implementation is fine in terms of encoding, specially for IE11\n // for `file://`, directly use the pathname and ignore the base\n // location.pathname contains an initial `/` even at the root: `https://example.com`\n base = location.host ? base || location.pathname + location.search : '';\n // allow the user to provide a `#` in the middle: `/base/#/app`\n if (!base.includes('#'))\n base += '#';\n if ((process.env.NODE_ENV !== 'production') && !base.endsWith('#/') && !base.endsWith('#')) {\n warn(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, '#')}\".`);\n }\n return createWebHistory(base);\n}\n\nfunction isRouteLocation(route) {\n return typeof route === 'string' || (route && typeof route === 'object');\n}\nfunction isRouteName(name) {\n return typeof name === 'string' || typeof name === 'symbol';\n}\n\nconst NavigationFailureSymbol = Symbol((process.env.NODE_ENV !== 'production') ? 'navigation failure' : '');\n/**\n * Enumeration with all possible types for navigation failures. Can be passed to\n * {@link isNavigationFailure} to check for specific failures.\n */\nvar NavigationFailureType;\n(function (NavigationFailureType) {\n /**\n * An aborted navigation is a navigation that failed because a navigation\n * guard returned `false` or called `next(false)`\n */\n NavigationFailureType[NavigationFailureType[\"aborted\"] = 4] = \"aborted\";\n /**\n * A cancelled navigation is a navigation that failed because a more recent\n * navigation finished started (not necessarily finished).\n */\n NavigationFailureType[NavigationFailureType[\"cancelled\"] = 8] = \"cancelled\";\n /**\n * A duplicated navigation is a navigation that failed because it was\n * initiated while already being at the exact same location.\n */\n NavigationFailureType[NavigationFailureType[\"duplicated\"] = 16] = \"duplicated\";\n})(NavigationFailureType || (NavigationFailureType = {}));\n// DEV only debug messages\nconst ErrorTypeMessages = {\n [1 /* ErrorTypes.MATCHER_NOT_FOUND */]({ location, currentLocation }) {\n return `No match for\\n ${JSON.stringify(location)}${currentLocation\n ? '\\nwhile being at\\n' + JSON.stringify(currentLocation)\n : ''}`;\n },\n [2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */]({ from, to, }) {\n return `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n },\n [4 /* ErrorTypes.NAVIGATION_ABORTED */]({ from, to }) {\n return `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n },\n [8 /* ErrorTypes.NAVIGATION_CANCELLED */]({ from, to }) {\n return `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n },\n [16 /* ErrorTypes.NAVIGATION_DUPLICATED */]({ from, to }) {\n return `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n },\n};\n/**\n * Creates a typed NavigationFailure object.\n * @internal\n * @param type - NavigationFailureType\n * @param params - { from, to }\n */\nfunction createRouterError(type, params) {\n // keep full error messages in cjs versions\n if ((process.env.NODE_ENV !== 'production') || !true) {\n return assign(new Error(ErrorTypeMessages[type](params)), {\n type,\n [NavigationFailureSymbol]: true,\n }, params);\n }\n else {\n return assign(new Error(), {\n type,\n [NavigationFailureSymbol]: true,\n }, params);\n }\n}\nfunction isNavigationFailure(error, type) {\n return (error instanceof Error &&\n NavigationFailureSymbol in error &&\n (type == null || !!(error.type & type)));\n}\nconst propertiesToLog = ['params', 'query', 'hash'];\nfunction stringifyRoute(to) {\n if (typeof to === 'string')\n return to;\n if (to.path != null)\n return to.path;\n const location = {};\n for (const key of propertiesToLog) {\n if (key in to)\n location[key] = to[key];\n }\n return JSON.stringify(location, null, 2);\n}\n\n// default pattern for a param: non-greedy everything but /\nconst BASE_PARAM_PATTERN = '[^/]+?';\nconst BASE_PATH_PARSER_OPTIONS = {\n sensitive: false,\n strict: false,\n start: true,\n end: true,\n};\n// Special Regex characters that must be escaped in static tokens\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n * Creates a path parser from an array of Segments (a segment is an array of Tokens)\n *\n * @param segments - array of segments returned by tokenizePath\n * @param extraOptions - optional options for the regexp\n * @returns a PathParser\n */\nfunction tokensToParser(segments, extraOptions) {\n const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n // the amount of scores is the same as the length of segments except for the root segment \"/\"\n const score = [];\n // the regexp as a string\n let pattern = options.start ? '^' : '';\n // extracted keys\n const keys = [];\n for (const segment of segments) {\n // the root segment needs special treatment\n const segmentScores = segment.length ? [] : [90 /* PathScore.Root */];\n // allow trailing slash\n if (options.strict && !segment.length)\n pattern += '/';\n for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n const token = segment[tokenIndex];\n // resets the score if we are inside a sub-segment /:a-other-:b\n let subSegmentScore = 40 /* PathScore.Segment */ +\n (options.sensitive ? 0.25 /* PathScore.BonusCaseSensitive */ : 0);\n if (token.type === 0 /* TokenType.Static */) {\n // prepend the slash if we are starting a new segment\n if (!tokenIndex)\n pattern += '/';\n pattern += token.value.replace(REGEX_CHARS_RE, '\\\\$&');\n subSegmentScore += 40 /* PathScore.Static */;\n }\n else if (token.type === 1 /* TokenType.Param */) {\n const { value, repeatable, optional, regexp } = token;\n keys.push({\n name: value,\n repeatable,\n optional,\n });\n const re = regexp ? regexp : BASE_PARAM_PATTERN;\n // the user provided a custom regexp /:id(\\\\d+)\n if (re !== BASE_PARAM_PATTERN) {\n subSegmentScore += 10 /* PathScore.BonusCustomRegExp */;\n // make sure the regexp is valid before using it\n try {\n new RegExp(`(${re})`);\n }\n catch (err) {\n throw new Error(`Invalid custom RegExp for param \"${value}\" (${re}): ` +\n err.message);\n }\n }\n // when we repeat we must take care of the repeating leading slash\n let subPattern = repeatable ? `((?:${re})(?:/(?:${re}))*)` : `(${re})`;\n // prepend the slash if we are starting a new segment\n if (!tokenIndex)\n subPattern =\n // avoid an optional / if there are more segments e.g. /:p?-static\n // or /:p?-:p2\n optional && segment.length < 2\n ? `(?:/${subPattern})`\n : '/' + subPattern;\n if (optional)\n subPattern += '?';\n pattern += subPattern;\n subSegmentScore += 20 /* PathScore.Dynamic */;\n if (optional)\n subSegmentScore += -8 /* PathScore.BonusOptional */;\n if (repeatable)\n subSegmentScore += -20 /* PathScore.BonusRepeatable */;\n if (re === '.*')\n subSegmentScore += -50 /* PathScore.BonusWildcard */;\n }\n segmentScores.push(subSegmentScore);\n }\n // an empty array like /home/ -> [[{home}], []]\n // if (!segment.length) pattern += '/'\n score.push(segmentScores);\n }\n // only apply the strict bonus to the last score\n if (options.strict && options.end) {\n const i = score.length - 1;\n score[i][score[i].length - 1] += 0.7000000000000001 /* PathScore.BonusStrict */;\n }\n // TODO: dev only warn double trailing slash\n if (!options.strict)\n pattern += '/?';\n if (options.end)\n pattern += '$';\n // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else\n else if (options.strict)\n pattern += '(?:/|$)';\n const re = new RegExp(pattern, options.sensitive ? '' : 'i');\n function parse(path) {\n const match = path.match(re);\n const params = {};\n if (!match)\n return null;\n for (let i = 1; i < match.length; i++) {\n const value = match[i] || '';\n const key = keys[i - 1];\n params[key.name] = value && key.repeatable ? value.split('/') : value;\n }\n return params;\n }\n function stringify(params) {\n let path = '';\n // for optional parameters to allow to be empty\n let avoidDuplicatedSlash = false;\n for (const segment of segments) {\n if (!avoidDuplicatedSlash || !path.endsWith('/'))\n path += '/';\n avoidDuplicatedSlash = false;\n for (const token of segment) {\n if (token.type === 0 /* TokenType.Static */) {\n path += token.value;\n }\n else if (token.type === 1 /* TokenType.Param */) {\n const { value, repeatable, optional } = token;\n const param = value in params ? params[value] : '';\n if (isArray(param) && !repeatable) {\n throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n }\n const text = isArray(param)\n ? param.join('/')\n : param;\n if (!text) {\n if (optional) {\n // if we have more than one optional param like /:a?-static we don't need to care about the optional param\n if (segment.length < 2) {\n // remove the last slash as we could be at the end\n if (path.endsWith('/'))\n path = path.slice(0, -1);\n // do not append a slash on the next iteration\n else\n avoidDuplicatedSlash = true;\n }\n }\n else\n throw new Error(`Missing required param \"${value}\"`);\n }\n path += text;\n }\n }\n }\n // avoid empty path when we have multiple optional params\n return path || '/';\n }\n return {\n re,\n score,\n keys,\n parse,\n stringify,\n };\n}\n/**\n * Compares an array of numbers as used in PathParser.score and returns a\n * number. This function can be used to `sort` an array\n *\n * @param a - first array of numbers\n * @param b - second array of numbers\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n * should be sorted first\n */\nfunction compareScoreArray(a, b) {\n let i = 0;\n while (i < a.length && i < b.length) {\n const diff = b[i] - a[i];\n // only keep going if diff === 0\n if (diff)\n return diff;\n i++;\n }\n // if the last subsegment was Static, the shorter segments should be sorted first\n // otherwise sort the longest segment first\n if (a.length < b.length) {\n return a.length === 1 && a[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n ? -1\n : 1;\n }\n else if (a.length > b.length) {\n return b.length === 1 && b[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n ? 1\n : -1;\n }\n return 0;\n}\n/**\n * Compare function that can be used with `sort` to sort an array of PathParser\n *\n * @param a - first PathParser\n * @param b - second PathParser\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n */\nfunction comparePathParserScore(a, b) {\n let i = 0;\n const aScore = a.score;\n const bScore = b.score;\n while (i < aScore.length && i < bScore.length) {\n const comp = compareScoreArray(aScore[i], bScore[i]);\n // do not return if both are equal\n if (comp)\n return comp;\n i++;\n }\n if (Math.abs(bScore.length - aScore.length) === 1) {\n if (isLastScoreNegative(aScore))\n return 1;\n if (isLastScoreNegative(bScore))\n return -1;\n }\n // if a and b share the same score entries but b has more, sort b first\n return bScore.length - aScore.length;\n // this is the ternary version\n // return aScore.length < bScore.length\n // ? 1\n // : aScore.length > bScore.length\n // ? -1\n // : 0\n}\n/**\n * This allows detecting splats at the end of a path: /home/:id(.*)*\n *\n * @param score - score to check\n * @returns true if the last entry is negative\n */\nfunction isLastScoreNegative(score) {\n const last = score[score.length - 1];\n return score.length > 0 && last[last.length - 1] < 0;\n}\n\nconst ROOT_TOKEN = {\n type: 0 /* TokenType.Static */,\n value: '',\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\n// After some profiling, the cache seems to be unnecessary because tokenizePath\n// (the slowest part of adding a route) is very fast\n// const tokenCache = new Map<string, Token[][]>()\nfunction tokenizePath(path) {\n if (!path)\n return [[]];\n if (path === '/')\n return [[ROOT_TOKEN]];\n if (!path.startsWith('/')) {\n throw new Error((process.env.NODE_ENV !== 'production')\n ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".`\n : `Invalid path \"${path}\"`);\n }\n // if (tokenCache.has(path)) return tokenCache.get(path)!\n function crash(message) {\n throw new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n }\n let state = 0 /* TokenizerState.Static */;\n let previousState = state;\n const tokens = [];\n // the segment will always be valid because we get into the initial state\n // with the leading /\n let segment;\n function finalizeSegment() {\n if (segment)\n tokens.push(segment);\n segment = [];\n }\n // index on the path\n let i = 0;\n // char at index\n let char;\n // buffer of the value read\n let buffer = '';\n // custom regexp for a param\n let customRe = '';\n function consumeBuffer() {\n if (!buffer)\n return;\n if (state === 0 /* TokenizerState.Static */) {\n segment.push({\n type: 0 /* TokenType.Static */,\n value: buffer,\n });\n }\n else if (state === 1 /* TokenizerState.Param */ ||\n state === 2 /* TokenizerState.ParamRegExp */ ||\n state === 3 /* TokenizerState.ParamRegExpEnd */) {\n if (segment.length > 1 && (char === '*' || char === '+'))\n crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n segment.push({\n type: 1 /* TokenType.Param */,\n value: buffer,\n regexp: customRe,\n repeatable: char === '*' || char === '+',\n optional: char === '*' || char === '?',\n });\n }\n else {\n crash('Invalid state to consume buffer');\n }\n buffer = '';\n }\n function addCharToBuffer() {\n buffer += char;\n }\n while (i < path.length) {\n char = path[i++];\n if (char === '\\\\' && state !== 2 /* TokenizerState.ParamRegExp */) {\n previousState = state;\n state = 4 /* TokenizerState.EscapeNext */;\n continue;\n }\n switch (state) {\n case 0 /* TokenizerState.Static */:\n if (char === '/') {\n if (buffer) {\n consumeBuffer();\n }\n finalizeSegment();\n }\n else if (char === ':') {\n consumeBuffer();\n state = 1 /* TokenizerState.Param */;\n }\n else {\n addCharToBuffer();\n }\n break;\n case 4 /* TokenizerState.EscapeNext */:\n addCharToBuffer();\n state = previousState;\n break;\n case 1 /* TokenizerState.Param */:\n if (char === '(') {\n state = 2 /* TokenizerState.ParamRegExp */;\n }\n else if (VALID_PARAM_RE.test(char)) {\n addCharToBuffer();\n }\n else {\n consumeBuffer();\n state = 0 /* TokenizerState.Static */;\n // go back one character if we were not modifying\n if (char !== '*' && char !== '?' && char !== '+')\n i--;\n }\n break;\n case 2 /* TokenizerState.ParamRegExp */:\n // TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)\n // it already works by escaping the closing )\n // https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#\n // is this really something people need since you can also write\n // /prefix_:p()_suffix\n if (char === ')') {\n // handle the escaped )\n if (customRe[customRe.length - 1] == '\\\\')\n customRe = customRe.slice(0, -1) + char;\n else\n state = 3 /* TokenizerState.ParamRegExpEnd */;\n }\n else {\n customRe += char;\n }\n break;\n case 3 /* TokenizerState.ParamRegExpEnd */:\n // same as finalizing a param\n consumeBuffer();\n state = 0 /* TokenizerState.Static */;\n // go back one character if we were not modifying\n if (char !== '*' && char !== '?' && char !== '+')\n i--;\n customRe = '';\n break;\n default:\n crash('Unknown state');\n break;\n }\n }\n if (state === 2 /* TokenizerState.ParamRegExp */)\n crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n consumeBuffer();\n finalizeSegment();\n // tokenCache.set(path, tokens)\n return tokens;\n}\n\nfunction createRouteRecordMatcher(record, parent, options) {\n const parser = tokensToParser(tokenizePath(record.path), options);\n // warn against params with the same name\n if ((process.env.NODE_ENV !== 'production')) {\n const existingKeys = new Set();\n for (const key of parser.keys) {\n if (existingKeys.has(key.name))\n warn(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n existingKeys.add(key.name);\n }\n }\n const matcher = assign(parser, {\n record,\n parent,\n // these needs to be populated by the parent\n children: [],\n alias: [],\n });\n if (parent) {\n // both are aliases or both are not aliases\n // we don't want to mix them because the order is used when\n // passing originalRecord in Matcher.addRoute\n if (!matcher.record.aliasOf === !parent.record.aliasOf)\n parent.children.push(matcher);\n }\n return matcher;\n}\n\n/**\n * Creates a Router Matcher.\n *\n * @internal\n * @param routes - array of initial routes\n * @param globalOptions - global route options\n */\nfunction createRouterMatcher(routes, globalOptions) {\n // normalized ordered array of matchers\n const matchers = [];\n const matcherMap = new Map();\n globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);\n function getRecordMatcher(name) {\n return matcherMap.get(name);\n }\n function addRoute(record, parent, originalRecord) {\n // used later on to remove by name\n const isRootAdd = !originalRecord;\n const mainNormalizedRecord = normalizeRouteRecord(record);\n if ((process.env.NODE_ENV !== 'production')) {\n checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n }\n // we might be the child of an alias\n mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n const options = mergeOptions(globalOptions, record);\n // generate an array of records to correctly handle aliases\n const normalizedRecords = [\n mainNormalizedRecord,\n ];\n if ('alias' in record) {\n const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias;\n for (const alias of aliases) {\n normalizedRecords.push(assign({}, mainNormalizedRecord, {\n // this allows us to hold a copy of the `components` option\n // so that async components cache is hold on the original record\n components: originalRecord\n ? originalRecord.record.components\n : mainNormalizedRecord.components,\n path: alias,\n // we might be the child of an alias\n aliasOf: originalRecord\n ? originalRecord.record\n : mainNormalizedRecord,\n // the aliases are always of the same kind as the original since they\n // are defined on the same record\n }));\n }\n }\n let matcher;\n let originalMatcher;\n for (const normalizedRecord of normalizedRecords) {\n const { path } = normalizedRecord;\n // Build up the path for nested routes if the child isn't an absolute\n // route. Only add the / delimiter if the child path isn't empty and if the\n // parent path doesn't have a trailing slash\n if (parent && path[0] !== '/') {\n const parentPath = parent.record.path;\n const connectingSlash = parentPath[parentPath.length - 1] === '/' ? '' : '/';\n normalizedRecord.path =\n parent.record.path + (path && connectingSlash + path);\n }\n if ((process.env.NODE_ENV !== 'production') && normalizedRecord.path === '*') {\n throw new Error('Catch all routes (\"*\") must now be defined using a param with a custom regexp.\\n' +\n 'See more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.');\n }\n // create the object beforehand, so it can be passed to children\n matcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n if ((process.env.NODE_ENV !== 'production') && parent && path[0] === '/')\n checkMissingParamsInAbsolutePath(matcher, parent);\n // if we are an alias we must tell the original record that we exist,\n // so we can be removed\n if (originalRecord) {\n originalRecord.alias.push(matcher);\n if ((process.env.NODE_ENV !== 'production')) {\n checkSameParams(originalRecord, matcher);\n }\n }\n else {\n // otherwise, the first record is the original and others are aliases\n originalMatcher = originalMatcher || matcher;\n if (originalMatcher !== matcher)\n originalMatcher.alias.push(matcher);\n // remove the route if named and only for the top record (avoid in nested calls)\n // this works because the original record is the first one\n if (isRootAdd && record.name && !isAliasRecord(matcher))\n removeRoute(record.name);\n }\n // Avoid adding a record that doesn't display anything. This allows passing through records without a component to\n // not be reached and pass through the catch all route\n if (isMatchable(matcher)) {\n insertMatcher(matcher);\n }\n if (mainNormalizedRecord.children) {\n const children = mainNormalizedRecord.children;\n for (let i = 0; i < children.length; i++) {\n addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n }\n }\n // if there was no original record, then the first one was not an alias and all\n // other aliases (if any) need to reference this record when adding children\n originalRecord = originalRecord || matcher;\n // TODO: add normalized records for more flexibility\n // if (parent && isAliasRecord(originalRecord)) {\n // parent.children.push(originalRecord)\n // }\n }\n return originalMatcher\n ? () => {\n // since other matchers are aliases, they should be removed by the original matcher\n removeRoute(originalMatcher);\n }\n : noop;\n }\n function removeRoute(matcherRef) {\n if (isRouteName(matcherRef)) {\n const matcher = matcherMap.get(matcherRef);\n if (matcher) {\n matcherMap.delete(matcherRef);\n matchers.splice(matchers.indexOf(matcher), 1);\n matcher.children.forEach(removeRoute);\n matcher.alias.forEach(removeRoute);\n }\n }\n else {\n const index = matchers.indexOf(matcherRef);\n if (index > -1) {\n matchers.splice(index, 1);\n if (matcherRef.record.name)\n matcherMap.delete(matcherRef.record.name);\n matcherRef.children.forEach(removeRoute);\n matcherRef.alias.forEach(removeRoute);\n }\n }\n }\n function getRoutes() {\n return matchers;\n }\n function insertMatcher(matcher) {\n const index = findInsertionIndex(matcher, matchers);\n matchers.splice(index, 0, matcher);\n // only add the original record to the name map\n if (matcher.record.name && !isAliasRecord(matcher))\n matcherMap.set(matcher.record.name, matcher);\n }\n function resolve(location, currentLocation) {\n let matcher;\n let params = {};\n let path;\n let name;\n if ('name' in location && location.name) {\n matcher = matcherMap.get(location.name);\n if (!matcher)\n throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n location,\n });\n // warn if the user is passing invalid params so they can debug it better when they get removed\n if ((process.env.NODE_ENV !== 'production')) {\n const invalidParams = Object.keys(location.params || {}).filter(paramName => !matcher.keys.find(k => k.name === paramName));\n if (invalidParams.length) {\n warn(`Discarded invalid param(s) \"${invalidParams.join('\", \"')}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n }\n }\n name = matcher.record.name;\n params = assign(\n // paramsFromLocation is a new object\n paramsFromLocation(currentLocation.params, \n // only keep params that exist in the resolved location\n // only keep optional params coming from a parent record\n matcher.keys\n .filter(k => !k.optional)\n .concat(matcher.parent ? matcher.parent.keys.filter(k => k.optional) : [])\n .map(k => k.name)), \n // discard any existing params in the current location that do not exist here\n // #1497 this ensures better active/exact matching\n location.params &&\n paramsFromLocation(location.params, matcher.keys.map(k => k.name)));\n // throws if cannot be stringified\n path = matcher.stringify(params);\n }\n else if (location.path != null) {\n // no need to resolve the path with the matcher as it was provided\n // this also allows the user to control the encoding\n path = location.path;\n if ((process.env.NODE_ENV !== 'production') && !path.startsWith('/')) {\n warn(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n }\n matcher = matchers.find(m => m.re.test(path));\n // matcher should have a value after the loop\n if (matcher) {\n // we know the matcher works because we tested the regexp\n params = matcher.parse(path);\n name = matcher.record.name;\n }\n // location is a relative path\n }\n else {\n // match by name or path of current route\n matcher = currentLocation.name\n ? matcherMap.get(currentLocation.name)\n : matchers.find(m => m.re.test(currentLocation.path));\n if (!matcher)\n throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n location,\n currentLocation,\n });\n name = matcher.record.name;\n // since we are navigating to the same location, we don't need to pick the\n // params like when `name` is provided\n params = assign({}, currentLocation.params, location.params);\n path = matcher.stringify(params);\n }\n const matched = [];\n let parentMatcher = matcher;\n while (parentMatcher) {\n // reversed order so parents are at the beginning\n matched.unshift(parentMatcher.record);\n parentMatcher = parentMatcher.parent;\n }\n return {\n name,\n path,\n params,\n matched,\n meta: mergeMetaFields(matched),\n };\n }\n // add initial routes\n routes.forEach(route => addRoute(route));\n function clearRoutes() {\n matchers.length = 0;\n matcherMap.clear();\n }\n return {\n addRoute,\n resolve,\n removeRoute,\n clearRoutes,\n getRoutes,\n getRecordMatcher,\n };\n}\nfunction paramsFromLocation(params, keys) {\n const newParams = {};\n for (const key of keys) {\n if (key in params)\n newParams[key] = params[key];\n }\n return newParams;\n}\n/**\n * Normalizes a RouteRecordRaw. Creates a copy\n *\n * @param record\n * @returns the normalized version\n */\nfunction normalizeRouteRecord(record) {\n return {\n path: record.path,\n redirect: record.redirect,\n name: record.name,\n meta: record.meta || {},\n aliasOf: undefined,\n beforeEnter: record.beforeEnter,\n props: normalizeRecordProps(record),\n children: record.children || [],\n instances: {},\n leaveGuards: new Set(),\n updateGuards: new Set(),\n enterCallbacks: {},\n components: 'components' in record\n ? record.components || null\n : record.component && { default: record.component },\n };\n}\n/**\n * Normalize the optional `props` in a record to always be an object similar to\n * components. Also accept a boolean for components.\n * @param record\n */\nfunction normalizeRecordProps(record) {\n const propsObject = {};\n // props does not exist on redirect records, but we can set false directly\n const props = record.props || false;\n if ('component' in record) {\n propsObject.default = props;\n }\n else {\n // NOTE: we could also allow a function to be applied to every component.\n // Would need user feedback for use cases\n for (const name in record.components)\n propsObject[name] = typeof props === 'object' ? props[name] : props;\n }\n return propsObject;\n}\n/**\n * Checks if a record or any of its parent is an alias\n * @param record\n */\nfunction isAliasRecord(record) {\n while (record) {\n if (record.record.aliasOf)\n return true;\n record = record.parent;\n }\n return false;\n}\n/**\n * Merge meta fields of an array of records\n *\n * @param matched - array of matched records\n */\nfunction mergeMetaFields(matched) {\n return matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction mergeOptions(defaults, partialOptions) {\n const options = {};\n for (const key in defaults) {\n options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n }\n return options;\n}\nfunction isSameParam(a, b) {\n return (a.name === b.name &&\n a.optional === b.optional &&\n a.repeatable === b.repeatable);\n}\n/**\n * Check if a path and its alias have the same required params\n *\n * @param a - original record\n * @param b - alias record\n */\nfunction checkSameParams(a, b) {\n for (const key of a.keys) {\n if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))\n return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n }\n for (const key of b.keys) {\n if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))\n return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n }\n}\n/**\n * A route with a name and a child with an empty path without a name should warn when adding the route\n *\n * @param mainNormalizedRecord - RouteRecordNormalized\n * @param parent - RouteRecordMatcher\n */\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n if (parent &&\n parent.record.name &&\n !mainNormalizedRecord.name &&\n !mainNormalizedRecord.path) {\n warn(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n }\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n for (const key of parent.keys) {\n if (!record.keys.find(isSameParam.bind(null, key)))\n return warn(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n }\n}\n/**\n * Performs a binary search to find the correct insertion index for a new matcher.\n *\n * Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships,\n * with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes.\n *\n * @param matcher - new matcher to be inserted\n * @param matchers - existing matchers\n */\nfunction findInsertionIndex(matcher, matchers) {\n // First phase: binary search based on score\n let lower = 0;\n let upper = matchers.length;\n while (lower !== upper) {\n const mid = (lower + upper) >> 1;\n const sortOrder = comparePathParserScore(matcher, matchers[mid]);\n if (sortOrder < 0) {\n upper = mid;\n }\n else {\n lower = mid + 1;\n }\n }\n // Second phase: check for an ancestor with the same score\n const insertionAncestor = getInsertionAncestor(matcher);\n if (insertionAncestor) {\n upper = matchers.lastIndexOf(insertionAncestor, upper - 1);\n if ((process.env.NODE_ENV !== 'production') && upper < 0) {\n // This should never happen\n warn(`Finding ancestor route \"${insertionAncestor.record.path}\" failed for \"${matcher.record.path}\"`);\n }\n }\n return upper;\n}\nfunction getInsertionAncestor(matcher) {\n let ancestor = matcher;\n while ((ancestor = ancestor.parent)) {\n if (isMatchable(ancestor) &&\n comparePathParserScore(matcher, ancestor) === 0) {\n return ancestor;\n }\n }\n return;\n}\n/**\n * Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without\n * a component, or name, or redirect, are just used to group other routes.\n * @param matcher\n * @param matcher.record record of the matcher\n * @returns\n */\nfunction isMatchable({ record }) {\n return !!(record.name ||\n (record.components && Object.keys(record.components).length) ||\n record.redirect);\n}\n\n/**\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n * version with the leading `?` and without Should work as URLSearchParams\n\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n const query = {};\n // avoid creating an object with an empty key and empty value\n // because of split('&')\n if (search === '' || search === '?')\n return query;\n const hasLeadingIM = search[0] === '?';\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n for (let i = 0; i < searchParams.length; ++i) {\n // pre decode the + into space\n const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n // allow the = character\n const eqPos = searchParam.indexOf('=');\n const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n if (key in query) {\n // an extra variable for ts types\n let currentValue = query[key];\n if (!isArray(currentValue)) {\n currentValue = query[key] = [currentValue];\n }\n currentValue.push(value);\n }\n else {\n query[key] = value;\n }\n }\n return query;\n}\n/**\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n * doesn't prepend a `?`\n *\n * @internal\n *\n * @param query - query object to stringify\n * @returns string version of the query without the leading `?`\n */\nfunction stringifyQuery(query) {\n let search = '';\n for (let key in query) {\n const value = query[key];\n key = encodeQueryKey(key);\n if (value == null) {\n // only null adds the value\n if (value !== undefined) {\n search += (search.length ? '&' : '') + key;\n }\n continue;\n }\n // keep null values\n const values = isArray(value)\n ? value.map(v => v && encodeQueryValue(v))\n : [value && encodeQueryValue(value)];\n values.forEach(value => {\n // skip undefined values in arrays as if they were not present\n // smaller code than using filter\n if (value !== undefined) {\n // only append & with non-empty search\n search += (search.length ? '&' : '') + key;\n if (value != null)\n search += '=' + value;\n }\n });\n }\n return search;\n}\n/**\n * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n * numbers into strings, removing keys with an undefined value and replacing\n * undefined with null in arrays\n *\n * @param query - query object to normalize\n * @returns a normalized query object\n */\nfunction normalizeQuery(query) {\n const normalizedQuery = {};\n for (const key in query) {\n const value = query[key];\n if (value !== undefined) {\n normalizedQuery[key] = isArray(value)\n ? value.map(v => (v == null ? null : '' + v))\n : value == null\n ? value\n : '' + value;\n }\n }\n return normalizedQuery;\n}\n\n/**\n * RouteRecord being rendered by the closest ancestor Router View. Used for\n * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n * Location Matched\n *\n * @internal\n */\nconst matchedRouteKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location matched' : '');\n/**\n * Allows overriding the router view depth to control which component in\n * `matched` is rendered. rvd stands for Router View Depth\n *\n * @internal\n */\nconst viewDepthKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view depth' : '');\n/**\n * Allows overriding the router instance returned by `useRouter` in tests. r\n * stands for router\n *\n * @internal\n */\nconst routerKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router' : '');\n/**\n * Allows overriding the current route returned by `useRoute` in tests. rl\n * stands for route location\n *\n * @internal\n */\nconst routeLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'route location' : '');\n/**\n * Allows overriding the current route used by router-view. Internally this is\n * used when the `route` prop is passed.\n *\n * @internal\n */\nconst routerViewLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location' : '');\n\n/**\n * Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n */\nfunction useCallbacks() {\n let handlers = [];\n function add(handler) {\n handlers.push(handler);\n return () => {\n const i = handlers.indexOf(handler);\n if (i > -1)\n handlers.splice(i, 1);\n };\n }\n function reset() {\n handlers = [];\n }\n return {\n add,\n list: () => handlers.slice(),\n reset,\n };\n}\n\nfunction registerGuard(record, name, guard) {\n const removeFromList = () => {\n record[name].delete(guard);\n };\n onUnmounted(removeFromList);\n onDeactivated(removeFromList);\n onActivated(() => {\n record[name].add(guard);\n });\n record[name].add(guard);\n}\n/**\n * Add a navigation guard that triggers whenever the component for the current\n * location is about to be left. Similar to {@link beforeRouteLeave} but can be\n * used in any component. The guard is removed when the component is unmounted.\n *\n * @param leaveGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteLeave(leaveGuard) {\n if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n warn('getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function');\n return;\n }\n const activeRecord = inject(matchedRouteKey, \n // to avoid warning\n {}).value;\n if (!activeRecord) {\n (process.env.NODE_ENV !== 'production') &&\n warn('No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n return;\n }\n registerGuard(activeRecord, 'leaveGuards', leaveGuard);\n}\n/**\n * Add a navigation guard that triggers whenever the current location is about\n * to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n * component. The guard is removed when the component is unmounted.\n *\n * @param updateGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteUpdate(updateGuard) {\n if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n warn('getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function');\n return;\n }\n const activeRecord = inject(matchedRouteKey, \n // to avoid warning\n {}).value;\n if (!activeRecord) {\n (process.env.NODE_ENV !== 'production') &&\n warn('No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n return;\n }\n registerGuard(activeRecord, 'updateGuards', updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name, runWithContext = fn => fn()) {\n // keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place\n const enterCallbackArray = record &&\n // name is defined if record is because of the function overload\n (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n return () => new Promise((resolve, reject) => {\n const next = (valid) => {\n if (valid === false) {\n reject(createRouterError(4 /* ErrorTypes.NAVIGATION_ABORTED */, {\n from,\n to,\n }));\n }\n else if (valid instanceof Error) {\n reject(valid);\n }\n else if (isRouteLocation(valid)) {\n reject(createRouterError(2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */, {\n from: to,\n to: valid,\n }));\n }\n else {\n if (enterCallbackArray &&\n // since enterCallbackArray is truthy, both record and name also are\n record.enterCallbacks[name] === enterCallbackArray &&\n typeof valid === 'function') {\n enterCallbackArray.push(valid);\n }\n resolve();\n }\n };\n // wrapping with Promise.resolve allows it to work with both async and sync guards\n const guardReturn = runWithContext(() => guard.call(record && record.instances[name], to, from, (process.env.NODE_ENV !== 'production') ? canOnlyBeCalledOnce(next, to, from) : next));\n let guardCall = Promise.resolve(guardReturn);\n if (guard.length < 3)\n guardCall = guardCall.then(next);\n if ((process.env.NODE_ENV !== 'production') && guard.length > 2) {\n const message = `The \"next\" callback was never called inside of ${guard.name ? '\"' + guard.name + '\"' : ''}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n if (typeof guardReturn === 'object' && 'then' in guardReturn) {\n guardCall = guardCall.then(resolvedValue => {\n // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n if (!next._called) {\n warn(message);\n return Promise.reject(new Error('Invalid navigation guard'));\n }\n return resolvedValue;\n });\n }\n else if (guardReturn !== undefined) {\n // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n if (!next._called) {\n warn(message);\n reject(new Error('Invalid navigation guard'));\n return;\n }\n }\n }\n guardCall.catch(err => reject(err));\n });\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n let called = 0;\n return function () {\n if (called++ === 1)\n warn(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n // @ts-expect-error: we put it in the original one because it's easier to check\n next._called = true;\n if (called === 1)\n next.apply(null, arguments);\n };\n}\nfunction extractComponentsGuards(matched, guardType, to, from, runWithContext = fn => fn()) {\n const guards = [];\n for (const record of matched) {\n if ((process.env.NODE_ENV !== 'production') && !record.components && !record.children.length) {\n warn(`Record with path \"${record.path}\" is either missing a \"component(s)\"` +\n ` or \"children\" property.`);\n }\n for (const name in record.components) {\n let rawComponent = record.components[name];\n if ((process.env.NODE_ENV !== 'production')) {\n if (!rawComponent ||\n (typeof rawComponent !== 'object' &&\n typeof rawComponent !== 'function')) {\n warn(`Component \"${name}\" in record with path \"${record.path}\" is not` +\n ` a valid component. Received \"${String(rawComponent)}\".`);\n // throw to ensure we stop here but warn to ensure the message isn't\n // missed by the user\n throw new Error('Invalid route component');\n }\n else if ('then' in rawComponent) {\n // warn if user wrote import('/component.vue') instead of () =>\n // import('./component.vue')\n warn(`Component \"${name}\" in record with path \"${record.path}\" is a ` +\n `Promise instead of a function that returns a Promise. Did you ` +\n `write \"import('./MyPage.vue')\" instead of ` +\n `\"() => import('./MyPage.vue')\" ? This will break in ` +\n `production if not fixed.`);\n const promise = rawComponent;\n rawComponent = () => promise;\n }\n else if (rawComponent.__asyncLoader &&\n // warn only once per component\n !rawComponent.__warnedDefineAsync) {\n rawComponent.__warnedDefineAsync = true;\n warn(`Component \"${name}\" in record with path \"${record.path}\" is defined ` +\n `using \"defineAsyncComponent()\". ` +\n `Write \"() => import('./MyPage.vue')\" instead of ` +\n `\"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n }\n }\n // skip update and leave guards if the route component is not mounted\n if (guardType !== 'beforeRouteEnter' && !record.instances[name])\n continue;\n if (isRouteComponent(rawComponent)) {\n // __vccOpts is added by vue-class-component and contain the regular options\n const options = rawComponent.__vccOpts || rawComponent;\n const guard = options[guardType];\n guard &&\n guards.push(guardToPromiseFn(guard, to, from, record, name, runWithContext));\n }\n else {\n // start requesting the chunk already\n let componentPromise = rawComponent();\n if ((process.env.NODE_ENV !== 'production') && !('catch' in componentPromise)) {\n warn(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n componentPromise = Promise.resolve(componentPromise);\n }\n guards.push(() => componentPromise.then(resolved => {\n if (!resolved)\n return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`));\n const resolvedComponent = isESModule(resolved)\n ? resolved.default\n : resolved;\n // replace the function with the resolved component\n // cannot be null or undefined because we went into the for loop\n record.components[name] = resolvedComponent;\n // __vccOpts is added by vue-class-component and contain the regular options\n const options = resolvedComponent.__vccOpts || resolvedComponent;\n const guard = options[guardType];\n return (guard &&\n guardToPromiseFn(guard, to, from, record, name, runWithContext)());\n }));\n }\n }\n }\n return guards;\n}\n/**\n * Allows differentiating lazy components from functional components and vue-class-component\n * @internal\n *\n * @param component\n */\nfunction isRouteComponent(component) {\n return (typeof component === 'object' ||\n 'displayName' in component ||\n 'props' in component ||\n '__vccOpts' in component);\n}\n/**\n * Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n *\n * @param route - resolved route to load\n */\nfunction loadRouteLocation(route) {\n return route.matched.every(record => record.redirect)\n ? Promise.reject(new Error('Cannot load a route that redirects.'))\n : Promise.all(route.matched.map(record => record.components &&\n Promise.all(Object.keys(record.components).reduce((promises, name) => {\n const rawComponent = record.components[name];\n if (typeof rawComponent === 'function' &&\n !('displayName' in rawComponent)) {\n promises.push(rawComponent().then(resolved => {\n if (!resolved)\n return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n const resolvedComponent = isESModule(resolved)\n ? resolved.default\n : resolved;\n // replace the function with the resolved component\n // cannot be null or undefined because we went into the for loop\n record.components[name] = resolvedComponent;\n return;\n }));\n }\n return promises;\n }, [])))).then(() => route);\n}\n\n// TODO: we could allow currentRoute as a prop to expose `isActive` and\n// `isExactActive` behavior should go through an RFC\n/**\n * Returns the internal behavior of a {@link RouterLink} without the rendering part.\n *\n * @param props - a `to` location and an optional `replace` flag\n */\nfunction useLink(props) {\n const router = inject(routerKey);\n const currentRoute = inject(routeLocationKey);\n let hasPrevious = false;\n let previousTo = null;\n const route = computed(() => {\n const to = unref(props.to);\n if ((process.env.NODE_ENV !== 'production') && (!hasPrevious || to !== previousTo)) {\n if (!isRouteLocation(to)) {\n if (hasPrevious) {\n warn(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- previous to:`, previousTo, `\\n- props:`, props);\n }\n else {\n warn(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- props:`, props);\n }\n }\n previousTo = to;\n hasPrevious = true;\n }\n return router.resolve(to);\n });\n const activeRecordIndex = computed(() => {\n const { matched } = route.value;\n const { length } = matched;\n const routeMatched = matched[length - 1];\n const currentMatched = currentRoute.matched;\n if (!routeMatched || !currentMatched.length)\n return -1;\n const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n if (index > -1)\n return index;\n // possible parent record\n const parentRecordPath = getOriginalPath(matched[length - 2]);\n return (\n // we are dealing with nested routes\n length > 1 &&\n // if the parent and matched route have the same path, this link is\n // referring to the empty child. Or we currently are on a different\n // child of the same parent\n getOriginalPath(routeMatched) === parentRecordPath &&\n // avoid comparing the child with its parent\n currentMatched[currentMatched.length - 1].path !== parentRecordPath\n ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2]))\n : index);\n });\n const isActive = computed(() => activeRecordIndex.value > -1 &&\n includesParams(currentRoute.params, route.value.params));\n const isExactActive = computed(() => activeRecordIndex.value > -1 &&\n activeRecordIndex.value === currentRoute.matched.length - 1 &&\n isSameRouteLocationParams(currentRoute.params, route.value.params));\n function navigate(e = {}) {\n if (guardEvent(e)) {\n return router[unref(props.replace) ? 'replace' : 'push'](unref(props.to)\n // avoid uncaught errors are they are logged anyway\n ).catch(noop);\n }\n return Promise.resolve();\n }\n // devtools only\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n const instance = getCurrentInstance();\n if (instance) {\n const linkContextDevtools = {\n route: route.value,\n isActive: isActive.value,\n isExactActive: isExactActive.value,\n error: null,\n };\n // @ts-expect-error: this is internal\n instance.__vrl_devtools = instance.__vrl_devtools || [];\n // @ts-expect-error: this is internal\n instance.__vrl_devtools.push(linkContextDevtools);\n watchEffect(() => {\n linkContextDevtools.route = route.value;\n linkContextDevtools.isActive = isActive.value;\n linkContextDevtools.isExactActive = isExactActive.value;\n linkContextDevtools.error = isRouteLocation(unref(props.to))\n ? null\n : 'Invalid \"to\" value';\n }, { flush: 'post' });\n }\n }\n /**\n * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n */\n return {\n route,\n href: computed(() => route.value.href),\n isActive,\n isExactActive,\n navigate,\n };\n}\nconst RouterLinkImpl = /*#__PURE__*/ defineComponent({\n name: 'RouterLink',\n compatConfig: { MODE: 3 },\n props: {\n to: {\n type: [String, Object],\n required: true,\n },\n replace: Boolean,\n activeClass: String,\n // inactiveClass: String,\n exactActiveClass: String,\n custom: Boolean,\n ariaCurrentValue: {\n type: String,\n default: 'page',\n },\n },\n useLink,\n setup(props, { slots }) {\n const link = reactive(useLink(props));\n const { options } = inject(routerKey);\n const elClass = computed(() => ({\n [getLinkClass(props.activeClass, options.linkActiveClass, 'router-link-active')]: link.isActive,\n // [getLinkClass(\n // props.inactiveClass,\n // options.linkInactiveClass,\n // 'router-link-inactive'\n // )]: !link.isExactActive,\n [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, 'router-link-exact-active')]: link.isExactActive,\n }));\n return () => {\n const children = slots.default && slots.default(link);\n return props.custom\n ? children\n : h('a', {\n 'aria-current': link.isExactActive\n ? props.ariaCurrentValue\n : null,\n href: link.href,\n // this would override user added attrs but Vue will still add\n // the listener, so we end up triggering both\n onClick: link.navigate,\n class: elClass.value,\n }, children);\n };\n },\n});\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to render a link that triggers a navigation on click.\n */\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n // don't redirect with control keys\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n return;\n // don't redirect when preventDefault called\n if (e.defaultPrevented)\n return;\n // don't redirect on right click\n if (e.button !== undefined && e.button !== 0)\n return;\n // don't redirect if `target=\"_blank\"`\n // @ts-expect-error getAttribute does exist\n if (e.currentTarget && e.currentTarget.getAttribute) {\n // @ts-expect-error getAttribute exists\n const target = e.currentTarget.getAttribute('target');\n if (/\\b_blank\\b/i.test(target))\n return;\n }\n // this may be a Weex event which doesn't have this method\n if (e.preventDefault)\n e.preventDefault();\n return true;\n}\nfunction includesParams(outer, inner) {\n for (const key in inner) {\n const innerValue = inner[key];\n const outerValue = outer[key];\n if (typeof innerValue === 'string') {\n if (innerValue !== outerValue)\n return false;\n }\n else {\n if (!isArray(outerValue) ||\n outerValue.length !== innerValue.length ||\n innerValue.some((value, i) => value !== outerValue[i]))\n return false;\n }\n }\n return true;\n}\n/**\n * Get the original path value of a record by following its aliasOf\n * @param record\n */\nfunction getOriginalPath(record) {\n return record ? (record.aliasOf ? record.aliasOf.path : record.path) : '';\n}\n/**\n * Utility class to get the active class based on defaults.\n * @param propClass\n * @param globalClass\n * @param defaultClass\n */\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null\n ? propClass\n : globalClass != null\n ? globalClass\n : defaultClass;\n\nconst RouterViewImpl = /*#__PURE__*/ defineComponent({\n name: 'RouterView',\n // #674 we manually inherit them\n inheritAttrs: false,\n props: {\n name: {\n type: String,\n default: 'default',\n },\n route: Object,\n },\n // Better compat for @vue/compat users\n // https://github.com/vuejs/router/issues/1315\n compatConfig: { MODE: 3 },\n setup(props, { attrs, slots }) {\n (process.env.NODE_ENV !== 'production') && warnDeprecatedUsage();\n const injectedRoute = inject(routerViewLocationKey);\n const routeToDisplay = computed(() => props.route || injectedRoute.value);\n const injectedDepth = inject(viewDepthKey, 0);\n // The depth changes based on empty components option, which allows passthrough routes e.g. routes with children\n // that are used to reuse the `path` property\n const depth = computed(() => {\n let initialDepth = unref(injectedDepth);\n const { matched } = routeToDisplay.value;\n let matchedRoute;\n while ((matchedRoute = matched[initialDepth]) &&\n !matchedRoute.components) {\n initialDepth++;\n }\n return initialDepth;\n });\n const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n provide(viewDepthKey, computed(() => depth.value + 1));\n provide(matchedRouteKey, matchedRouteRef);\n provide(routerViewLocationKey, routeToDisplay);\n const viewRef = ref();\n // watch at the same time the component instance, the route record we are\n // rendering, and the name\n watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {\n // copy reused instances\n if (to) {\n // this will update the instance for new instances as well as reused\n // instances when navigating to a new route\n to.instances[name] = instance;\n // the component instance is reused for a different route or name, so\n // we copy any saved update or leave guards. With async setup, the\n // mounting component will mount before the matchedRoute changes,\n // making instance === oldInstance, so we check if guards have been\n // added before. This works because we remove guards when\n // unmounting/deactivating components\n if (from && from !== to && instance && instance === oldInstance) {\n if (!to.leaveGuards.size) {\n to.leaveGuards = from.leaveGuards;\n }\n if (!to.updateGuards.size) {\n to.updateGuards = from.updateGuards;\n }\n }\n }\n // trigger beforeRouteEnter next callbacks\n if (instance &&\n to &&\n // if there is no instance but to and from are the same this might be\n // the first visit\n (!from || !isSameRouteRecord(to, from) || !oldInstance)) {\n (to.enterCallbacks[name] || []).forEach(callback => callback(instance));\n }\n }, { flush: 'post' });\n return () => {\n const route = routeToDisplay.value;\n // we need the value at the time we render because when we unmount, we\n // navigated to a different location so the value is different\n const currentName = props.name;\n const matchedRoute = matchedRouteRef.value;\n const ViewComponent = matchedRoute && matchedRoute.components[currentName];\n if (!ViewComponent) {\n return normalizeSlot(slots.default, { Component: ViewComponent, route });\n }\n // props from route configuration\n const routePropsOption = matchedRoute.props[currentName];\n const routeProps = routePropsOption\n ? routePropsOption === true\n ? route.params\n : typeof routePropsOption === 'function'\n ? routePropsOption(route)\n : routePropsOption\n : null;\n const onVnodeUnmounted = vnode => {\n // remove the instance reference to prevent leak\n if (vnode.component.isUnmounted) {\n matchedRoute.instances[currentName] = null;\n }\n };\n const component = h(ViewComponent, assign({}, routeProps, attrs, {\n onVnodeUnmounted,\n ref: viewRef,\n }));\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) &&\n isBrowser &&\n component.ref) {\n // TODO: can display if it's an alias, its props\n const info = {\n depth: depth.value,\n name: matchedRoute.name,\n path: matchedRoute.path,\n meta: matchedRoute.meta,\n };\n const internalInstances = isArray(component.ref)\n ? component.ref.map(r => r.i)\n : [component.ref.i];\n internalInstances.forEach(instance => {\n // @ts-expect-error\n instance.__vrv_devtools = info;\n });\n }\n return (\n // pass the vnode to the slot as a prop.\n // h and <component :is=\"...\"> both accept vnodes\n normalizeSlot(slots.default, { Component: component, route }) ||\n component);\n };\n },\n});\nfunction normalizeSlot(slot, data) {\n if (!slot)\n return null;\n const slotContent = slot(data);\n return slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to display the current route the user is at.\n */\nconst RouterView = RouterViewImpl;\n// warn against deprecated usage with <transition> & <keep-alive>\n// due to functional component being no longer eager in Vue 3\nfunction warnDeprecatedUsage() {\n const instance = getCurrentInstance();\n const parentName = instance.parent && instance.parent.type.name;\n const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n if (parentName &&\n (parentName === 'KeepAlive' || parentName.includes('Transition')) &&\n typeof parentSubTreeType === 'object' &&\n parentSubTreeType.name === 'RouterView') {\n const comp = parentName === 'KeepAlive' ? 'keep-alive' : 'transition';\n warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\\n` +\n `Use slot props instead:\\n\\n` +\n `<router-view v-slot=\"{ Component }\">\\n` +\n ` <${comp}>\\n` +\n ` <component :is=\"Component\" />\\n` +\n ` </${comp}>\\n` +\n `</router-view>`);\n }\n}\n\n/**\n * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n *\n * @param routeLocation - routeLocation to format\n * @param tooltip - optional tooltip\n * @returns a copy of the routeLocation\n */\nfunction formatRouteLocation(routeLocation, tooltip) {\n const copy = assign({}, routeLocation, {\n // remove variables that can contain vue instances\n matched: routeLocation.matched.map(matched => omit(matched, ['instances', 'children', 'aliasOf'])),\n });\n return {\n _custom: {\n type: null,\n readOnly: true,\n display: routeLocation.fullPath,\n tooltip,\n value: copy,\n },\n };\n}\nfunction formatDisplay(display) {\n return {\n _custom: {\n display,\n },\n };\n}\n// to support multiple router instances\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n // Take over router.beforeEach and afterEach\n // make sure we are not registering the devtool twice\n if (router.__hasDevtools)\n return;\n router.__hasDevtools = true;\n // increment to support multiple router instances\n const id = routerId++;\n setupDevtoolsPlugin({\n id: 'org.vuejs.router' + (id ? '.' + id : ''),\n label: 'Vue Router',\n packageName: 'vue-router',\n homepage: 'https://router.vuejs.org',\n logo: 'https://router.vuejs.org/logo.png',\n componentStateTypes: ['Routing'],\n app,\n }, api => {\n if (typeof api.now !== 'function') {\n console.warn('[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n }\n // display state added by the router\n api.on.inspectComponent((payload, ctx) => {\n if (payload.instanceData) {\n payload.instanceData.state.push({\n type: 'Routing',\n key: '$route',\n editable: false,\n value: formatRouteLocation(router.currentRoute.value, 'Current Route'),\n });\n }\n });\n // mark router-link as active and display tags on router views\n api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n if (componentInstance.__vrv_devtools) {\n const info = componentInstance.__vrv_devtools;\n node.tags.push({\n label: (info.name ? `${info.name.toString()}: ` : '') + info.path,\n textColor: 0,\n tooltip: 'This component is rendered by <router-view>',\n backgroundColor: PINK_500,\n });\n }\n // if multiple useLink are used\n if (isArray(componentInstance.__vrl_devtools)) {\n componentInstance.__devtoolsApi = api;\n componentInstance.__vrl_devtools.forEach(devtoolsData => {\n let label = devtoolsData.route.path;\n let backgroundColor = ORANGE_400;\n let tooltip = '';\n let textColor = 0;\n if (devtoolsData.error) {\n label = devtoolsData.error;\n backgroundColor = RED_100;\n textColor = RED_700;\n }\n else if (devtoolsData.isExactActive) {\n backgroundColor = LIME_500;\n tooltip = 'This is exactly active';\n }\n else if (devtoolsData.isActive) {\n backgroundColor = BLUE_600;\n tooltip = 'This link is active';\n }\n node.tags.push({\n label,\n textColor,\n tooltip,\n backgroundColor,\n });\n });\n }\n });\n watch(router.currentRoute, () => {\n // refresh active state\n refreshRoutesView();\n api.notifyComponentUpdate();\n api.sendInspectorTree(routerInspectorId);\n api.sendInspectorState(routerInspectorId);\n });\n const navigationsLayerId = 'router:navigations:' + id;\n api.addTimelineLayer({\n id: navigationsLayerId,\n label: `Router${id ? ' ' + id : ''} Navigations`,\n color: 0x40a8c4,\n });\n // const errorsLayerId = 'router:errors'\n // api.addTimelineLayer({\n // id: errorsLayerId,\n // label: 'Router Errors',\n // color: 0xea5455,\n // })\n router.onError((error, to) => {\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n title: 'Error during Navigation',\n subtitle: to.fullPath,\n logType: 'error',\n time: api.now(),\n data: { error },\n groupId: to.meta.__navigationId,\n },\n });\n });\n // attached to `meta` and used to group events\n let navigationId = 0;\n router.beforeEach((to, from) => {\n const data = {\n guard: formatDisplay('beforeEach'),\n from: formatRouteLocation(from, 'Current Location during this navigation'),\n to: formatRouteLocation(to, 'Target location'),\n };\n // Used to group navigations together, hide from devtools\n Object.defineProperty(to.meta, '__navigationId', {\n value: navigationId++,\n });\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n time: api.now(),\n title: 'Start of navigation',\n subtitle: to.fullPath,\n data,\n groupId: to.meta.__navigationId,\n },\n });\n });\n router.afterEach((to, from, failure) => {\n const data = {\n guard: formatDisplay('afterEach'),\n };\n if (failure) {\n data.failure = {\n _custom: {\n type: Error,\n readOnly: true,\n display: failure ? failure.message : '',\n tooltip: 'Navigation Failure',\n value: failure,\n },\n };\n data.status = formatDisplay('❌');\n }\n else {\n data.status = formatDisplay('✅');\n }\n // we set here to have the right order\n data.from = formatRouteLocation(from, 'Current Location during this navigation');\n data.to = formatRouteLocation(to, 'Target location');\n api.addTimelineEvent({\n layerId: navigationsLayerId,\n event: {\n title: 'End of navigation',\n subtitle: to.fullPath,\n time: api.now(),\n data,\n logType: failure ? 'warning' : 'default',\n groupId: to.meta.__navigationId,\n },\n });\n });\n /**\n * Inspector of Existing routes\n */\n const routerInspectorId = 'router-inspector:' + id;\n api.addInspector({\n id: routerInspectorId,\n label: 'Routes' + (id ? ' ' + id : ''),\n icon: 'book',\n treeFilterPlaceholder: 'Search routes',\n });\n function refreshRoutesView() {\n // the routes view isn't active\n if (!activeRoutesPayload)\n return;\n const payload = activeRoutesPayload;\n // children routes will appear as nested\n let routes = matcher.getRoutes().filter(route => !route.parent ||\n // these routes have a parent with no component which will not appear in the view\n // therefore we still need to include them\n !route.parent.record.components);\n // reset match state to false\n routes.forEach(resetMatchStateOnRouteRecord);\n // apply a match state if there is a payload\n if (payload.filter) {\n routes = routes.filter(route => \n // save matches state based on the payload\n isRouteMatching(route, payload.filter.toLowerCase()));\n }\n // mark active routes\n routes.forEach(route => markRouteRecordActive(route, router.currentRoute.value));\n payload.rootNodes = routes.map(formatRouteRecordForInspector);\n }\n let activeRoutesPayload;\n api.on.getInspectorTree(payload => {\n activeRoutesPayload = payload;\n if (payload.app === app && payload.inspectorId === routerInspectorId) {\n refreshRoutesView();\n }\n });\n /**\n * Display information about the currently selected route record\n */\n api.on.getInspectorState(payload => {\n if (payload.app === app && payload.inspectorId === routerInspectorId) {\n const routes = matcher.getRoutes();\n const route = routes.find(route => route.record.__vd_id === payload.nodeId);\n if (route) {\n payload.state = {\n options: formatRouteRecordMatcherForStateInspector(route),\n };\n }\n }\n });\n api.sendInspectorTree(routerInspectorId);\n api.sendInspectorState(routerInspectorId);\n });\n}\nfunction modifierForKey(key) {\n if (key.optional) {\n return key.repeatable ? '*' : '?';\n }\n else {\n return key.repeatable ? '+' : '';\n }\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n const { record } = route;\n const fields = [\n { editable: false, key: 'path', value: record.path },\n ];\n if (record.name != null) {\n fields.push({\n editable: false,\n key: 'name',\n value: record.name,\n });\n }\n fields.push({ editable: false, key: 'regexp', value: route.re });\n if (route.keys.length) {\n fields.push({\n editable: false,\n key: 'keys',\n value: {\n _custom: {\n type: null,\n readOnly: true,\n display: route.keys\n .map(key => `${key.name}${modifierForKey(key)}`)\n .join(' '),\n tooltip: 'Param keys',\n value: route.keys,\n },\n },\n });\n }\n if (record.redirect != null) {\n fields.push({\n editable: false,\n key: 'redirect',\n value: record.redirect,\n });\n }\n if (route.alias.length) {\n fields.push({\n editable: false,\n key: 'aliases',\n value: route.alias.map(alias => alias.record.path),\n });\n }\n if (Object.keys(route.record.meta).length) {\n fields.push({\n editable: false,\n key: 'meta',\n value: route.record.meta,\n });\n }\n fields.push({\n key: 'score',\n editable: false,\n value: {\n _custom: {\n type: null,\n readOnly: true,\n display: route.score.map(score => score.join(', ')).join(' | '),\n tooltip: 'Score used to sort routes',\n value: route.score,\n },\n },\n });\n return fields;\n}\n/**\n * Extracted from tailwind palette\n */\nconst PINK_500 = 0xec4899;\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\n// const GRAY_100 = 0xf4f4f5\nconst DARK = 0x666666;\nconst RED_100 = 0xfee2e2;\nconst RED_700 = 0xb91c1c;\nfunction formatRouteRecordForInspector(route) {\n const tags = [];\n const { record } = route;\n if (record.name != null) {\n tags.push({\n label: String(record.name),\n textColor: 0,\n backgroundColor: CYAN_400,\n });\n }\n if (record.aliasOf) {\n tags.push({\n label: 'alias',\n textColor: 0,\n backgroundColor: ORANGE_400,\n });\n }\n if (route.__vd_match) {\n tags.push({\n label: 'matches',\n textColor: 0,\n backgroundColor: PINK_500,\n });\n }\n if (route.__vd_exactActive) {\n tags.push({\n label: 'exact',\n textColor: 0,\n backgroundColor: LIME_500,\n });\n }\n if (route.__vd_active) {\n tags.push({\n label: 'active',\n textColor: 0,\n backgroundColor: BLUE_600,\n });\n }\n if (record.redirect) {\n tags.push({\n label: typeof record.redirect === 'string'\n ? `redirect: ${record.redirect}`\n : 'redirects',\n textColor: 0xffffff,\n backgroundColor: DARK,\n });\n }\n // add an id to be able to select it. Using the `path` is not possible because\n // empty path children would collide with their parents\n let id = record.__vd_id;\n if (id == null) {\n id = String(routeRecordId++);\n record.__vd_id = id;\n }\n return {\n id,\n label: record.path,\n tags,\n children: route.children.map(formatRouteRecordForInspector),\n };\n}\n// incremental id for route records and inspector state\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n // no route will be active if matched is empty\n // reset the matching state\n const isExactActive = currentRoute.matched.length &&\n isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n route.__vd_exactActive = route.__vd_active = isExactActive;\n if (!isExactActive) {\n route.__vd_active = currentRoute.matched.some(match => isSameRouteRecord(match, route.record));\n }\n route.children.forEach(childRoute => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n route.__vd_match = false;\n route.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n const found = String(route.re).match(EXTRACT_REGEXP_RE);\n route.__vd_match = false;\n if (!found || found.length < 3) {\n return false;\n }\n // use a regexp without $ at the end to match nested routes better\n const nonEndingRE = new RegExp(found[1].replace(/\\$$/, ''), found[2]);\n if (nonEndingRE.test(filter)) {\n // mark children as matches\n route.children.forEach(child => isRouteMatching(child, filter));\n // exception case: `/`\n if (route.record.path !== '/' || filter === '/') {\n route.__vd_match = route.re.test(filter);\n return true;\n }\n // hide the / route\n return false;\n }\n const path = route.record.path.toLowerCase();\n const decodedPath = decode(path);\n // also allow partial matching on the path\n if (!filter.startsWith('/') &&\n (decodedPath.includes(filter) || path.includes(filter)))\n return true;\n if (decodedPath.startsWith(filter) || path.startsWith(filter))\n return true;\n if (route.record.name && String(route.record.name).includes(filter))\n return true;\n return route.children.some(child => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n const ret = {};\n for (const key in obj) {\n if (!keys.includes(key)) {\n // @ts-expect-error\n ret[key] = obj[key];\n }\n }\n return ret;\n}\n\n/**\n * Creates a Router instance that can be used by a Vue app.\n *\n * @param options - {@link RouterOptions}\n */\nfunction createRouter(options) {\n const matcher = createRouterMatcher(options.routes, options);\n const parseQuery$1 = options.parseQuery || parseQuery;\n const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n const routerHistory = options.history;\n if ((process.env.NODE_ENV !== 'production') && !routerHistory)\n throw new Error('Provide the \"history\" option when calling \"createRouter()\":' +\n ' https://router.vuejs.org/api/interfaces/RouterOptions.html#history');\n const beforeGuards = useCallbacks();\n const beforeResolveGuards = useCallbacks();\n const afterGuards = useCallbacks();\n const currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n let pendingLocation = START_LOCATION_NORMALIZED;\n // leave the scrollRestoration if no scrollBehavior is provided\n if (isBrowser && options.scrollBehavior && 'scrollRestoration' in history) {\n history.scrollRestoration = 'manual';\n }\n const normalizeParams = applyToParams.bind(null, paramValue => '' + paramValue);\n const encodeParams = applyToParams.bind(null, encodeParam);\n const decodeParams = \n // @ts-expect-error: intentionally avoid the type check\n applyToParams.bind(null, decode);\n function addRoute(parentOrRoute, route) {\n let parent;\n let record;\n if (isRouteName(parentOrRoute)) {\n parent = matcher.getRecordMatcher(parentOrRoute);\n if ((process.env.NODE_ENV !== 'production') && !parent) {\n warn(`Parent route \"${String(parentOrRoute)}\" not found when adding child route`, route);\n }\n record = route;\n }\n else {\n record = parentOrRoute;\n }\n return matcher.addRoute(record, parent);\n }\n function removeRoute(name) {\n const recordMatcher = matcher.getRecordMatcher(name);\n if (recordMatcher) {\n matcher.removeRoute(recordMatcher);\n }\n else if ((process.env.NODE_ENV !== 'production')) {\n warn(`Cannot remove non-existent route \"${String(name)}\"`);\n }\n }\n function getRoutes() {\n return matcher.getRoutes().map(routeMatcher => routeMatcher.record);\n }\n function hasRoute(name) {\n return !!matcher.getRecordMatcher(name);\n }\n function resolve(rawLocation, currentLocation) {\n // const resolve: Router['resolve'] = (rawLocation: RouteLocationRaw, currentLocation) => {\n // const objectLocation = routerLocationAsObject(rawLocation)\n // we create a copy to modify it later\n currentLocation = assign({}, currentLocation || currentRoute.value);\n if (typeof rawLocation === 'string') {\n const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n const href = routerHistory.createHref(locationNormalized.fullPath);\n if ((process.env.NODE_ENV !== 'production')) {\n if (href.startsWith('//'))\n warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n else if (!matchedRoute.matched.length) {\n warn(`No match found for location with path \"${rawLocation}\"`);\n }\n }\n // locationNormalized is always a new object\n return assign(locationNormalized, matchedRoute, {\n params: decodeParams(matchedRoute.params),\n hash: decode(locationNormalized.hash),\n redirectedFrom: undefined,\n href,\n });\n }\n if ((process.env.NODE_ENV !== 'production') && !isRouteLocation(rawLocation)) {\n warn(`router.resolve() was passed an invalid location. This will fail in production.\\n- Location:`, rawLocation);\n return resolve({});\n }\n let matcherLocation;\n // path could be relative in object as well\n if (rawLocation.path != null) {\n if ((process.env.NODE_ENV !== 'production') &&\n 'params' in rawLocation &&\n !('name' in rawLocation) &&\n // @ts-expect-error: the type is never\n Object.keys(rawLocation.params).length) {\n warn(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n }\n matcherLocation = assign({}, rawLocation, {\n path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path,\n });\n }\n else {\n // remove any nullish param\n const targetParams = assign({}, rawLocation.params);\n for (const key in targetParams) {\n if (targetParams[key] == null) {\n delete targetParams[key];\n }\n }\n // pass encoded values to the matcher, so it can produce encoded path and fullPath\n matcherLocation = assign({}, rawLocation, {\n params: encodeParams(targetParams),\n });\n // current location params are decoded, we need to encode them in case the\n // matcher merges the params\n currentLocation.params = encodeParams(currentLocation.params);\n }\n const matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n const hash = rawLocation.hash || '';\n if ((process.env.NODE_ENV !== 'production') && hash && !hash.startsWith('#')) {\n warn(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n }\n // the matcher might have merged current location params, so\n // we need to run the decoding again\n matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n hash: encodeHash(hash),\n path: matchedRoute.path,\n }));\n const href = routerHistory.createHref(fullPath);\n if ((process.env.NODE_ENV !== 'production')) {\n if (href.startsWith('//')) {\n warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n }\n else if (!matchedRoute.matched.length) {\n warn(`No match found for location with path \"${rawLocation.path != null ? rawLocation.path : rawLocation}\"`);\n }\n }\n return assign({\n fullPath,\n // keep the hash encoded so fullPath is effectively path + encodedQuery +\n // hash\n hash,\n query: \n // if the user is using a custom query lib like qs, we might have\n // nested objects, so we keep the query as is, meaning it can contain\n // numbers at `$route.query`, but at the point, the user will have to\n // use their own type anyway.\n // https://github.com/vuejs/router/issues/328#issuecomment-649481567\n stringifyQuery$1 === stringifyQuery\n ? normalizeQuery(rawLocation.query)\n : (rawLocation.query || {}),\n }, matchedRoute, {\n redirectedFrom: undefined,\n href,\n });\n }\n function locationAsObject(to) {\n return typeof to === 'string'\n ? parseURL(parseQuery$1, to, currentRoute.value.path)\n : assign({}, to);\n }\n function checkCanceledNavigation(to, from) {\n if (pendingLocation !== to) {\n return createRouterError(8 /* ErrorTypes.NAVIGATION_CANCELLED */, {\n from,\n to,\n });\n }\n }\n function push(to) {\n return pushWithRedirect(to);\n }\n function replace(to) {\n return push(assign(locationAsObject(to), { replace: true }));\n }\n function handleRedirectRecord(to) {\n const lastMatched = to.matched[to.matched.length - 1];\n if (lastMatched && lastMatched.redirect) {\n const { redirect } = lastMatched;\n let newTargetLocation = typeof redirect === 'function' ? redirect(to) : redirect;\n if (typeof newTargetLocation === 'string') {\n newTargetLocation =\n newTargetLocation.includes('?') || newTargetLocation.includes('#')\n ? (newTargetLocation = locationAsObject(newTargetLocation))\n : // force empty params\n { path: newTargetLocation };\n // @ts-expect-error: force empty params when a string is passed to let\n // the router parse them again\n newTargetLocation.params = {};\n }\n if ((process.env.NODE_ENV !== 'production') &&\n newTargetLocation.path == null &&\n !('name' in newTargetLocation)) {\n warn(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n throw new Error('Invalid redirect');\n }\n return assign({\n query: to.query,\n hash: to.hash,\n // avoid transferring params if the redirect has a path\n params: newTargetLocation.path != null ? {} : to.params,\n }, newTargetLocation);\n }\n }\n function pushWithRedirect(to, redirectedFrom) {\n const targetLocation = (pendingLocation = resolve(to));\n const from = currentRoute.value;\n const data = to.state;\n const force = to.force;\n // to could be a string where `replace` is a function\n const replace = to.replace === true;\n const shouldRedirect = handleRedirectRecord(targetLocation);\n if (shouldRedirect)\n return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n state: typeof shouldRedirect === 'object'\n ? assign({}, data, shouldRedirect.state)\n : data,\n force,\n replace,\n }), \n // keep original redirectedFrom if it exists\n redirectedFrom || targetLocation);\n // if it was a redirect we already called `pushWithRedirect` above\n const toLocation = targetLocation;\n toLocation.redirectedFrom = redirectedFrom;\n let failure;\n if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n failure = createRouterError(16 /* ErrorTypes.NAVIGATION_DUPLICATED */, { to: toLocation, from });\n // trigger scroll to allow scrolling to the same anchor\n handleScroll(from, from, \n // this is a push, the only way for it to be triggered from a\n // history.listen is with a redirect, which makes it become a push\n true, \n // This cannot be the first navigation because the initial location\n // cannot be manually navigated to\n false);\n }\n return (failure ? Promise.resolve(failure) : navigate(toLocation, from))\n .catch((error) => isNavigationFailure(error)\n ? // navigation redirects still mark the router as ready\n isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)\n ? error\n : markAsReady(error) // also returns the error\n : // reject any unknown error\n triggerError(error, toLocation, from))\n .then((failure) => {\n if (failure) {\n if (isNavigationFailure(failure, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n if ((process.env.NODE_ENV !== 'production') &&\n // we are redirecting to the same location we were already at\n isSameRouteLocation(stringifyQuery$1, resolve(failure.to), toLocation) &&\n // and we have done it a couple of times\n redirectedFrom &&\n // @ts-expect-error: added only in dev\n (redirectedFrom._count = redirectedFrom._count\n ? // @ts-expect-error\n redirectedFrom._count + 1\n : 1) > 30) {\n warn(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n return Promise.reject(new Error('Infinite redirect in navigation guard'));\n }\n return pushWithRedirect(\n // keep options\n assign({\n // preserve an existing replacement but allow the redirect to override it\n replace,\n }, locationAsObject(failure.to), {\n state: typeof failure.to === 'object'\n ? assign({}, data, failure.to.state)\n : data,\n force,\n }), \n // preserve the original redirectedFrom if any\n redirectedFrom || toLocation);\n }\n }\n else {\n // if we fail we don't finalize the navigation\n failure = finalizeNavigation(toLocation, from, true, replace, data);\n }\n triggerAfterEach(toLocation, from, failure);\n return failure;\n });\n }\n /**\n * Helper to reject and skip all navigation guards if a new navigation happened\n * @param to\n * @param from\n */\n function checkCanceledNavigationAndReject(to, from) {\n const error = checkCanceledNavigation(to, from);\n return error ? Promise.reject(error) : Promise.resolve();\n }\n function runWithContext(fn) {\n const app = installedApps.values().next().value;\n // support Vue < 3.3\n return app && typeof app.runWithContext === 'function'\n ? app.runWithContext(fn)\n : fn();\n }\n // TODO: refactor the whole before guards by internally using router.beforeEach\n function navigate(to, from) {\n let guards;\n const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n // all components here have been resolved once because we are leaving\n guards = extractComponentsGuards(leavingRecords.reverse(), 'beforeRouteLeave', to, from);\n // leavingRecords is already reversed\n for (const record of leavingRecords) {\n record.leaveGuards.forEach(guard => {\n guards.push(guardToPromiseFn(guard, to, from));\n });\n }\n const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeRouteLeave guards\n return (runGuardQueue(guards)\n .then(() => {\n // check global guards beforeEach\n guards = [];\n for (const guard of beforeGuards.list()) {\n guards.push(guardToPromiseFn(guard, to, from));\n }\n guards.push(canceledNavigationCheck);\n return runGuardQueue(guards);\n })\n .then(() => {\n // check in components beforeRouteUpdate\n guards = extractComponentsGuards(updatingRecords, 'beforeRouteUpdate', to, from);\n for (const record of updatingRecords) {\n record.updateGuards.forEach(guard => {\n guards.push(guardToPromiseFn(guard, to, from));\n });\n }\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // check the route beforeEnter\n guards = [];\n for (const record of enteringRecords) {\n // do not trigger beforeEnter on reused views\n if (record.beforeEnter) {\n if (isArray(record.beforeEnter)) {\n for (const beforeEnter of record.beforeEnter)\n guards.push(guardToPromiseFn(beforeEnter, to, from));\n }\n else {\n guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n }\n }\n }\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>\n // clear existing enterCallbacks, these are added by extractComponentsGuards\n to.matched.forEach(record => (record.enterCallbacks = {}));\n // check in-component beforeRouteEnter\n guards = extractComponentsGuards(enteringRecords, 'beforeRouteEnter', to, from, runWithContext);\n guards.push(canceledNavigationCheck);\n // run the queue of per route beforeEnter guards\n return runGuardQueue(guards);\n })\n .then(() => {\n // check global guards beforeResolve\n guards = [];\n for (const guard of beforeResolveGuards.list()) {\n guards.push(guardToPromiseFn(guard, to, from));\n }\n guards.push(canceledNavigationCheck);\n return runGuardQueue(guards);\n })\n // catch any navigation canceled\n .catch(err => isNavigationFailure(err, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)\n ? err\n : Promise.reject(err)));\n }\n function triggerAfterEach(to, from, failure) {\n // navigation is confirmed, call afterGuards\n // TODO: wrap with error handlers\n afterGuards\n .list()\n .forEach(guard => runWithContext(() => guard(to, from, failure)));\n }\n /**\n * - Cleans up any navigation guards\n * - Changes the url if necessary\n * - Calls the scrollBehavior\n */\n function finalizeNavigation(toLocation, from, isPush, replace, data) {\n // a more recent navigation took place\n const error = checkCanceledNavigation(toLocation, from);\n if (error)\n return error;\n // only consider as push if it's not the first navigation\n const isFirstNavigation = from === START_LOCATION_NORMALIZED;\n const state = !isBrowser ? {} : history.state;\n // change URL only if the user did a push/replace and if it's not the initial navigation because\n // it's just reflecting the url\n if (isPush) {\n // on the initial navigation, we want to reuse the scroll position from\n // history state if it exists\n if (replace || isFirstNavigation)\n routerHistory.replace(toLocation.fullPath, assign({\n scroll: isFirstNavigation && state && state.scroll,\n }, data));\n else\n routerHistory.push(toLocation.fullPath, data);\n }\n // accept current navigation\n currentRoute.value = toLocation;\n handleScroll(toLocation, from, isPush, isFirstNavigation);\n markAsReady();\n }\n let removeHistoryListener;\n // attach listener to history to trigger navigations\n function setupListeners() {\n // avoid setting up listeners twice due to an invalid first navigation\n if (removeHistoryListener)\n return;\n removeHistoryListener = routerHistory.listen((to, _from, info) => {\n if (!router.listening)\n return;\n // cannot be a redirect route because it was in history\n const toLocation = resolve(to);\n // due to dynamic routing, and to hash history with manual navigation\n // (manually changing the url or calling history.hash = '#/somewhere'),\n // there could be a redirect record in history\n const shouldRedirect = handleRedirectRecord(toLocation);\n if (shouldRedirect) {\n pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop);\n return;\n }\n pendingLocation = toLocation;\n const from = currentRoute.value;\n // TODO: should be moved to web history?\n if (isBrowser) {\n saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n }\n navigate(toLocation, from)\n .catch((error) => {\n if (isNavigationFailure(error, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n return error;\n }\n if (isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n // Here we could call if (info.delta) routerHistory.go(-info.delta,\n // false) but this is bug prone as we have no way to wait the\n // navigation to be finished before calling pushWithRedirect. Using\n // a setTimeout of 16ms seems to work but there is no guarantee for\n // it to work on every browser. So instead we do not restore the\n // history entry and trigger a new navigation as requested by the\n // navigation guard.\n // the error is already handled by router.push we just want to avoid\n // logging the error\n pushWithRedirect(error.to, toLocation\n // avoid an uncaught rejection, let push call triggerError\n )\n .then(failure => {\n // manual change in hash history #916 ending up in the URL not\n // changing, but it was changed by the manual url change, so we\n // need to manually change it ourselves\n if (isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ |\n 16 /* ErrorTypes.NAVIGATION_DUPLICATED */) &&\n !info.delta &&\n info.type === NavigationType.pop) {\n routerHistory.go(-1, false);\n }\n })\n .catch(noop);\n // avoid the then branch\n return Promise.reject();\n }\n // do not restore history on unknown direction\n if (info.delta) {\n routerHistory.go(-info.delta, false);\n }\n // unrecognized error, transfer to the global handler\n return triggerError(error, toLocation, from);\n })\n .then((failure) => {\n failure =\n failure ||\n finalizeNavigation(\n // after navigation, all matched components are resolved\n toLocation, from, false);\n // revert the navigation\n if (failure) {\n if (info.delta &&\n // a new navigation has been triggered, so we do not want to revert, that will change the current history\n // entry while a different route is displayed\n !isNavigationFailure(failure, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n routerHistory.go(-info.delta, false);\n }\n else if (info.type === NavigationType.pop &&\n isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 16 /* ErrorTypes.NAVIGATION_DUPLICATED */)) {\n // manual change in hash history #916\n // it's like a push but lacks the information of the direction\n routerHistory.go(-1, false);\n }\n }\n triggerAfterEach(toLocation, from, failure);\n })\n // avoid warnings in the console about uncaught rejections, they are logged by triggerErrors\n .catch(noop);\n });\n }\n // Initialization and Errors\n let readyHandlers = useCallbacks();\n let errorListeners = useCallbacks();\n let ready;\n /**\n * Trigger errorListeners added via onError and throws the error as well\n *\n * @param error - error to throw\n * @param to - location we were navigating to when the error happened\n * @param from - location we were navigating from when the error happened\n * @returns the error as a rejected promise\n */\n function triggerError(error, to, from) {\n markAsReady(error);\n const list = errorListeners.list();\n if (list.length) {\n list.forEach(handler => handler(error, to, from));\n }\n else {\n if ((process.env.NODE_ENV !== 'production')) {\n warn('uncaught error during route navigation:');\n }\n console.error(error);\n }\n // reject the error no matter there were error listeners or not\n return Promise.reject(error);\n }\n function isReady() {\n if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)\n return Promise.resolve();\n return new Promise((resolve, reject) => {\n readyHandlers.add([resolve, reject]);\n });\n }\n function markAsReady(err) {\n if (!ready) {\n // still not ready if an error happened\n ready = !err;\n setupListeners();\n readyHandlers\n .list()\n .forEach(([resolve, reject]) => (err ? reject(err) : resolve()));\n readyHandlers.reset();\n }\n return err;\n }\n // Scroll behavior\n function handleScroll(to, from, isPush, isFirstNavigation) {\n const { scrollBehavior } = options;\n if (!isBrowser || !scrollBehavior)\n return Promise.resolve();\n const scrollPosition = (!isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0))) ||\n ((isFirstNavigation || !isPush) &&\n history.state &&\n history.state.scroll) ||\n null;\n return nextTick()\n .then(() => scrollBehavior(to, from, scrollPosition))\n .then(position => position && scrollToPosition(position))\n .catch(err => triggerError(err, to, from));\n }\n const go = (delta) => routerHistory.go(delta);\n let started;\n const installedApps = new Set();\n const router = {\n currentRoute,\n listening: true,\n addRoute,\n removeRoute,\n clearRoutes: matcher.clearRoutes,\n hasRoute,\n getRoutes,\n resolve,\n options,\n push,\n replace,\n go,\n back: () => go(-1),\n forward: () => go(1),\n beforeEach: beforeGuards.add,\n beforeResolve: beforeResolveGuards.add,\n afterEach: afterGuards.add,\n onError: errorListeners.add,\n isReady,\n install(app) {\n const router = this;\n app.component('RouterLink', RouterLink);\n app.component('RouterView', RouterView);\n app.config.globalProperties.$router = router;\n Object.defineProperty(app.config.globalProperties, '$route', {\n enumerable: true,\n get: () => unref(currentRoute),\n });\n // this initial navigation is only necessary on client, on server it doesn't\n // make sense because it will create an extra unnecessary navigation and could\n // lead to problems\n if (isBrowser &&\n // used for the initial navigation client side to avoid pushing\n // multiple times when the router is used in multiple apps\n !started &&\n currentRoute.value === START_LOCATION_NORMALIZED) {\n // see above\n started = true;\n push(routerHistory.location).catch(err => {\n if ((process.env.NODE_ENV !== 'production'))\n warn('Unexpected error when starting the router:', err);\n });\n }\n const reactiveRoute = {};\n for (const key in START_LOCATION_NORMALIZED) {\n Object.defineProperty(reactiveRoute, key, {\n get: () => currentRoute.value[key],\n enumerable: true,\n });\n }\n app.provide(routerKey, router);\n app.provide(routeLocationKey, shallowReactive(reactiveRoute));\n app.provide(routerViewLocationKey, currentRoute);\n const unmountApp = app.unmount;\n installedApps.add(app);\n app.unmount = function () {\n installedApps.delete(app);\n // the router is not attached to an app anymore\n if (installedApps.size < 1) {\n // invalidate the current navigation\n pendingLocation = START_LOCATION_NORMALIZED;\n removeHistoryListener && removeHistoryListener();\n removeHistoryListener = null;\n currentRoute.value = START_LOCATION_NORMALIZED;\n started = false;\n ready = false;\n }\n unmountApp();\n };\n // TODO: this probably needs to be updated so it can be used by vue-termui\n if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n addDevtools(app, router, matcher);\n }\n },\n };\n // TODO: type this as NavigationGuardReturn or similar instead of any\n function runGuardQueue(guards) {\n return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n }\n return router;\n}\nfunction extractChangingRecords(to, from) {\n const leavingRecords = [];\n const updatingRecords = [];\n const enteringRecords = [];\n const len = Math.max(from.matched.length, to.matched.length);\n for (let i = 0; i < len; i++) {\n const recordFrom = from.matched[i];\n if (recordFrom) {\n if (to.matched.find(record => isSameRouteRecord(record, recordFrom)))\n updatingRecords.push(recordFrom);\n else\n leavingRecords.push(recordFrom);\n }\n const recordTo = to.matched[i];\n if (recordTo) {\n // the type doesn't matter because we are comparing per reference\n if (!from.matched.find(record => isSameRouteRecord(record, recordTo))) {\n enteringRecords.push(recordTo);\n }\n }\n }\n return [leavingRecords, updatingRecords, enteringRecords];\n}\n\n/**\n * Returns the router instance. Equivalent to using `$router` inside\n * templates.\n */\nfunction useRouter() {\n return inject(routerKey);\n}\n/**\n * Returns the current route location. Equivalent to using `$route` inside\n * templates.\n */\nfunction useRoute(_name) {\n return inject(routeLocationKey);\n}\n\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };\n"], + "mappings": "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", + "names": ["parseQuery", "location", "stringifyQuery", "NavigationType", "NavigationDirection", "history", "replace", "NavigationFailureType", "re", "value", "route", "matchedRoute", "href", "failure", "resolve", "router"] +} diff --git a/src/.vuepress/.cache/deps/vue.js b/src/.vuepress/.cache/deps/vue.js new file mode 100644 index 000000000..3e15775be --- /dev/null +++ b/src/.vuepress/.cache/deps/vue.js @@ -0,0 +1,324 @@ +import { + BaseTransition, + BaseTransitionPropsValidators, + Comment, + DeprecationTypes, + EffectScope, + ErrorCodes, + ErrorTypeStrings, + Fragment, + KeepAlive, + ReactiveEffect, + Static, + Suspense, + Teleport, + Text, + TrackOpTypes, + Transition, + TransitionGroup, + TriggerOpTypes, + VueElement, + assertNumber, + callWithAsyncErrorHandling, + callWithErrorHandling, + camelize, + capitalize, + cloneVNode, + compatUtils, + compile, + computed, + createApp, + createBaseVNode, + createBlock, + createCommentVNode, + createElementBlock, + createHydrationRenderer, + createPropsRestProxy, + createRenderer, + createSSRApp, + createSlots, + createStaticVNode, + createTextVNode, + createVNode, + customRef, + defineAsyncComponent, + defineComponent, + defineCustomElement, + defineEmits, + defineExpose, + defineModel, + defineOptions, + defineProps, + defineSSRCustomElement, + defineSlots, + devtools, + effect, + effectScope, + getCurrentInstance, + getCurrentScope, + getTransitionRawChildren, + guardReactiveProps, + h, + handleError, + hasInjectionContext, + hydrate, + initCustomFormatter, + initDirectivesForSSR, + inject, + isMemoSame, + isProxy, + isReactive, + isReadonly, + isRef, + isRuntimeOnly, + isShallow, + isVNode, + markRaw, + mergeDefaults, + mergeModels, + mergeProps, + nextTick, + normalizeClass, + normalizeProps, + normalizeStyle, + onActivated, + onBeforeMount, + onBeforeUnmount, + onBeforeUpdate, + onDeactivated, + onErrorCaptured, + onMounted, + onRenderTracked, + onRenderTriggered, + onScopeDispose, + onServerPrefetch, + onUnmounted, + onUpdated, + openBlock, + popScopeId, + provide, + proxyRefs, + pushScopeId, + queuePostFlushCb, + reactive, + readonly, + ref, + registerRuntimeCompiler, + render, + renderList, + renderSlot, + resolveComponent, + resolveDirective, + resolveDynamicComponent, + resolveFilter, + resolveTransitionHooks, + setBlockTracking, + setDevtoolsHook, + setTransitionHooks, + shallowReactive, + shallowReadonly, + shallowRef, + ssrContextKey, + ssrUtils, + stop, + toDisplayString, + toHandlerKey, + toHandlers, + toRaw, + toRef, + toRefs, + toValue, + transformVNodeArgs, + triggerRef, + unref, + useAttrs, + useCssModule, + useCssVars, + useModel, + useSSRContext, + useSlots, + useTransitionState, + vModelCheckbox, + vModelDynamic, + vModelRadio, + vModelSelect, + vModelText, + vShow, + version, + warn, + watch, + watchEffect, + watchPostEffect, + watchSyncEffect, + withAsyncContext, + withCtx, + withDefaults, + withDirectives, + withKeys, + withMemo, + withModifiers, + withScopeId +} from "./chunk-PAUCAATC.js"; +import "./chunk-V6TY7KAL.js"; +export { + BaseTransition, + BaseTransitionPropsValidators, + Comment, + DeprecationTypes, + EffectScope, + ErrorCodes, + ErrorTypeStrings, + Fragment, + KeepAlive, + ReactiveEffect, + Static, + Suspense, + Teleport, + Text, + TrackOpTypes, + Transition, + TransitionGroup, + TriggerOpTypes, + VueElement, + assertNumber, + callWithAsyncErrorHandling, + callWithErrorHandling, + camelize, + capitalize, + cloneVNode, + compatUtils, + compile, + computed, + createApp, + createBlock, + createCommentVNode, + createElementBlock, + createBaseVNode as createElementVNode, + createHydrationRenderer, + createPropsRestProxy, + createRenderer, + createSSRApp, + createSlots, + createStaticVNode, + createTextVNode, + createVNode, + customRef, + defineAsyncComponent, + defineComponent, + defineCustomElement, + defineEmits, + defineExpose, + defineModel, + defineOptions, + defineProps, + defineSSRCustomElement, + defineSlots, + devtools, + effect, + effectScope, + getCurrentInstance, + getCurrentScope, + getTransitionRawChildren, + guardReactiveProps, + h, + handleError, + hasInjectionContext, + hydrate, + initCustomFormatter, + initDirectivesForSSR, + inject, + isMemoSame, + isProxy, + isReactive, + isReadonly, + isRef, + isRuntimeOnly, + isShallow, + isVNode, + markRaw, + mergeDefaults, + mergeModels, + mergeProps, + nextTick, + normalizeClass, + normalizeProps, + normalizeStyle, + onActivated, + onBeforeMount, + onBeforeUnmount, + onBeforeUpdate, + onDeactivated, + onErrorCaptured, + onMounted, + onRenderTracked, + onRenderTriggered, + onScopeDispose, + onServerPrefetch, + onUnmounted, + onUpdated, + openBlock, + popScopeId, + provide, + proxyRefs, + pushScopeId, + queuePostFlushCb, + reactive, + readonly, + ref, + registerRuntimeCompiler, + render, + renderList, + renderSlot, + resolveComponent, + resolveDirective, + resolveDynamicComponent, + resolveFilter, + resolveTransitionHooks, + setBlockTracking, + setDevtoolsHook, + setTransitionHooks, + shallowReactive, + shallowReadonly, + shallowRef, + ssrContextKey, + ssrUtils, + stop, + toDisplayString, + toHandlerKey, + toHandlers, + toRaw, + toRef, + toRefs, + toValue, + transformVNodeArgs, + triggerRef, + unref, + useAttrs, + useCssModule, + useCssVars, + useModel, + useSSRContext, + useSlots, + useTransitionState, + vModelCheckbox, + vModelDynamic, + vModelRadio, + vModelSelect, + vModelText, + vShow, + version, + warn, + watch, + watchEffect, + watchPostEffect, + watchSyncEffect, + withAsyncContext, + withCtx, + withDefaults, + withDirectives, + withKeys, + withMemo, + withModifiers, + withScopeId +}; +//# sourceMappingURL=vue.js.map diff --git a/src/.vuepress/.cache/deps/vue.js.map b/src/.vuepress/.cache/deps/vue.js.map new file mode 100644 index 000000000..98652118b --- /dev/null +++ b/src/.vuepress/.cache/deps/vue.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/src/.vuepress/.temp/components/config.js b/src/.vuepress/.temp/components/config.js new file mode 100644 index 000000000..42ed6f2a9 --- /dev/null +++ b/src/.vuepress/.temp/components/config.js @@ -0,0 +1,22 @@ +import { defineClientConfig } from "vuepress/client"; +import { hasGlobalComponent } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/helper/lib/client/index.js"; + +import { useStyleTag } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vueuse/core/index.mjs"; +import FontIcon from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-components/lib/client/components/FontIcon.js"; + +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-components/lib/client/styles/sr-only.scss"; + +export default defineClientConfig({ + enhance: ({ app }) => { + if(!hasGlobalComponent("FontIcon")) app.component("FontIcon", FontIcon); + + }, + setup: () => { + useStyleTag(`\ +@import url("/assets/font/font.css"); +`); + }, + rootComponents: [ + + ], +}); diff --git a/src/.vuepress/.temp/internal/clientConfigs.js b/src/.vuepress/.temp/internal/clientConfigs.js new file mode 100644 index 000000000..20bcdb1d8 --- /dev/null +++ b/src/.vuepress/.temp/internal/clientConfigs.js @@ -0,0 +1,27 @@ +import * as clientConfig0 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/shiki/config.js' +import * as clientConfig1 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/sass-palette/load-hope.js' +import * as clientConfig2 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/components/config.js' +import * as clientConfig3 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-active-header-links/lib/client/config.js' +import * as clientConfig4 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-catalog/lib/client/config.js' +import * as clientConfig5 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-back-to-top/lib/client/config.js' +import * as clientConfig6 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-nprogress/lib/client/config.js' +import * as clientConfig7 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-theme-data/lib/client/config.js' +import * as clientConfig8 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-copy-code/lib/client/config.js' +import * as clientConfig9 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/md-enhance/config.js' +import * as clientConfig10 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-search-pro/lib/client/config.js' +import * as clientConfig11 from 'D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/theme-hope/config.js' + +export const clientConfigs = [ + clientConfig0, + clientConfig1, + clientConfig2, + clientConfig3, + clientConfig4, + clientConfig5, + clientConfig6, + clientConfig7, + clientConfig8, + clientConfig9, + clientConfig10, + clientConfig11, +].map((m) => m.default).filter(Boolean) diff --git a/src/.vuepress/.temp/internal/routes.js b/src/.vuepress/.temp/internal/routes.js new file mode 100644 index 000000000..beea280db --- /dev/null +++ b/src/.vuepress/.temp/internal/routes.js @@ -0,0 +1,274 @@ +export const redirects = JSON.parse("{}") + +export const routes = Object.fromEntries([ + ["/", { loader: () => import(/* webpackChunkName: "index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/index.html.js"), meta: {"t":"Data Sharing Framework","i":"home"} }], + ["/about/contact.html", { loader: () => import(/* webpackChunkName: "about_contact.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/contact.html.js"), meta: {"t":"Contact & Community","i":"call"} }], + ["/about/funding.html", { loader: () => import(/* webpackChunkName: "about_funding.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/funding.html.js"), meta: {"t":"Public Funding","i":"free"} }], + ["/about/partner.html", { loader: () => import(/* webpackChunkName: "about_partner.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/partner.html.js"), meta: {"t":"Partner","i":"proxy"} }], + ["/about/", { loader: () => import(/* webpackChunkName: "about_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/index.html.js"), meta: {"t":"About us","i":"creative"} }], + ["/about/team.html", { loader: () => import(/* webpackChunkName: "about_team.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/team.html.js"), meta: {"t":"Team","i":"group"} }], + ["/community/", { loader: () => import(/* webpackChunkName: "community_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/community/index.html.js"), meta: {"t":""} }], + ["/for-you/", { loader: () => import(/* webpackChunkName: "for-you_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/for-you/index.html.js"), meta: {"t":"DSF for your project","i":"creative"} }], + ["/for-you/learn.html", { loader: () => import(/* webpackChunkName: "for-you_learn.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/for-you/learn.html.js"), meta: {"t":"How to implement your use-case","i":"creative"} }], + ["/hackathon/", { loader: () => import(/* webpackChunkName: "hackathon_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/hackathon/index.html.js"), meta: {"t":"Hackathon","i":"guide"} }], + ["/intro/publications.html", { loader: () => import(/* webpackChunkName: "intro_publications.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/publications.html.js"), meta: {"t":"Publications and Talks","i":"blog"} }], + ["/intro/", { loader: () => import(/* webpackChunkName: "intro_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/index.html.js"), meta: {"t":"Documentation","i":"info"} }], + ["/reference/", { loader: () => import(/* webpackChunkName: "reference_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/reference/index.html.js"), meta: {"t":""} }], + ["/introduction/", { loader: () => import(/* webpackChunkName: "introduction_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/introduction/index.html.js"), meta: {"t":""} }], + ["/research/", { loader: () => import(/* webpackChunkName: "research_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/research/index.html.js"), meta: {"t":""} }], + ["/intro/info/allowList.html", { loader: () => import(/* webpackChunkName: "intro_info_allowList.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/allowList.html.js"), meta: {"t":"Allow Lists","i":"share"} }], + ["/intro/info/architecture.html", { loader: () => import(/* webpackChunkName: "intro_info_architecture.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/architecture.html.js"), meta: {"t":"Architecture","i":"structure"} }], + ["/intro/info/basics.html", { loader: () => import(/* webpackChunkName: "intro_info_basics.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/basics.html.js"), meta: {"t":"Basics and Standards","i":"study"} }], + ["/intro/info/introduction.html", { loader: () => import(/* webpackChunkName: "intro_info_introduction.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/introduction.html.js"), meta: {"t":"Introduction","i":"customize"} }], + ["/intro/info/networkSetup.html", { loader: () => import(/* webpackChunkName: "intro_info_networkSetup.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/networkSetup.html.js"), meta: {"t":"Network Setup and General Architecture","i":"customize"} }], + ["/intro/info/process-plugins.html", { loader: () => import(/* webpackChunkName: "intro_info_process-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/process-plugins.html.js"), meta: {"t":"Process Plugins","i":"plugin"} }], + ["/intro/info/security.html", { loader: () => import(/* webpackChunkName: "intro_info_security.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/security.html.js"), meta: {"t":"Security by Design","i":"safe"} }], + ["/intro/tutorials/GMDS2022-dev.html", { loader: () => import(/* webpackChunkName: "intro_tutorials_GMDS2022-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.js"), meta: {"t":"GMDS2022 - Process Development","i":"code"} }], + ["/intro/tutorials/MIE2023.html", { loader: () => import(/* webpackChunkName: "intro_tutorials_MIE2023.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.js"), meta: {"t":"MIE May 2023","i":"info"} }], + ["/intro/tutorials/", { loader: () => import(/* webpackChunkName: "intro_tutorials_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/index.html.js"), meta: {"t":"Tutorials","i":"edit"} }], + ["/intro/tutorials/Talks.html", { loader: () => import(/* webpackChunkName: "intro_tutorials_Talks.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.js"), meta: {"t":"Recorded talks","i":"globe"} }], + ["/intro/use-cases/feasibility.html", { loader: () => import(/* webpackChunkName: "intro_use-cases_feasibility.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.js"), meta: {"t":"Feasibility","i":"diagram"} }], + ["/intro/use-cases/num.html", { loader: () => import(/* webpackChunkName: "intro_use-cases_num.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/num.html.js"), meta: {"t":"Network University Medicine","i":"map"} }], + ["/intro/use-cases/", { loader: () => import(/* webpackChunkName: "intro_use-cases_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/index.html.js"), meta: {"t":"Use-Cases","i":"view"} }], + ["/security/", { loader: () => import(/* webpackChunkName: "security_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/security/index.html.js"), meta: {"t":"Security","i":"safe"} }], + ["/sprechstunde/", { loader: () => import(/* webpackChunkName: "sprechstunde_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/sprechstunde/index.html.js"), meta: {"t":"Sprechstunde","i":"guide"} }], + ["/use-cases/", { loader: () => import(/* webpackChunkName: "use-cases_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/use-cases/index.html.js"), meta: {"t":""} }], + ["/release/archive/v1.0.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.0.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.js"), meta: {"t":"DSF 1.0.0","i":"guide"} }], + ["/release/archive/v1.0.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.1.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.1.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.js"), meta: {"t":"DSF 1.1.0","i":"guide"} }], + ["/release/archive/v1.1.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.2.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.2.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.js"), meta: {"t":"DSF 1.2.0","i":"guide"} }], + ["/release/archive/v1.2.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.3.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.3.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.js"), meta: {"t":"DSF 1.3.0","i":"guide"} }], + ["/release/archive/v1.3.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.3.1/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.3.1/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.js"), meta: {"t":"DSF 1.3.1","i":"guide"} }], + ["/release/archive/v1.3.1/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.3.2/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.3.2/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.js"), meta: {"t":"DSF 1.3.2","i":"guide"} }], + ["/release/archive/v1.3.2/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.5.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.5.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.js"), meta: {"t":"DSF 1.5.0","i":"guide"} }], + ["/release/archive/v1.5.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.0.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.0.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.0.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.4.0/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.4.0/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.js"), meta: {"t":"DSF 1.4.0","i":"guide"} }], + ["/release/archive/v1.4.0/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.0.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.0.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.0.0","i":"install"} }], + ["/release/archive/v1.0.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.0.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.1.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.1.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.1.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.1.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.1.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.1.0","i":"install"} }], + ["/release/archive/v1.1.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.1.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.1.0/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.x","i":"update"} }], + ["/release/archive/v1.5.1/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.5.1/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.js"), meta: {"t":"DSF 1.5.1","i":"guide"} }], + ["/release/archive/v1.5.1/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.2.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.2.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.2.0","i":"install"} }], + ["/release/archive/v1.2.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.2.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.2.0/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.1.0","i":"update"} }], + ["/release/archive/v1.2.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.2.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.2.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.3.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.3.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.3.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.5.2/dsf-for-dev.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_dsf-for-dev.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.js"), meta: {"t":"DSF for Developers","i":"info"} }], + ["/release/archive/v1.5.2/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.js"), meta: {"t":"DSF 1.5.2","i":"guide"} }], + ["/release/archive/v1.5.2/process-plugins-advanced.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_process-plugins-advanced.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.js"), meta: {"t":"Process Plugins Advanced","i":"info"} }], + ["/release/archive/v1.3.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.3.0/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.3.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.3.0","i":"install"} }], + ["/release/archive/v1.3.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.3.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.3.0/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.2.0","i":"update"} }], + ["/release/archive/v1.3.1/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.3.1/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.3.1/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.3.1/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.3.1/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.3.1/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.js"), meta: {"t":"Install DSF 1.3.1","i":"install"} }], + ["/release/archive/v1.3.1/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.3.1/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.3.1/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.3.0","i":"update"} }], + ["/release/archive/v1.3.2/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.3.2/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.3.2/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.3.2/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.3.2/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.3.2/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.js"), meta: {"t":"Install DSF 1.3.2","i":"install"} }], + ["/release/archive/v1.3.2/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.3.2/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.3.2/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.3.1","i":"update"} }], + ["/release/archive/v1.5.0/contribute/code.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_contribute_code.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.js"), meta: {"t":"Contribute code","i":"info"} }], + ["/release/archive/v1.5.0/contribute/documentation.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_contribute_documentation.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.js"), meta: {"t":"Contribute documentation","i":"info"} }], + ["/release/archive/v1.5.0/contribute/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_contribute_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.js"), meta: {"t":"Contribute","i":"info"} }], + ["/release/archive/v1.5.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.5.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.5.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.5.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.5.0/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.5.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.5.0","i":"install"} }], + ["/release/archive/v1.5.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.5.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.5.0/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.4.0","i":"update"} }], + ["/release/archive/v1.4.0/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.4.0/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.4.0/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.4.0/contribute/code.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_contribute_code.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.js"), meta: {"t":"Contribute code","i":"info"} }], + ["/release/archive/v1.4.0/contribute/documentation.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_contribute_documentation.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.js"), meta: {"t":"Contribute documentation","i":"info"} }], + ["/release/archive/v1.4.0/contribute/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_contribute_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.js"), meta: {"t":"Contribute","i":"info"} }], + ["/release/archive/v1.4.0/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.4.0/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.4.0/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.js"), meta: {"t":"Install DSF 1.4.0","i":"install"} }], + ["/release/archive/v1.4.0/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.4.0/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.4.0/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.3.2","i":"update"} }], + ["/release/archive/v1.0.0/maintain/configuration/bpe.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_configuration_bpe.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.js"), meta: {"t":"Parameters BPE Server"} }], + ["/release/archive/v1.0.0/maintain/configuration/common.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_configuration_common.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.js"), meta: {"t":"Common Parameters"} }], + ["/release/archive/v1.0.0/maintain/configuration/fhir.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_configuration_fhir.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.js"), meta: {"t":"Parameters FHIR Server"} }], + ["/release/archive/v1.0.0/maintain/configuration/", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_configuration_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.0.0/maintain/configuration/reverseproxy.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.0.0_maintain_configuration_reverseproxy.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.js"), meta: {"t":"Parameters FHIR Reverse Proxy"} }], + ["/release/archive/v1.1.0/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.1.0/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.1.0/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.1.0/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.1.0/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.1.0/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.1.0/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.1.0_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.1/contribute/code.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_contribute_code.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.js"), meta: {"t":"Contribute code","i":"info"} }], + ["/release/archive/v1.5.1/contribute/documentation.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_contribute_documentation.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.js"), meta: {"t":"Contribute documentation","i":"info"} }], + ["/release/archive/v1.5.1/contribute/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_contribute_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.js"), meta: {"t":"Contribute","i":"info"} }], + ["/release/archive/v1.5.1/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.5.1/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.5.1/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.5.1/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.5.1/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.5.1/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.js"), meta: {"t":"Install DSF 1.5.1","i":"install"} }], + ["/release/archive/v1.5.1/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.5.1/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.5.1/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.5.0","i":"update"} }], + ["/release/archive/v1.2.0/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.2.0/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.2.0/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.2.0/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.2.0/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.2.0/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.2/contribute/code.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_contribute_code.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.js"), meta: {"t":"Contribute code","i":"info"} }], + ["/release/archive/v1.5.2/contribute/documentation.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_contribute_documentation.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.js"), meta: {"t":"Contribute documentation","i":"info"} }], + ["/release/archive/v1.5.2/contribute/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_contribute_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.js"), meta: {"t":"Contribute","i":"info"} }], + ["/release/archive/v1.5.2/develop/create.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_develop_create.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.js"), meta: {"t":"Create a new process plugin","i":"code"} }], + ["/release/archive/v1.5.2/develop/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_develop_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.js"), meta: {"t":"Develop Process Plugins","i":"plugin"} }], + ["/release/archive/v1.5.2/develop/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_develop_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.js"), meta: {"t":"Upgrade processes from 0.9.x","i":"update"} }], + ["/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.2.0/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.2.0_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.2/maintain/allowList-mgm.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_allowList-mgm.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.js"), meta: {"t":"Allow List Management","i":"share"} }], + ["/release/archive/v1.5.2/maintain/install-plugins.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_install-plugins.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.js"), meta: {"t":"Install Plugins","i":"plugin"} }], + ["/release/archive/v1.5.2/maintain/install.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_install.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.js"), meta: {"t":"Install DSF 1.5.2","i":"install"} }], + ["/release/archive/v1.5.2/maintain/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.js"), meta: {"t":"Maintain a DSF instance","i":"tool"} }], + ["/release/archive/v1.5.2/maintain/upgrade-from-0.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_upgrade-from-0.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.js"), meta: {"t":"Upgrade from DSF 0.9.x","i":"update"} }], + ["/release/archive/v1.5.2/maintain/upgrade-from-1.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_upgrade-from-1.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.js"), meta: {"t":"Upgrade from DSF 1.5.1","i":"update"} }], + ["/release/archive/v1.3.0/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.0/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.3.0/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.3.0/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.0/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.3.0/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.3.1/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.1/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.0/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.0_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.3.1/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.3.1/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.1/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.3.1/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.1/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.1_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.3.2/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.2/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.2/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.3.2/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.3.2/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.3.2/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.3.2/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.3.2_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.0/maintain/bpe/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.0/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.0/maintain/bpe/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.0/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.0/maintain/bpe-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_bpe-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.js"), meta: {"t":"BPE Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.0/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.0/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.0/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.0/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.0/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.0_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.4.0/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.4.0/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.4.0/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.4.0/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.4.0/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.4.0/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.4.0/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.4.0_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.1/maintain/bpe/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.1/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.1/maintain/bpe/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.1/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.1/maintain/bpe-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_bpe-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.js"), meta: {"t":"BPE Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.1/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.1/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.1/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.1/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.1/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.1_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.2/maintain/bpe/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.2/maintain/bpe/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.2/maintain/bpe/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.2/maintain/bpe/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.js"), meta: {"t":"BPE Server","i":"module"} }], + ["/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.2/maintain/bpe-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_bpe-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.js"), meta: {"t":"BPE Reverse Proxy","i":"module"} }], + ["/release/archive/v1.5.2/maintain/fhir/access-control.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir_access-control.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.js"), meta: {"t":"Access Control","i":"config"} }], + ["/release/archive/v1.5.2/maintain/fhir/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.2/maintain/fhir/oidc.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir_oidc.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.js"), meta: {"t":"OpenID Connect","i":"config"} }], + ["/release/archive/v1.5.2/maintain/fhir/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.js"), meta: {"t":"FHIR Server","i":"module"} }], + ["/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir-reverse-proxy_configuration.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.js"), meta: {"t":"Configuration Parameters","i":"config"} }], + ["/release/archive/v1.5.2/maintain/fhir-reverse-proxy/", { loader: () => import(/* webpackChunkName: "release_archive_v1.5.2_maintain_fhir-reverse-proxy_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.js"), meta: {"t":"FHIR Reverse Proxy","i":"module"} }], + ["/404.html", { loader: () => import(/* webpackChunkName: "404.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/404.html.js"), meta: {"t":""} }], + ["/intro/info/", { loader: () => import(/* webpackChunkName: "intro_info_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/index.html.js"), meta: {"t":"Info"} }], + ["/release/archive/", { loader: () => import(/* webpackChunkName: "release_archive_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/index.html.js"), meta: {"t":"Archive"} }], + ["/release/", { loader: () => import(/* webpackChunkName: "release_index.html" */"D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/index.html.js"), meta: {"t":"Release"} }], +]); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updateRoutes) { + __VUE_HMR_RUNTIME__.updateRoutes(routes) + } + if (__VUE_HMR_RUNTIME__.updateRedirects) { + __VUE_HMR_RUNTIME__.updateRedirects(redirects) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ routes, redirects }) => { + __VUE_HMR_RUNTIME__.updateRoutes(routes) + __VUE_HMR_RUNTIME__.updateRedirects(redirects) + }) +} diff --git a/src/.vuepress/.temp/internal/siteData.js b/src/.vuepress/.temp/internal/siteData.js new file mode 100644 index 000000000..0a2f36ab5 --- /dev/null +++ b/src/.vuepress/.temp/internal/siteData.js @@ -0,0 +1,14 @@ +export const siteData = JSON.parse("{\"base\":\"/\",\"lang\":\"en-US\",\"title\":\"\",\"description\":\"\",\"head\":[[\"link\",{\"rel\":\"icon\",\"href\":\"/photos/home/logo-small.svg\"}]],\"locales\":{}}") + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updateSiteData) { + __VUE_HMR_RUNTIME__.updateSiteData(siteData) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ siteData }) => { + __VUE_HMR_RUNTIME__.updateSiteData(siteData) + }) +} diff --git a/src/.vuepress/.temp/internal/themeData.js b/src/.vuepress/.temp/internal/themeData.js new file mode 100644 index 000000000..ad906885a --- /dev/null +++ b/src/.vuepress/.temp/internal/themeData.js @@ -0,0 +1,14 @@ +export const themeData = JSON.parse("{\"encrypt\":{},\"author\":{\"name\":\"DSF-Team\",\"url\":\"/about/team.html\"},\"logo\":\"/photos/home/logo-small.svg\",\"darkmode\":\"toggle\",\"contributors\":false,\"footer\":\"<a href='https://www.hs-heilbronn.de/impressum'>Imprint</a> • <a href='https://www.hs-heilbronn.de/de/datenschutz'>Data Privacy</a>\",\"copyright\":false,\"displayFooter\":true,\"locales\":{\"/\":{\"lang\":\"en-US\",\"navbarLocales\":{\"langName\":\"English\",\"selectLangAriaLabel\":\"Select language\"},\"metaLocales\":{\"author\":\"Author\",\"date\":\"Writing Date\",\"origin\":\"Original\",\"views\":\"Page views\",\"category\":\"Category\",\"tag\":\"Tag\",\"readingTime\":\"Reading Time\",\"words\":\"Words\",\"toc\":\"On This Page\",\"prev\":\"Prev\",\"next\":\"Next\",\"lastUpdated\":\"Last update\",\"contributors\":\"Contributors\",\"editLink\":\"Edit this page\",\"print\":\"Print\"},\"outlookLocales\":{\"themeColor\":\"Theme Color\",\"darkmode\":\"Theme Mode\",\"fullscreen\":\"Full Screen\"},\"routeLocales\":{\"skipToContent\":\"Skip to main content\",\"notFoundTitle\":\"Page not found\",\"notFoundMsg\":[\"There’s nothing here.\",\"How did we get here?\",\"That’s a Four-Oh-Four.\",\"Looks like we've got some broken links.\"],\"back\":\"Go back\",\"home\":\"Take me home\",\"openInNewWindow\":\"Open in new window\"},\"navbar\":[{\"text\":\"Home\",\"icon\":\"home\",\"link\":\"/\"},{\"text\":\"Introduction\",\"link\":\"/introduction/\"},{\"text\":\"Use-Cases\",\"link\":\"/use-cases/\"},{\"text\":\"Release\",\"link\":\"/release/\"},{\"text\":\"Reference\",\"link\":\"/reference/\"},{\"text\":\"Research\",\"link\":\"/research/\"},{\"text\":\"About us\",\"link\":\"/about/\"},{\"text\":\"Community\",\"link\":\"/community/\"},{\"text\":\"Security\",\"link\":\"/security/\"},{\"text\":\"\",\"icon\":\"github\",\"link\":\"https://github.com/datasharingframework/dsf\"}],\"sidebar\":{\"/\":[],\"/hackathon\":[]}}}}") + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updateThemeData) { + __VUE_HMR_RUNTIME__.updateThemeData(themeData) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ themeData }) => { + __VUE_HMR_RUNTIME__.updateThemeData(themeData) + }) +} diff --git a/src/.vuepress/.temp/md-enhance/config.js b/src/.vuepress/.temp/md-enhance/config.js new file mode 100644 index 000000000..c23b37152 --- /dev/null +++ b/src/.vuepress/.temp/md-enhance/config.js @@ -0,0 +1,22 @@ +import { defineClientConfig } from "vuepress/client"; +import CodeTabs from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/components/CodeTabs.js"; +import { hasGlobalComponent } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/helper/lib/client/index.js"; +import { CodeGroup, CodeGroupItem } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/compact/index.js"; +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/styles/figure.scss"; +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/styles/footnote.scss"; +import { useHintContainers } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/composables/useHintContainers.js"; +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/styles/hint/index.scss"; +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/styles/image-mark.scss" +import Playground from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-plugin-md-enhance/lib/client/components/Playground.js"; + +export default defineClientConfig({ + enhance: ({ app }) => { + app.component("CodeTabs", CodeTabs); + if(!hasGlobalComponent("CodeGroup", app)) app.component("CodeGroup", CodeGroup); + if(!hasGlobalComponent("CodeGroupItem", app)) app.component("CodeGroupItem", CodeGroupItem); + app.component("Playground", Playground); + }, + setup: () => { +useHintContainers(); + } +}); diff --git a/src/.vuepress/.temp/pages/404.html.js b/src/.vuepress/.temp/pages/404.html.js new file mode 100644 index 000000000..09f2f71b8 --- /dev/null +++ b/src/.vuepress/.temp/pages/404.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/404.html.vue" +const data = JSON.parse("{\"path\":\"/404.html\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"layout\":\"NotFound\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.01,\"words\":3},\"filePathRelative\":null,\"excerpt\":\"<p>404 Not Found</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/404.html.vue b/src/.vuepress/.temp/pages/404.html.vue new file mode 100644 index 000000000..dab05408a --- /dev/null +++ b/src/.vuepress/.temp/pages/404.html.vue @@ -0,0 +1,4 @@ +<template><div><p>404 Not Found</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/about/contact.html.js b/src/.vuepress/.temp/pages/about/contact.html.js new file mode 100644 index 000000000..4bec16945 --- /dev/null +++ b/src/.vuepress/.temp/pages/about/contact.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/contact.html.vue" +const data = JSON.parse("{\"path\":\"/about/contact.html\",\"title\":\"Contact & Community\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contact & Community\",\"icon\":\"call\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"✉️ E-MAIL\",\"slug\":\"e-mail\",\"link\":\"#e-mail\",\"children\":[]},{\"level\":2,\"title\":\"👥 COMMUNITY\",\"slug\":\"community\",\"link\":\"#community\",\"children\":[{\"level\":3,\"title\":\"Stay up to Date\",\"slug\":\"stay-up-to-date\",\"link\":\"#stay-up-to-date\",\"children\":[]},{\"level\":3,\"title\":\"Contribute Code\",\"slug\":\"contribute-code\",\"link\":\"#contribute-code\",\"children\":[]},{\"level\":3,\"title\":\"Share your Experience & Get support\",\"slug\":\"share-your-experience-get-support\",\"link\":\"#share-your-experience-get-support\",\"children\":[]}]}],\"readingTime\":{\"minutes\":0.58,\"words\":174},\"filePathRelative\":\"about/contact.md\",\"excerpt\":\"<h2><a class=\\\"header-anchor\\\" href=\\\"#e-mail\\\"><span>✉️ </span></a><a href=\\\"mailto:dsf-gecko@hs-heilbronn.de\\\"> E-MAIL</a></h2>\\n<p>Feel free to contact us via <a href=\\\"mailto:dsf-gecko@hs-heilbronn.de\\\"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/about/contact.html.vue b/src/.vuepress/.temp/pages/about/contact.html.vue new file mode 100644 index 000000000..63d3c068b --- /dev/null +++ b/src/.vuepress/.temp/pages/about/contact.html.vue @@ -0,0 +1,17 @@ +<template><div><h2 id="e-mail" tabindex="-1"><a class="header-anchor" href="#e-mail"><span>✉️ <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-MAIL</a></span></a></h2> +<p>Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible.</p> +<h2 id="community" tabindex="-1"><a class="header-anchor" href="#community"><span>👥 COMMUNITY</span></a></h2> +<p>DSF's community is growing and we welcome anyone who would like to join! 🚀</p> +<h3 id="stay-up-to-date" tabindex="-1"><a class="header-anchor" href="#stay-up-to-date"><span>Stay up to Date</span></a></h3> +<ul> +<li><a href="https://github.com/datasharingframework/dsf" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Follow our <RouteLink to="/about/learnmore/team.html">contributors</RouteLink> on GitHub</li> +<li><a href="https://mii.zulipchat.com" target="_blank" rel="noopener noreferrer">Zulip Chat - MII</a> (If you would like access, please write us an <a href="mailto:dsf-gecko@hs-heilbronn.de">E-MAIL</a>)</li> +</ul> +<h3 id="contribute-code" tabindex="-1"><a class="header-anchor" href="#contribute-code"><span>Contribute Code</span></a></h3> +<p>You can get familiar with the DSF code on GitHub. Branching follows the git-flow model, for the latest development version see branch <a href="https://github.com/datasharingframework/dsf/tree/develop" target="_blank" rel="noopener noreferrer">develop</a>. Additionally, you can find more information <RouteLink to="/stable/">here</RouteLink> in the documentation.</p> +<h3 id="share-your-experience-get-support" tabindex="-1"><a class="header-anchor" href="#share-your-experience-get-support"><span>Share your Experience & Get support</span></a></h3> +<p>You´re welcome to share your experience with the Community. If you have a bug to report or feature to request, that's what the <a href="https://github.com/datasharingframework/dsf/issues" target="_blank" rel="noopener noreferrer">GitHub issues</a> are for.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/about/funding.html.js b/src/.vuepress/.temp/pages/about/funding.html.js new file mode 100644 index 000000000..406f1e41d --- /dev/null +++ b/src/.vuepress/.temp/pages/about/funding.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/funding.html.vue" +const data = JSON.parse("{\"path\":\"/about/funding.html\",\"title\":\"Public Funding\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Public Funding\",\"icon\":\"free\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.3,\"words\":391},\"filePathRelative\":\"about/funding.md\",\"excerpt\":\"<div style=\\\"text-align:center\\\">\\n<h2>DSF - Medical Informatics Structure \\\"Data Sharing Framework Community\\\" (2023-2026)</h2>\\n</div>\\n<figure><img src=\\\"/photos/learnmore/funding/bmbf.png\\\" alt=\\\"\\\" width=\\\"228\\\" height=\\\"158\\\" tabindex=\\\"0\\\" loading=\\\"lazy\\\"><figcaption></figcaption></figure>\\n<p>The DSF Community connects the DSF competencies of the entire <a href=\\\"https://www.medizininformatik-initiative.de/de/start\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Medical Informatics Initiative (MII)</a> so that new use cases, in particular from Module 3 or the <a href=\\\"https://www.netzwerk-universitaetsmedizin.de/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Network University Medicine (NUM)</a>, are better supported in creating the respective DSF plugins. In the context of Module 2b, the DSF Community contributes to the further development of the common digital infrastructure of the MII together with the <a href=\\\"https://forschen-fuer-gesundheit.de/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">FDPG+</a> and <a href=\\\"https://www.gesundheitsforschung-bmbf.de/de/transit-medizininformatik-struktur-data-management-unit-16148.php\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">TRANSIT</a> projects. <a href=\\\"https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">BMBF</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/about/funding.html.vue b/src/.vuepress/.temp/pages/about/funding.html.vue new file mode 100644 index 000000000..38cf79f9a --- /dev/null +++ b/src/.vuepress/.temp/pages/about/funding.html.vue @@ -0,0 +1,23 @@ +<template><div><div style="text-align:center"> +<h2 id="dsf-medical-informatics-structure-data-sharing-framework-community-2023-2026" tabindex="-1"><a class="header-anchor" href="#dsf-medical-informatics-structure-data-sharing-framework-community-2023-2026"><span>DSF - Medical Informatics Structure "Data Sharing Framework Community" (2023-2026)</span></a></h2> +</div> +<figure><img src="/photos/learnmore/funding/bmbf.png" alt="" width="228" height="158" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +<p>The DSF Community connects the DSF competencies of the entire <a href="https://www.medizininformatik-initiative.de/de/start" target="_blank" rel="noopener noreferrer">Medical Informatics Initiative (MII)</a> so that new use cases, in particular from Module 3 or the <a href="https://www.netzwerk-universitaetsmedizin.de/" target="_blank" rel="noopener noreferrer">Network University Medicine (NUM)</a>, are better supported in creating the respective DSF plugins. In the context of Module 2b, the DSF Community contributes to the further development of the common digital infrastructure of the MII together with the <a href="https://forschen-fuer-gesundheit.de/" target="_blank" rel="noopener noreferrer">FDPG+</a> and <a href="https://www.gesundheitsforschung-bmbf.de/de/transit-medizininformatik-struktur-data-management-unit-16148.php" target="_blank" rel="noopener noreferrer">TRANSIT</a> projects. <a href="https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php" target="_blank" rel="noopener noreferrer">BMBF</a></p> +<p>Heilbronn University (HHN) focuses on the connecting of DSF related topics and competencies in the MII with the community management. The quality assurance of new DSF plugins and further development of the application and core components aim at a scalable, stable and secure operation of the DSF (Funding code: 01ZZ2307A).</p> +<p>Heidelberg University is focusing on the further development of the DSF core components as well as the rollout of the DSF plugins, in particular also from the perspective of a data integration center in consultation with the FDGP+ and TRANSIT projects (Funding code: 01ZZ2307B).</p> +<p>The University of Leipzig will further develop and adapt the DSF plugin for the Research Data Portal for Health FDPG according to specifications resulting from the FDPG+ project and enable Data Integration Centers (DIC) to operate the FDPG plugin (Funding code: 01ZZ2307C).</p> +<div style="text-align:center"> +<figure><img src="/photos/learnmore/funding/mii.png" alt="" width="370" height="190" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +</div> +<br> +<br> +<br> +<hr> +<div style="text-align:center"> +<h2 id="development-of-the-dsf-in-the-highmed-consortium-contribution-heilbronn-university-and-heidelberg-university-2018-2022" tabindex="-1"><a class="header-anchor" href="#development-of-the-dsf-in-the-highmed-consortium-contribution-heilbronn-university-and-heidelberg-university-2018-2022"><span>Development of the DSF in the HiGHmed consortium -Contribution Heilbronn University and Heidelberg University (2018-2022)</span></a></h2> +</div> +<p><a href="https://www.highmed.org/en/home" target="_blank" rel="noopener noreferrer">HiGHmed</a> aims to increase the efficiency of clinical research and improve patient care through new medical informatics solutions and cross-organizational data exchange. The concept will be developed on the basis of three defined prototypical use cases, which will ensure close integration with the requirements of patient care and medical research. The <a href="https://www.hs-heilbronn.de/de/gecko" target="_blank" rel="noopener noreferrer">GECKO Institute</a> of HHN will establish a trusted third party with pseudonymization service to implement the goals of HiGHmed and is involved in the technical development of the DSF together with the partners (Funding code: 01ZZ1802E). Heidelberg University is in particular involved in the technical development of the DSF (Funding code: 01ZZ1802A).</p> +<figure><img src="/photos/learnmore/funding/highmed.jpg" alt="" width="450" height="150" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/about/index.html.js b/src/.vuepress/.temp/pages/about/index.html.js new file mode 100644 index 000000000..69969b1b8 --- /dev/null +++ b/src/.vuepress/.temp/pages/about/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/index.html.vue" +const data = JSON.parse("{\"path\":\"/about/\",\"title\":\"About us\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"About us\",\"icon\":\"creative\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.06,\"words\":17},\"filePathRelative\":\"about/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"./contact\\\">Contact & Community Guide</a></li>\\n<li><a href=\\\"./team\\\">Contributors</a></li>\\n<li><a href=\\\"./partner\\\">Partner</a></li>\\n<li><a href=\\\"./funding\\\">Public Funding</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/about/index.html.vue b/src/.vuepress/.temp/pages/about/index.html.vue new file mode 100644 index 000000000..4c415dcad --- /dev/null +++ b/src/.vuepress/.temp/pages/about/index.html.vue @@ -0,0 +1,10 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="./contact">Contact & Community Guide</a></li> +<li><a href="./team">Contributors</a></li> +<li><a href="./partner">Partner</a></li> +<li><a href="./funding">Public Funding</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/about/partner.html.js b/src/.vuepress/.temp/pages/about/partner.html.js new file mode 100644 index 000000000..66c14dbfb --- /dev/null +++ b/src/.vuepress/.temp/pages/about/partner.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/partner.html.vue" +const data = JSON.parse("{\"path\":\"/about/partner.html\",\"title\":\"Partner\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Partner\",\"icon\":\"proxy\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Heilbronn University of Applied Sciences | Gecko Institute\",\"slug\":\"heilbronn-university-of-applied-sciences-gecko-institute\",\"link\":\"#heilbronn-university-of-applied-sciences-gecko-institute\",\"children\":[]},{\"level\":2,\"title\":\"University of Heidelberg | Institute of Medical Informatics\",\"slug\":\"university-of-heidelberg-institute-of-medical-informatics\",\"link\":\"#university-of-heidelberg-institute-of-medical-informatics\",\"children\":[]},{\"level\":2,\"title\":\"University of Leipzig | LIFE Institute\",\"slug\":\"university-of-leipzig-life-institute\",\"link\":\"#university-of-leipzig-life-institute\",\"children\":[]}],\"readingTime\":{\"minutes\":0.59,\"words\":176},\"filePathRelative\":\"about/partner.md\",\"excerpt\":\"<p>Funded for further development of the Data Sharing Framework are:</p>\\n<h2>Heilbronn University of Applied Sciences | Gecko Institute</h2>\\n<p>The <a href=\\\"https://www.hs-heilbronn.de/de/gecko\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GECKO Institute</a> is a research institution of <a href=\\\"https://www.hs-heilbronn.de/de\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Heilbronn University of Applied Sciences</a> and conducts research and development at the interfaces between medicine, economics and computer science. The DSF is part of Prof. Fegeler's research area: Interoperability and Digital Processes in Medicine. Other areas of research include educational technologies, health economics, and consumer health informatics.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/about/partner.html.vue b/src/.vuepress/.temp/pages/about/partner.html.vue new file mode 100644 index 000000000..8d11b77cc --- /dev/null +++ b/src/.vuepress/.temp/pages/about/partner.html.vue @@ -0,0 +1,16 @@ +<template><div><p>Funded for further development of the Data Sharing Framework are:</p> +<h2 id="heilbronn-university-of-applied-sciences-gecko-institute" tabindex="-1"><a class="header-anchor" href="#heilbronn-university-of-applied-sciences-gecko-institute"><span>Heilbronn University of Applied Sciences | Gecko Institute</span></a></h2> +<p>The <a href="https://www.hs-heilbronn.de/de/gecko" target="_blank" rel="noopener noreferrer">GECKO Institute</a> is a research institution of <a href="https://www.hs-heilbronn.de/de" target="_blank" rel="noopener noreferrer">Heilbronn University of Applied Sciences</a> and conducts research and development at the interfaces between medicine, economics and computer science. The DSF is part of Prof. Fegeler's research area: Interoperability and Digital Processes in Medicine. Other areas of research include educational technologies, health economics, and consumer health informatics.</p> +<h2 id="university-of-heidelberg-institute-of-medical-informatics" tabindex="-1"><a class="header-anchor" href="#university-of-heidelberg-institute-of-medical-informatics"><span>University of Heidelberg | Institute of Medical Informatics</span></a></h2> +<p>The <a href="https://www.klinikum.uni-heidelberg.de/kliniken-institute/institute/institut-fuer-medizinische-informatik" target="_blank" rel="noopener noreferrer">Institute of Medical Informatics</a> belongs to the University of Heidelberg. The scientific focus of the institute is on structured patient data, e.g.</p> +<ul> +<li>in the Medical Data Integration Center (MeDIC),</li> +<li>structured acquisition and transformation of biomedical data,</li> +<li>medical information systems and data models</li> +<li>and much more.</li> +</ul> +<h2 id="university-of-leipzig-life-institute" tabindex="-1"><a class="header-anchor" href="#university-of-leipzig-life-institute"><span>University of Leipzig | LIFE Institute</span></a></h2> +<p>The <a href="https://www.uniklinikum-leipzig.de/einrichtungen/life/" target="_blank" rel="noopener noreferrer">LIFE Institute</a> of the University of Leipzig manages collaborative and follow-on projects in the fields of medicine, public health, medical informatics, and biobanking.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/about/team.html.js b/src/.vuepress/.temp/pages/about/team.html.js new file mode 100644 index 000000000..791d78cdd --- /dev/null +++ b/src/.vuepress/.temp/pages/about/team.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/about/team.html.vue" +const data = JSON.parse("{\"path\":\"/about/team.html\",\"title\":\"Team\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Team\",\"icon\":\"group\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.21,\"words\":62},\"filePathRelative\":\"about/team.md\",\"excerpt\":\"<p>The funded project team includes:</p>\\n<ul>\\n<li>Prof. Dr. Christian Fegeler • <a href=\\\"https://www.hs-heilbronn.de/de/christian.fegeler\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Homepage</a></li>\\n<li>Hauke Hund • <a href=\\\"https://github.com/hhund\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n<li>Maximilian Kurscheidt • <a href=\\\"https://github.com/MadMax93\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n<li>Simon Schweizer • <a href=\\\"https://github.com/schwzr\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n<li>Christoph Zilske • <a href=\\\"https://github.com/ZilskeC\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n<li>Reto Wettstein • <a href=\\\"https://github.com/wetret\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n<li>Alexander Kiel • <a href=\\\"https://github.com/alexanderkiel\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">GitHub</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/about/team.html.vue b/src/.vuepress/.temp/pages/about/team.html.vue new file mode 100644 index 000000000..10db3bf91 --- /dev/null +++ b/src/.vuepress/.temp/pages/about/team.html.vue @@ -0,0 +1,18 @@ +<template><div><p>The funded project team includes:</p> +<ul> +<li>Prof. Dr. Christian Fegeler • <a href="https://www.hs-heilbronn.de/de/christian.fegeler" target="_blank" rel="noopener noreferrer">Homepage</a></li> +<li>Hauke Hund • <a href="https://github.com/hhund" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Maximilian Kurscheidt • <a href="https://github.com/MadMax93" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Simon Schweizer • <a href="https://github.com/schwzr" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Christoph Zilske • <a href="https://github.com/ZilskeC" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Reto Wettstein • <a href="https://github.com/wetret" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Alexander Kiel • <a href="https://github.com/alexanderkiel" target="_blank" rel="noopener noreferrer">GitHub</a></li> +</ul> +<p>We thank additional contributors, including:</p> +<ul> +<li>Florian Seidel • <a href="https://github.com/FloSeidel" target="_blank" rel="noopener noreferrer">GitHub</a></li> +<li>Simon Mödinger • <a href="https://github.com/simonmoedinger" target="_blank" rel="noopener noreferrer">GitHub</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/community/index.html.js b/src/.vuepress/.temp/pages/community/index.html.js new file mode 100644 index 000000000..ed35dd66c --- /dev/null +++ b/src/.vuepress/.temp/pages/community/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/community/index.html.vue" +const data = JSON.parse("{\"path\":\"/community/\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":\"community/readme.md\",\"excerpt\":\"<p>Community</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/community/index.html.vue b/src/.vuepress/.temp/pages/community/index.html.vue new file mode 100644 index 000000000..029a49962 --- /dev/null +++ b/src/.vuepress/.temp/pages/community/index.html.vue @@ -0,0 +1,4 @@ +<template><div><p>Community</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/for-you/index.html.js b/src/.vuepress/.temp/pages/for-you/index.html.js new file mode 100644 index 000000000..829202202 --- /dev/null +++ b/src/.vuepress/.temp/pages/for-you/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/for-you/index.html.vue" +const data = JSON.parse("{\"path\":\"/for-you/\",\"title\":\"DSF for your project\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for your project\",\"icon\":\"creative\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview of DSF\",\"slug\":\"overview-of-dsf\",\"link\":\"#overview-of-dsf\",\"children\":[]},{\"level\":2,\"title\":\"Key features and benefits\",\"slug\":\"key-features-and-benefits\",\"link\":\"#key-features-and-benefits\",\"children\":[{\"level\":3,\"title\":\"Distributed data sharing processes\",\"slug\":\"distributed-data-sharing-processes\",\"link\":\"#distributed-data-sharing-processes\",\"children\":[]},{\"level\":3,\"title\":\"Flexibility with data standards\",\"slug\":\"flexibility-with-data-standards\",\"link\":\"#flexibility-with-data-standards\",\"children\":[]},{\"level\":3,\"title\":\"Security and access control\",\"slug\":\"security-and-access-control\",\"link\":\"#security-and-access-control\",\"children\":[]},{\"level\":3,\"title\":\"Deployment in clinical environments\",\"slug\":\"deployment-in-clinical-environments\",\"link\":\"#deployment-in-clinical-environments\",\"children\":[]}]},{\"level\":2,\"title\":\"Getting started with the DSF\",\"slug\":\"getting-started-with-the-dsf\",\"link\":\"#getting-started-with-the-dsf\",\"children\":[]}],\"readingTime\":{\"minutes\":1.45,\"words\":435},\"filePathRelative\":\"for-you/index.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Summary</p>\\n<ul>\\n<li>\\n<p><strong>Use case agnostic middleware</strong>: DSF is adaptable to any distributed process, leveraging BPMN 2.0 and FHIR R4 for secure, efficient data sharing across various biomedical research scenarios.</p>\\n</li>\\n<li>\\n<p><strong>Security</strong>: DSF prioritizes security through stringent authentication and authorization protocols, ensuring data is accessed and shared only by authorized organizations to maintain data confidentiality and integrity.</p>\\n</li>\\n<li>\\n<p><strong>Proven in clinical research</strong>: Deployed in German university hospitals, DSF's effectiveness and reliability are validated in real-world settings.</p>\\n</li>\\n<li>\\n<p><strong>Implementation guidance</strong>: DSF offers resources on how to implement new process plugins.</p>\\n</li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/for-you/index.html.vue b/src/.vuepress/.temp/pages/for-you/index.html.vue new file mode 100644 index 000000000..8d0a30f63 --- /dev/null +++ b/src/.vuepress/.temp/pages/for-you/index.html.vue @@ -0,0 +1,35 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Summary</p> +<ul> +<li> +<p><strong>Use case agnostic middleware</strong>: DSF is adaptable to any distributed process, leveraging BPMN 2.0 and FHIR R4 for secure, efficient data sharing across various biomedical research scenarios.</p> +</li> +<li> +<p><strong>Security</strong>: DSF prioritizes security through stringent authentication and authorization protocols, ensuring data is accessed and shared only by authorized organizations to maintain data confidentiality and integrity.</p> +</li> +<li> +<p><strong>Proven in clinical research</strong>: Deployed in German university hospitals, DSF's effectiveness and reliability are validated in real-world settings.</p> +</li> +<li> +<p><strong>Implementation guidance</strong>: DSF offers resources on how to implement new process plugins.</p> +</li> +</ul> +</div> +<h2 id="overview-of-dsf" tabindex="-1"><a class="header-anchor" href="#overview-of-dsf"><span>Overview of DSF</span></a></h2> +<p>The <strong>Data Sharing Framework (DSF)</strong> is a secure middleware solution designed to facilitate data sharing across different organizations for biomedical research. It utilizes BPMN 2.0 and FHIR R4 standards to support processes such as data extraction, merging, pseudonymization, and provisioning. Funded by the German Federal Ministry of Education and Research as part of the Medical Informatics initiative, the DSF aims to improve data interoperability and security across institutional boundaries.</p> +<h2 id="key-features-and-benefits" tabindex="-1"><a class="header-anchor" href="#key-features-and-benefits"><span>Key features and benefits</span></a></h2> +<h3 id="distributed-data-sharing-processes" tabindex="-1"><a class="header-anchor" href="#distributed-data-sharing-processes"><span>Distributed data sharing processes</span></a></h3> +<p>DSF enables distributed data sharing by providing each participating site with a FHIR endpoint and a business process engine. This setup ensures that data can be securely shared and processed across different sites, facilitating cross-site data sharing and feasibility analyses.</p> +<h3 id="flexibility-with-data-standards" tabindex="-1"><a class="header-anchor" href="#flexibility-with-data-standards"><span>Flexibility with data standards</span></a></h3> +<p>While DSF primarily uses the FHIR R4 standard to ensure high-quality data exchange, it is designed to be open and adaptable to other data formats. This flexibility allows for a wide range of data types to be incorporated into research projects.</p> +<h3 id="security-and-access-control" tabindex="-1"><a class="header-anchor" href="#security-and-access-control"><span>Security and access control</span></a></h3> +<p>Security is a critical component of DSF, which includes robust authentication and authorization protocols. These protocols ensure that data access and sharing are restricted to authorized organizations, maintaining the confidentiality and integrity of the data.</p> +<h3 id="deployment-in-clinical-environments" tabindex="-1"><a class="header-anchor" href="#deployment-in-clinical-environments"><span>Deployment in clinical environments</span></a></h3> +<p>DSF is already deployed and operational in <em>Data Integration Centers</em> at German university hospitals, demonstrating its applicability and reliability in real-world clinical research settings.</p> +<h2 id="getting-started-with-the-dsf" tabindex="-1"><a class="header-anchor" href="#getting-started-with-the-dsf"><span>Getting started with the DSF</span></a></h2> +<p>If you're looking to leverage the DSF for your research or you're interested in exploring how it can enhance your data sharing needs, we're here to support you. Visit the <strong><RouteLink to="/for-you/learn.html">Learn how to implement your use case</RouteLink></strong> page to start your journey towards integrating the DSF into your research project.</p> +<p>Should you have any questions or need personalized assistance, don't hesitate to reach out to the DSF core team directly at <strong><a href="mailto:dsf-gecko@hs-heilbronn.de" target="_blank" rel="noopener noreferrer">dsf-gecko@hs-heilbronn.de</a></strong>.</p> +<p>Embark on your DSF journey today and <RouteLink to="/stable/contribute/">join a community</RouteLink> committed to advancing biomedical research through secure, interoperable data sharing.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/for-you/learn.html.js b/src/.vuepress/.temp/pages/for-you/learn.html.js new file mode 100644 index 000000000..39392f95d --- /dev/null +++ b/src/.vuepress/.temp/pages/for-you/learn.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/for-you/learn.html.vue" +const data = JSON.parse("{\"path\":\"/for-you/learn.html\",\"title\":\"How to implement your use-case\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"How to implement your use-case\",\"icon\":\"creative\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.16,\"words\":48},\"filePathRelative\":\"for-you/learn.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>This site is work in progress, please come back later.</p>\\n<p>If you want further information about the DSF and how to implement use cases, please visit:</p>\\n<ul>\\n<li><a href=\\\"/intro/\\\" target=\\\"_blank\\\">Documentation Overview</a></li>\\n<li><a href=\\\"/stable/\\\" target=\\\"_blank\\\">Getting started</a></li>\\n<li><a href=\\\"/about/learnmore/contact.html\\\" target=\\\"_blank\\\">Contact us</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/for-you/learn.html.vue b/src/.vuepress/.temp/pages/for-you/learn.html.vue new file mode 100644 index 000000000..2c5d9b9d2 --- /dev/null +++ b/src/.vuepress/.temp/pages/for-you/learn.html.vue @@ -0,0 +1,13 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Work in progress</p> +<p>This site is work in progress, please come back later.</p> +<p>If you want further information about the DSF and how to implement use cases, please visit:</p> +<ul> +<li><RouteLink to="/intro/">Documentation Overview</RouteLink></li> +<li><RouteLink to="/stable/">Getting started</RouteLink></li> +<li><RouteLink to="/about/learnmore/contact.html">Contact us</RouteLink></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/hackathon/index.html.js b/src/.vuepress/.temp/pages/hackathon/index.html.js new file mode 100644 index 000000000..633633ded --- /dev/null +++ b/src/.vuepress/.temp/pages/hackathon/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/hackathon/index.html.vue" +const data = JSON.parse("{\"path\":\"/hackathon/\",\"title\":\"Hackathon\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Hackathon\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Vorbereitung\",\"slug\":\"vorbereitung\",\"link\":\"#vorbereitung\",\"children\":[{\"level\":3,\"title\":\"Netzwerkfreigaben\",\"slug\":\"netzwerkfreigaben\",\"link\":\"#netzwerkfreigaben\",\"children\":[]},{\"level\":3,\"title\":\"FHIR-Store\",\"slug\":\"fhir-store\",\"link\":\"#fhir-store\",\"children\":[]}]},{\"level\":2,\"title\":\"Installationshinweise\",\"slug\":\"installationshinweise\",\"link\":\"#installationshinweise\",\"children\":[{\"level\":3,\"title\":\"DSF\",\"slug\":\"dsf\",\"link\":\"#dsf\",\"children\":[]},{\"level\":3,\"title\":\"Prozessplugins\",\"slug\":\"prozessplugins\",\"link\":\"#prozessplugins\",\"children\":[]},{\"level\":3,\"title\":\"Weitere Anwendungen\",\"slug\":\"weitere-anwendungen\",\"link\":\"#weitere-anwendungen\",\"children\":[]}]},{\"level\":2,\"title\":\"Data Sharing Demodaten\",\"slug\":\"data-sharing-demodaten\",\"link\":\"#data-sharing-demodaten\",\"children\":[]}],\"readingTime\":{\"minutes\":1.91,\"words\":573},\"filePathRelative\":\"hackathon/index.md\",\"excerpt\":\"<!--<meta http-equiv=\\\"refresh\\\" content=\\\"0;url=https://audimax.heiconf.uni-heidelberg.de/jxh4-jxx2-tm6c-d37q\\\">-->\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+</p>\\n<ul>\\n<li>Montags, 13:00-14:00 Uhr</li>\\n<li>Ort: <a href=\\\"https://dsf.dev/sprechstunde\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://dsf.dev/sprechstunde</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/hackathon/index.html.vue b/src/.vuepress/.temp/pages/hackathon/index.html.vue new file mode 100644 index 000000000..9ba8b3c3b --- /dev/null +++ b/src/.vuepress/.temp/pages/hackathon/index.html.vue @@ -0,0 +1,80 @@ +<template><div><!--<meta http-equiv="refresh" content="0;url=https://audimax.heiconf.uni-heidelberg.de/jxh4-jxx2-tm6c-d37q">--> +<div class="hint-container tip"> +<p class="hint-container-title">Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+</p> +<ul> +<li>Montags, 13:00-14:00 Uhr</li> +<li>Ort: <a href="https://dsf.dev/sprechstunde" target="_blank" rel="noopener noreferrer">https://dsf.dev/sprechstunde</a></li> +</ul> +</div> +<h1 id="hackathon-vom-18-06-2024" tabindex="-1"><a class="header-anchor" href="#hackathon-vom-18-06-2024"><span>Hackathon vom 18.06.2024</span></a></h1> +<div class="hint-container tip"> +<p class="hint-container-title">Zusammenfassung</p> +<ul> +<li>Konferenz: <a href="https://audimax.heiconf.uni-heidelberg.de/jxh4-jxx2-tm6c-d37q" target="_blank" rel="noopener noreferrer">https://audimax.heiconf.uni-heidelberg.de/jxh4-jxx2-tm6c-d37q</a></li> +<li><a href="#vorbereitung">Vorbereitung</a></li> +<li><a href="#installationshinweise">Installationshinweise</a></li> +</ul> +</div> +<p>Wir laden Sie herzlich zu unserem kommenden Hackathon <strong>am 18.06. von 10:00 Uhr bis 15:30 Uhr</strong> ein. Diese Veranstaltung bietet die Gelegenheit, sich mit den neuesten Updates und Funktionen unserer Komponenten vertraut zu machen.</p> +<p>Agenda:</p> +<ol> +<li>Einführung in Neuerungen (10:00 - 11:00 Uhr): +<ul> +<li>Begrüßung und Einführung in die neuen Funktionen und Verbesserungen des DSFs</li> +<li>Präsentation der Änderungen der MII DSF-Prozessplugins, sowie von Blaze und Flare</li> +</ul> +</li> +<li>Updates MII-Komponenten (ab 11:00 Uhr bis verlängerter Pause, um NUM-DIZ-Meeting besuchen zu können): +<ul> +<li>DSF</li> +<li>Feasibility</li> +<li>Data Sharing</li> +<li>Data Transfer</li> +<li>KDS Report</li> +<li>Blaze</li> +<li>Flare mit neuer KDS Ontologie</li> +</ul> +</li> +<li>Testen des Prozessplugins "Data Sharing" (ab 14:15 Uhr): +<ul> +<li>Praktische Anwendung des "Data Sharing"-Prozessplugins auf unserer Testinfrastruktur.</li> +</ul> +</li> +</ol> +<p>Ziel der Veranstaltung ist es die Test- und Produktivsysteme möglichst aller Standorte auf den neusten Stand zu patchen.</p> +<h2 id="vorbereitung" tabindex="-1"><a class="header-anchor" href="#vorbereitung"><span>Vorbereitung</span></a></h2> +<p>In diesem Hackathon ist das Aktualisieren der Systeme ein aktiver Bestandteil und bedarf keiner speziellen Vorbereitung. Für das Testen der Data Sharing Prozesse sollten jedoch einige Voraussetzungen bereits vor dem Termin erfüllt sein.</p> +<h3 id="netzwerkfreigaben" tabindex="-1"><a class="header-anchor" href="#netzwerkfreigaben"><span>Netzwerkfreigaben</span></a></h3> +<p>Für den Hackathon werden wir primär die Test-DMS aus Heilbronn verwenden, dafür muss neben der Freigabe zur FDPG auch die Freigabe zum und vom MII-Test-System der HHN vorhanden sein (<a href="http://mii-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer">mii-test.gecko.hs-heilbronn.de</a>).</p> +<p>In diesem Kontext bietet es sich an, auch die Freigaben für weitere Test-DMSen zu beantragen. Weitere Details dazu befinden sich in der Liste der Firewallregeln im Test-Allowlist-Management-Tool (<a href="http://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer">allowlist-test.gecko.hs-heilbronn.de</a>) unter dem Punkt “Download Allowlist”. Wir planen während des Termins auch mit ausgewählten DIZen erste Funktionstests der Test-DMSen durchzuführen.</p> +<p>Wir empfehlen auch sicherzustellen, dass Sie Zugriff auf die Weboberfläche Ihres DSF-FHIR-Servers haben.</p> +<h3 id="fhir-store" tabindex="-1"><a class="header-anchor" href="#fhir-store"><span>FHIR-Store</span></a></h3> +<p>Zur Datenausleitung im Kontext des Data Sharing Prozesses werden wir FHIR Bundles mit Testdaten zur Verfügung stellen, die in Form eines FHIR Bundles auf einem FHIR Store gespeichert werden müssen. Dabei kann ein beliebiger FHIR Server (z.B. HAPI FHIR oder Blaze) verwendet werden. Es kann auch der FHIR Server verwendet werden, der z.B. für Feasibility im Testsystem genutzt wird.</p> +<p>Weitere Details zum Data Sharing Prozess sind hier zu finden:</p> +<p><a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/wiki" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-sharing/wiki</a></p> +<p>Eine Installation kann vor oder während des Hackathons durchgeführt werden.</p> +<h2 id="installationshinweise" tabindex="-1"><a class="header-anchor" href="#installationshinweise"><span>Installationshinweise</span></a></h2> +<h3 id="dsf" tabindex="-1"><a class="header-anchor" href="#dsf"><span>DSF</span></a></h3> +<p><a href="https://dsf.dev/stable/maintain/install.html" target="_blank" rel="noopener noreferrer">Installation</a> oder <a href="https://dsf.dev/stable/maintain/upgrade-from-1.html" target="_blank" rel="noopener noreferrer">Update</a></p> +<h3 id="prozessplugins" tabindex="-1"><a class="header-anchor" href="#prozessplugins"><span>Prozessplugins</span></a></h3> +<ul> +<li>DSF Ping Pong 1.0.1.0 <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases/tag/v1.0.1.0" target="_blank" rel="noopener noreferrer">Release Notes</a></li> +<li>DSF Allowlist Plugin 1.0.0.1 <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases/tag/v1.0.0.1" target="_blank" rel="noopener noreferrer">Release Notes</a></li> +<li>MII Feasibility 1.0.0.5 <a href="https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup" target="_blank" rel="noopener noreferrer">Instructions</a></li> +<li>MII Process Report 1.1.0.0 for Test Infrastructure <a href="https://github.com/medizininformatik-initiative/mii-process-report/wiki/Process-Report-Deployment-v1.1.x.x" target="_blank" rel="noopener noreferrer">Instructions</a>. Please use 1.0.x.x for Prod for now <a href="https://github.com/medizininformatik-initiative/mii-process-report/wiki/Process-Report-Deployment-v1.0.x.x" target="_blank" rel="noopener noreferrer">Instructions</a></li> +<li>MII Process Data Transfer 1.0.1.0 <a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/wiki/Process-Data-Transfer-Deployment-v1.0.x.x" target="_blank" rel="noopener noreferrer">Instructions</a></li> +<li>MII Process Data Sharing 1.0.0.1 <a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/wiki/Process-Data-Sharing-Deployment-v1.0.x.x" target="_blank" rel="noopener noreferrer">Instructions</a></li> +</ul> +<h3 id="weitere-anwendungen" tabindex="-1"><a class="header-anchor" href="#weitere-anwendungen"><span>Weitere Anwendungen</span></a></h3> +<ul> +<li>Flare <a href="https://github.com/medizininformatik-initiative/flare" target="_blank" rel="noopener noreferrer">Instructions</a></li> +<li>Blaze 0.27.1 <a href="https://github.com/samply/blaze/blob/master/docs/deployment/README.md" target="_blank" rel="noopener noreferrer">Instructions</a></li> +</ul> +<h2 id="data-sharing-demodaten" tabindex="-1"><a class="header-anchor" href="#data-sharing-demodaten"><span>Data Sharing Demodaten</span></a></h2> +<ul> +<li><a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/blob/develop/src/test/resources/fhir/Bundle/Dic1FhirStore_Demo_Bundle.xml" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-sharing/blob/develop/src/test/resources/fhir/Bundle/Dic1FhirStore_Demo_Bundle.xml</a></li> +</ul> +<p>Falls Sie Fragen zum Hackathon oder der Installation des DSF haben, melden Sie sich gerne über den DSF-Community Zulip-Channel oder <a href="mailto:dsf-gecko@hs-heilbronn.de" target="_blank" rel="noopener noreferrer">dsf-gecko@hs-heilbronn.de</a>.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/index.html.js b/src/.vuepress/.temp/pages/index.html.js new file mode 100644 index 000000000..0c2058acf --- /dev/null +++ b/src/.vuepress/.temp/pages/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/index.html.vue" +const data = JSON.parse("{\"path\":\"/\",\"title\":\"Data Sharing Framework\",\"lang\":\"en-US\",\"frontmatter\":{\"home\":true,\"icon\":\"home\",\"title\":\"Data Sharing Framework\",\"heroImage\":\"/photos/home/logo.svg\",\"heroText\":\"Data Sharing Framework\",\"tagline\":\"A performant, secure, and innovative framework that enables biomedical researchers to extract value from routine data.\",\"features\":[{\"title\":\"Introduction\",\"icon\":\"info\",\"details\":\"Introduction to the DSF and informations about Use-Cases/Projects.\",\"link\":\"/intro/\"},{\"title\":\"Get Started\",\"icon\":\"launch\",\"details\":\"Get technical insights and install the DSF | Develop Process Plugins.\",\"link\":\"/stable/\"},{\"title\":\"About Us\",\"icon\":\"creative\",\"details\":\"Contact, partners, the team behind the DSF and more... Join our community!\",\"link\":\"/about/learnmore/\"},{\"title\":\"GitHub\",\"icon\":\"github\",\"details\":\"Take a look at the open-source reference implementation.\",\"link\":\"https://github.com/datasharingframework/dsf\"}],\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Rolf Hansen Memorial Award 2023 goes to Hauke Hund\",\"slug\":\"rolf-hansen-memorial-award-2023-goes-to-hauke-hund\",\"link\":\"#rolf-hansen-memorial-award-2023-goes-to-hauke-hund\",\"children\":[]}],\"readingTime\":{\"minutes\":1.46,\"words\":439},\"filePathRelative\":\"index.md\",\"excerpt\":\"<hr>\\n<h1>Data Sharing Framework</h1>\\n<p>The <strong>Data Sharing Framework (DSF)</strong> is a concept for a secure middleware to distribute data sharing processes based on the BPMN 2.0 and FHIR R4 standards. The DSF is used to support biomedical research with routine data, aiming to extract, merge, pseudonymize and provide data stored in multiple distributed organizations. Every participating site runs a FHIR endpoint accessible by other sites and a business process engine in the local secured network. The process engines execute BPMN processes in order to coordinate local and remote steps necessary to enable cross-site data sharing or feasibility analyses. This includes access to local data repositories, use-and-access-committee decision support, consent filtering, and privacy preserving record-linkage and pseudonymization. The aim is to enable secure and syntactically-, semantically- and process-interoperable data exchange across organizational boundaries. The secure communication infrastructure is funded by the German Federal Ministry of Education and Research within the Medical Informatics structure as <em><a href=\\\"https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">DSF Community</a></em>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/index.html.vue b/src/.vuepress/.temp/pages/index.html.vue new file mode 100644 index 000000000..4a2f067ba --- /dev/null +++ b/src/.vuepress/.temp/pages/index.html.vue @@ -0,0 +1,20 @@ +<template><div><hr> +<h1 id="data-sharing-framework" tabindex="-1"><a class="header-anchor" href="#data-sharing-framework"><span>Data Sharing Framework</span></a></h1> +<p>The <strong>Data Sharing Framework (DSF)</strong> is a concept for a secure middleware to distribute data sharing processes based on the BPMN 2.0 and FHIR R4 standards. The DSF is used to support biomedical research with routine data, aiming to extract, merge, pseudonymize and provide data stored in multiple distributed organizations. Every participating site runs a FHIR endpoint accessible by other sites and a business process engine in the local secured network. The process engines execute BPMN processes in order to coordinate local and remote steps necessary to enable cross-site data sharing or feasibility analyses. This includes access to local data repositories, use-and-access-committee decision support, consent filtering, and privacy preserving record-linkage and pseudonymization. The aim is to enable secure and syntactically-, semantically- and process-interoperable data exchange across organizational boundaries. The secure communication infrastructure is funded by the German Federal Ministry of Education and Research within the Medical Informatics structure as <em><a href="https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php" target="_blank" rel="noopener noreferrer">DSF Community</a></em>.</p> +<figure><img src="/photos/info/introduction/dsf-concept.png" alt="DSF concept" tabindex="0" loading="lazy"><figcaption>DSF concept</figcaption></figure> +<h2 id="rolf-hansen-memorial-award-2023-goes-to-hauke-hund" tabindex="-1"><a class="header-anchor" href="#rolf-hansen-memorial-award-2023-goes-to-hauke-hund"><span>Rolf Hansen Memorial Award 2023 goes to <a href="https://github.com/hhund" target="_blank" rel="noopener noreferrer">Hauke Hund</a></span></a></h2> +<p>We are very pleased to have won the Rolf Hansen Memorial Award at <a href="https://www.mie2023.org/" target="_blank" rel="noopener noreferrer">EFMI MIE 2023</a> in Gothenburg. The Rolf Hansen Memorial Award is presented annually by the European Federation for Medical Informatics (EFMI) for an outstanding paper as well as for an excellent presentation. It is named after Rolf Hansen (1931-1993), a well-known Norwegian medical informatician and former president of EFMI. Hauke Hund presented his Paper: <em>No Transfer Without Validation: A Data Sharing Framework Use Case</em> in May at the EFMI MIE. <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI230066" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI230066 </a></p> +<!-- +## Upcoming Events +::: info TODO title +::: left +TODO text +::: +--> +<h4 id="feel-free-to-contact-us-via-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible" tabindex="-1"><a class="header-anchor" href="#feel-free-to-contact-us-via-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible"><span>Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de">dsf-gecko@hs-heilbronn.de</a> and we will take care of your request as soon as possible.</span></a></h4> +<div class="image-container"> + <img src="/photos/learnmore/funding/bmbf-mii.png"> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/index.html.js b/src/.vuepress/.temp/pages/intro/index.html.js new file mode 100644 index 000000000..34d3b709b --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/index.html.vue" +const data = JSON.parse("{\"path\":\"/intro/\",\"title\":\"Documentation\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Documentation\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":22},\"filePathRelative\":\"intro/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li>Documentation\\n<ul>\\n<li><a href=\\\"/intro/info/introduction.html\\\" target=\\\"_blank\\\">Introduction</a></li>\\n<li><a href=\\\"/intro/info/basics.html\\\" target=\\\"_blank\\\">Basics & Standards</a></li>\\n<li><a href=\\\"/intro/info/architecture.html\\\" target=\\\"_blank\\\">Architecture</a></li>\\n<li><a href=\\\"/intro/info/security.html\\\" target=\\\"_blank\\\">Security</a></li>\\n<li><a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">Allow Lists</a></li>\\n<li><a href=\\\"/intro/info/process-plugins.html\\\" target=\\\"_blank\\\">Process Plugins</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/index.html.vue b/src/.vuepress/.temp/pages/intro/index.html.vue new file mode 100644 index 000000000..0badf178a --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/index.html.vue @@ -0,0 +1,16 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li>Documentation +<ul> +<li><RouteLink to="/intro/info/introduction.html">Introduction</RouteLink></li> +<li><RouteLink to="/intro/info/basics.html">Basics & Standards</RouteLink></li> +<li><RouteLink to="/intro/info/architecture.html">Architecture</RouteLink></li> +<li><RouteLink to="/intro/info/security.html">Security</RouteLink></li> +<li><RouteLink to="/intro/info/allowList.html">Allow Lists</RouteLink></li> +<li><RouteLink to="/intro/info/process-plugins.html">Process Plugins</RouteLink></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/allowList.html.js b/src/.vuepress/.temp/pages/intro/info/allowList.html.js new file mode 100644 index 000000000..5521db502 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/allowList.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/allowList.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/allowList.html\",\"title\":\"Allow Lists\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow Lists\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Goal\",\"slug\":\"goal\",\"link\":\"#goal\",\"children\":[]},{\"level\":2,\"title\":\"Allow List Managment\",\"slug\":\"allow-list-managment\",\"link\":\"#allow-list-managment\",\"children\":[]}],\"readingTime\":{\"minutes\":0.65,\"words\":196},\"filePathRelative\":\"intro/info/allowList.md\",\"excerpt\":\"<h2>Goal</h2>\\n<p>The main objective is to allow only authorized organizations to do what \\\"we\\\" allow them to do (e.g. query data).<br>\\nFirst, we need a list of organizations that we trust. Secondly, we need a way to ensure that the other party is a member of the parent organization. Thirdly, a list of actions we want to allow the organization to perform is needed. An organization can have different roles in different use cases.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/allowList.html.vue b/src/.vuepress/.temp/pages/intro/info/allowList.html.vue new file mode 100644 index 000000000..77037a2ac --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/allowList.html.vue @@ -0,0 +1,11 @@ +<template><div><h2 id="goal" tabindex="-1"><a class="header-anchor" href="#goal"><span>Goal</span></a></h2> +<p>The main objective is to allow only authorized organizations to do what "we" allow them to do (e.g. query data).<br> +First, we need a list of organizations that we trust. Secondly, we need a way to ensure that the other party is a member of the parent organization. Thirdly, a list of actions we want to allow the organization to perform is needed. An organization can have different roles in different use cases.</p> +<p>The Allow List consists of Organization-, Endpoint- and OrganisationAffiliation- resources. With these resources the allow list defines communication partners and and parent organizations like research consortia and groups as well as the roles of each organization. Each DSF FHIR server stores their own allow list. To make sure that processes can be executed, parties must allow access via their allow list.</p> +<figure><img src="/photos/info/allowList/allowList-architecture.png" alt="Architecture" tabindex="0" loading="lazy"><figcaption>Architecture</figcaption></figure> +<h2 id="allow-list-managment" tabindex="-1"><a class="header-anchor" href="#allow-list-managment"><span>Allow List Managment</span></a></h2> +<p><RouteLink to="/stable/maintain/allowList-mgm.html">Here</RouteLink> you can read all the information if you want to create or update an Allow List.</p> +<h4 id="feel-free-to-contact-us-via-e-mail-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible" tabindex="-1"><a class="header-anchor" href="#feel-free-to-contact-us-via-e-mail-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible"><span>Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible.</span></a></h4> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/architecture.html.js b/src/.vuepress/.temp/pages/intro/info/architecture.html.js new file mode 100644 index 000000000..685553cb0 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/architecture.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/architecture.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/architecture.html\",\"title\":\"Architecture\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Architecture\",\"icon\":\"structure\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"DSF FHIR Server 📫\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":2,\"title\":\"Business Process Engine (BPE)\",\"slug\":\"business-process-engine-bpe\",\"link\":\"#business-process-engine-bpe\",\"children\":[]},{\"level\":2,\"title\":\"Flexible Deployment\",\"slug\":\"flexible-deployment\",\"link\":\"#flexible-deployment\",\"children\":[]},{\"level\":2,\"title\":\"Network Setup & Additional Reverse Proxy in external DMZ\",\"slug\":\"network-setup-additional-reverse-proxy-in-external-dmz\",\"link\":\"#network-setup-additional-reverse-proxy-in-external-dmz\",\"children\":[]}],\"readingTime\":{\"minutes\":1.94,\"words\":582},\"filePathRelative\":\"intro/info/architecture.md\",\"excerpt\":\"<p>The Data Sharing Framework implements a distributed business process engine based on the BPMN 2.0 and FHIR R4 standards. Every participating organisation (e.g. ORG. A) runs a FHIR endpoint accessible by other sites and a business process engine (BPE) in the local secured network. Once the DSF has been installed in an organisation, it can be used for multiple use cases.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/architecture.html.vue b/src/.vuepress/.temp/pages/intro/info/architecture.html.vue new file mode 100644 index 000000000..09c0929ff --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/architecture.html.vue @@ -0,0 +1,25 @@ +<template><div><p>The Data Sharing Framework implements a distributed business process engine based on the BPMN 2.0 and FHIR R4 standards. Every participating organisation (e.g. ORG. A) runs a FHIR endpoint accessible by other sites and a business process engine (BPE) in the local secured network. Once the DSF has been installed in an organisation, it can be used for multiple use cases.</p> +<figure><img src="/photos/info/architecture/architecture1.png" alt="Simplified DSF Architecture" tabindex="0" loading="lazy"><figcaption>Simplified DSF Architecture</figcaption></figure> +<p>The following architecture diagram also shows three organisations, each of which has installed the DSF. The FHIR endpoint (green) is located in a demilitarised zone (DMZ) and is accessible from outside for communication with other organisations. It can be compared to a mailbox. The Business Process Engine (BPE - blue) is located in the intranet of an organisation and is responsible for the execution of processes. The metaphor: control centre helps here.</p> +<figure><img src="/photos/info/architecture/architecture.svg" alt="" tabindex="0" loading="lazy" data-mode="lightmode-only"><figcaption></figcaption></figure> +<figure><img src="/photos/info/architecture/architecture-dark.svg" alt="DSF Architecture" tabindex="0" loading="lazy" data-mode="darkmode-only"><figcaption>DSF Architecture</figcaption></figure> +<h2 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server 📫</span></a></h2> +<p>As mentioned above, the externally accessible DSF FHIR server acts as a mailbox for communication. This means that an organisation creates a task resource in its DSF and drops the task resource (letters) into the mailbox of another organisation, requesting that something happen. Task resources have been explained in more detail in the section <a href="basics">Basics and Standards</a>.<br> +It is important to understand that the DSF FHIR server is not used for persisting medical data.</p> +<figure><img src="/photos/info/architecture/fhir-server.svg" alt="" tabindex="0" loading="lazy" data-mode="lightmode-only"><figcaption></figcaption></figure> +<figure><img src="/photos/info/architecture/fhir-server-dark.svg" alt="DSF FHIR Server" tabindex="0" loading="lazy" data-mode="darkmode-only"><figcaption>DSF FHIR Server</figcaption></figure> +<h2 id="business-process-engine-bpe" tabindex="-1"><a class="header-anchor" href="#business-process-engine-bpe"><span>Business Process Engine (BPE)</span></a></h2> +<p>The BPE located in the secure internal network executes the processes (BPMN/Java). The BPE is deployed in the internal network and has access to the local systems, such as the organisation's own FHIR server, on which medical data is stored. These FHIR servers are not to be confused with the DSF FHIR server, on which no medical data is persisted.<br> +Different processes can be executed simultaneously. For this, only a new process plugin file has to be added and configured. More about this in the <a href="process-plugins">Process Plugins</a>.</p> +<figure><img src="/photos/info/architecture/bpe-light.svg" alt="" tabindex="0" loading="lazy" data-mode="lightmode-only"><figcaption></figcaption></figure> +<figure><img src="/photos/info/architecture/bpe-dark.svg" alt="BPE" tabindex="0" loading="lazy" data-mode="darkmode-only"><figcaption>BPE</figcaption></figure> +<p>The DSF BPE uses websocket (WSS) and webservice (HTTPS) connections to communicate with the DSF FHIR server. FHIR resources are created, read, updated and deleted via HTTP requests against the FHIR webservice API. The FHIR subscription mechanism is used to communicate Task resources with status 'requested' and QuestionnaireResponse resources with status 'completed' to the BPE via websockets. When the BPE starts and before the websocket connections are established, 'requested' Task resources and 'completed' QuestionnaireResponse not seen by the BPE are read via webservice requests.</p> +<h2 id="flexible-deployment" tabindex="-1"><a class="header-anchor" href="#flexible-deployment"><span>Flexible Deployment</span></a></h2> +<p>The deployment of the architecture is flexible. The organisations can be deployed as a <em>star</em> schema (left) or as a <em>mesh</em> schema (right). In the Star schema (left), all Data Integration Centres (DIC) are connected to a central node (CRR - Central Research Repository), which transfers the information to all nodes (DIC). For security reasons, a data transfer hub (DTH) is connected upstream, which provides additional security so that the medical data is never transferred together with the authenticating data.</p> +<p>In the mesh scheme (right), the nodes (DIC) are all directly connected to each other and the information is transferred from node to node. Here in the FDPG (Forschungsdatenportal - Research Data Portal), the data can then be accessed for research purposes. More about this <a href="/intro/use-cases/feasibility">here</a>.</p> +<p><img src="/photos/info/architecture/star.png" alt="Star schema" width="400" height="300" loading="lazy"> <img src="/photos/info/architecture/mesh.png" alt="Mesh schema" width="350" height="300" loading="lazy"></p> +<h2 id="network-setup-additional-reverse-proxy-in-external-dmz" tabindex="-1"><a class="header-anchor" href="#network-setup-additional-reverse-proxy-in-external-dmz"><span>Network Setup & Additional Reverse Proxy in external DMZ</span></a></h2> +<p>You can find more information about the network setup <a href="networkSetup">here</a></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/basics.html.js b/src/.vuepress/.temp/pages/intro/info/basics.html.js new file mode 100644 index 000000000..c68d983e5 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/basics.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/basics.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/basics.html\",\"title\":\"Basics and Standards\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Basics and Standards\",\"icon\":\"study\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Interoperability\",\"slug\":\"interoperability\",\"link\":\"#interoperability\",\"children\":[]},{\"level\":2,\"title\":\"HL7 FHIR 🔥\",\"slug\":\"hl7-fhir\",\"link\":\"#hl7-fhir\",\"children\":[]},{\"level\":2,\"title\":\"BPMN\",\"slug\":\"bpmn\",\"link\":\"#bpmn\",\"children\":[]},{\"level\":2,\"title\":\"Why are we using FHIR and BPMN?\",\"slug\":\"why-are-we-using-fhir-and-bpmn\",\"link\":\"#why-are-we-using-fhir-and-bpmn\",\"children\":[]}],\"readingTime\":{\"minutes\":2.59,\"words\":778},\"filePathRelative\":\"intro/info/basics.md\",\"excerpt\":\"<p>Here you can find some basic information about interoperability and the standards were using within the DSF before we go into details about the architecture. Here we only describe how the standards (FHIR and BPMN) are used within the DSF. If you want to gain a deeper knowledge of the standards, we recommend visiting these websites: <a href=\\\"https://www.hl7.org/fhir/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">HL7 FHIR</a> and <a href=\\\"https://www.bpmn.org/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">BPMN</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/basics.html.vue b/src/.vuepress/.temp/pages/intro/info/basics.html.vue new file mode 100644 index 000000000..83f42adf5 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/basics.html.vue @@ -0,0 +1,27 @@ +<template><div><p>Here you can find some basic information about interoperability and the standards were using within the DSF before we go into details about the architecture. Here we only describe how the standards (FHIR and BPMN) are used within the DSF. If you want to gain a deeper knowledge of the standards, we recommend visiting these websites: <a href="https://www.hl7.org/fhir/" target="_blank" rel="noopener noreferrer">HL7 FHIR</a> and <a href="https://www.bpmn.org/" target="_blank" rel="noopener noreferrer">BPMN</a></p> +<h2 id="interoperability" tabindex="-1"><a class="header-anchor" href="#interoperability"><span>Interoperability</span></a></h2> +<p>Interoperability is the ability of different systems to work together as seamlessly as possible. We can divide interoperability into four levels.</p> +<ul> +<li>The <em>foundational level</em> defines the basic interconnectivity requirements which are necessary for a system or application to securely transmit data to and receive data from another system or application. Techniques such as HTTPS or REST are used for this.</li> +<li>The second level is the <em>structural level</em>. It defines the format and the syntax of the data exchange. Therefore, data formats like JSON or XML can be used.</li> +<li>The <em>semantic level</em> ensures the correct interpretation of the contents of the exchanged data between the different systems. Therefore, information models as FHIR or CDA or medical terminology systems like SNOMED CT or ICD can be used.</li> +<li>The final level, the <em>organizational level</em>, includes policy, social, legal and organizational aspects that enable secure, seamless and timely communication and use of data both within and between organizations. And importantly, these components enable shared consent, trust and integrated end-user processes and workflows.</li> +</ul> +<figure><img src="/photos/info/basics/interoperability.png" alt="Levels of interoperability" width="600" tabindex="0" loading="lazy"><figcaption>Levels of interoperability</figcaption></figure> +<h2 id="hl7-fhir" tabindex="-1"><a class="header-anchor" href="#hl7-fhir"><span>HL7 FHIR 🔥</span></a></h2> +<p><a href="https://www.hl7.org/fhir/" target="_blank" rel="noopener noreferrer">HL7 FHIR</a> is a standard for data exchange that can be used as an information model for communication within and between systems. The standard is based on resources, references and profiles. With this concept, FHIR offers interoperability out of the box. The resources describe data formats. 150 specified resources cover the entire health system. An example of a resource would be a patient, which consists of data such as name or gender. These resources can refer to other resources by means of references. This connects the information units into a network. For seamless exchange of information, FHIR supports RESTful architectures and web standards such as XML or JSON, which makes it easier for developers to use FHIR.<br> +The FHIR profiles can be understood as a set of rules. They explain, for example, which attributes must be mandatorily specified or which terminology may be used. In addition, profiles and controlled vocabulary can be validated.</p> +<h2 id="bpmn" tabindex="-1"><a class="header-anchor" href="#bpmn"><span>BPMN</span></a></h2> +<p><a href="https://www.bpmn.org/" target="_blank" rel="noopener noreferrer">Business Process Modelling Notation</a> is a modelling language that can be used to model and implement processes. The models can be used for the documentation of processes and for communication between different stakeholders. Furthermore, BPMN forms a standardised bridge between process design and process implementation. This is because it simplifies implementation. These processes are executed by a Business Process Engine. Basically, a BPE is a server that can read and execute the business process. More about this in the section on architecture.</p> +<figure><img src="/photos/info/basics/bpmn1.png" alt="Example of a BPMN model (Ping-Pong-Process of the DSF)" tabindex="0" loading="lazy"><figcaption>Example of a BPMN model (Ping-Pong-Process of the DSF)</figcaption></figure> +<h2 id="why-are-we-using-fhir-and-bpmn" tabindex="-1"><a class="header-anchor" href="#why-are-we-using-fhir-and-bpmn"><span>Why are we using FHIR and BPMN?</span></a></h2> +<p>On the one hand we use FHIR because of the mentioned benefits. On the other hand FHIR fits great with BPMN and these two in combination are a great fit for what we do:<br> +<em>Execute distributed data sharing Processes.</em></p> +<p>We do not need all 150 FHIR resources. The following FHIR resources are the ones we need and have implemented: <em>ActivityDefinition, Binary, Bundle, CodeSystem, DocumentReference, Endpoint, Group, Library, Measure, MeasureReport, NamingSystem, Organization, Questionnaire, QuestionnaireResponse, ResearchStudy, StructureDefinition, Subscription, Task and ValueSet.</em></p> +<p>Don't worry, it is not important to understand them all now. But to understand why we use FHIR and BPMN, it is important to look at the <em>ActivityDefinition</em> and <em>TaskResources</em> on the FHIR side and the <em>Message Events</em> on the BPMN side.<br> +In the following picture you can see parts of BPMN. These <em>Message Events</em> enable the communication between different organizations. Every time there is a <em>Message Event</em> between two business processes, there is a corresponding <em>TaskResource</em> on the FHIR side. When one organization sends a message for example “do some work” to another organization or when we send a message to ourselves to start or continue a process, we do this by creating a FHIR <em>TaskResource</em> with the status “requested”. After that the Business Process Engine starts the work and the status switches to “in-progress” and if the work is done to “completed” or if there is a problem to “failed”.</p> +<p>The <em>ActivityDefinition</em> is needed to publish what can be done in an instance. That means the <em>ActivityDefinition</em> contains the process description with the authorisation who is allowed to send a message.</p> +<figure><img src="/photos/info/basics/bpmn2.png" alt="BPMN MessageEvents" width="250" height="400" tabindex="0" loading="lazy"><figcaption>BPMN <em>MessageEvents</em></figcaption></figure> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/index.html.js b/src/.vuepress/.temp/pages/intro/info/index.html.js new file mode 100644 index 000000000..8a5b8f272 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/index.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/\",\"title\":\"Info\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Info\",\"article\":false,\"feed\":false,\"sitemap\":false,\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":null,\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/index.html.vue b/src/.vuepress/.temp/pages/intro/info/index.html.vue new file mode 100644 index 000000000..33da939f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/index.html.vue @@ -0,0 +1,3 @@ +<template><div><Catalog/></div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/introduction.html.js b/src/.vuepress/.temp/pages/intro/info/introduction.html.js new file mode 100644 index 000000000..f06b0e4cb --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/introduction.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/introduction.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/introduction.html\",\"title\":\"Introduction\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Introduction\",\"icon\":\"customize\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.05,\"words\":316},\"filePathRelative\":\"intro/info/introduction.md\",\"excerpt\":\"<p>The <a href=\\\"https://www.bmbf.de/bmbf/en/home/home_node.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">German Federal Ministry of Education and Research</a> is funding the <a href=\\\"https://www.medizininformatik-initiative.de/en/start\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Medical Informatics Initiative</a> with the aim of making routine data available digitally, reliably and quickly for medical research. University hospitals have founded consortia with partners such as research institutions and other companies to create the conditions for research and patient care to share their data across sites. Data Integration Centers (DIC) have been established at the university hospitals and partner institutions to create the technical and organizational conditions for data exchange between patient care and medical research.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/introduction.html.vue b/src/.vuepress/.temp/pages/intro/info/introduction.html.vue new file mode 100644 index 000000000..03f0bd130 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/introduction.html.vue @@ -0,0 +1,10 @@ +<template><div><p>The <a href="https://www.bmbf.de/bmbf/en/home/home_node.html" target="_blank" rel="noopener noreferrer">German Federal Ministry of Education and Research</a> is funding the <a href="https://www.medizininformatik-initiative.de/en/start" target="_blank" rel="noopener noreferrer">Medical Informatics Initiative</a> with the aim of making routine data available digitally, reliably and quickly for medical research. University hospitals have founded consortia with partners such as research institutions and other companies to create the conditions for research and patient care to share their data across sites. Data Integration Centers (DIC) have been established at the university hospitals and partner institutions to create the technical and organizational conditions for data exchange between patient care and medical research.</p> +<figure><img src="/photos/learnmore/funding/mii.png" alt="" width="300" height="150" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +<p>The <strong>Data Sharing Framework (DSF)</strong> was developed within the HiGHmed consortium of the Medical Informatics Initiative and is now funded as an independent project by the German Federal Ministry of Education and Research within the Medical Informatics structure as <em><a href="https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php" target="_blank" rel="noopener noreferrer">DSF Community</a></em>.</p> +<p>The DSF is a concept for a secure middleware to distribute data sharing processes, aiming to extract, merge, pseudonymize and provide data stored in multiple distributed DICs. A researcher can use the DSF for example to submit feasibility queries to several DICs and thus has the opportunity to obtain sufficient data from different locations for his or her research. By using international standards such as FHIR and BPMN 2.0, the problem of heterogeneous data models, primary systems, architectures and federated legislation between DICs can be solved. The aim is to enable secure and syntactically-, semantically- and process-interoperable data exchange across organisational boundaries.</p> +<figure><img src="/photos/info/introduction/dsf-concept.png" alt="DSF concept" tabindex="0" loading="lazy"><figcaption>DSF concept</figcaption></figure> +<p>The DSF is a secure communication infrastructure, that (1) scales with communication relationships, (2) orchestrates processes and instances, (3) separates execution logic from program code, (4) enables automated and user-centeric process steps ​(5) and can be used for heterogeny structures.</p> +<figure><img src="/photos/info/introduction/dic-structure.png" alt="Federated data exchange between distributed DICs (CRP=Central Research Portal, DMU=Data Management Unit)" width="500" height="320" tabindex="0" loading="lazy"><figcaption>Federated data exchange between distributed DICs (CRP=Central Research Portal, DMU=Data Management Unit)</figcaption></figure> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/networkSetup.html.js b/src/.vuepress/.temp/pages/intro/info/networkSetup.html.js new file mode 100644 index 000000000..d5eb5b000 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/networkSetup.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/networkSetup.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/networkSetup.html\",\"title\":\"Network Setup and General Architecture\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Network Setup and General Architecture\",\"icon\":\"customize\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Additional Reverse Proxy in external DMZ\",\"slug\":\"additional-reverse-proxy-in-external-dmz\",\"link\":\"#additional-reverse-proxy-in-external-dmz\",\"children\":[]}],\"readingTime\":{\"minutes\":1.62,\"words\":486},\"filePathRelative\":\"intro/info/networkSetup.md\",\"excerpt\":\"<p>The Data Sharing Framework consists of two components: A FHIR Endpoint Server used to except Task resources and provide resources for download by other organizations and a Business Process Engine Server run internal and not accessible by other organization to execute and coordinate processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/networkSetup.html.vue b/src/.vuepress/.temp/pages/intro/info/networkSetup.html.vue new file mode 100644 index 000000000..3d2b27935 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/networkSetup.html.vue @@ -0,0 +1,64 @@ +<template><div><p>The Data Sharing Framework consists of two components: A FHIR Endpoint Server used to except Task resources and provide resources for download by other organizations and a Business Process Engine Server run internal and not accessible by other organization to execute and coordinate processes.</p> +<figure><img src="/photos/guideline/generalInformation/highmed_dsf_network_setup.svg" alt="Network Setup Diagramm" tabindex="0" loading="lazy"><figcaption>Network Setup Diagramm</figcaption></figure> +<ul> +<li>FHIR Reverse Proxy: The FHIR Reverse Proxy is used to terminate incoming https connections to the FHIR App Server. The Reverse Proxy needs to be accessible on port 443 from the internet. Incoming https connection will be delegate as http on a docker internal network to the FHIR App Server.</li> +<li>FHIR App Server: The FHIR App Server is used as a FHIR Endpoint for incoming Task resources and providing resources for download by other organizations. In order to validate incoming FHIR resources the server will communicate with FHIR Servers at other organizations. Access to resources and authorization for creating or updating resources is granted based on the content of the resource and/or based on the client (identified by its client certificate) being part of an allow list. JDBC connections to the FHIR DB Server</li> +<li>FHIR DB Server: PostgreSQL database for the FHIR App Server.</li> +<li>BPE App Server: The BPE App Server is executing BPMN 2.0 business processes with the included business process engine. Automatic BPMN service tasks are used for example to check resource, access the PDP- and MPI-servers as well as the MDAT repository. The calculation of record linkage bit vectors (Record Bloom Filters) is also performed using an automatic service task. As of version 0.3.0 the BPE server does not provide any webservices for modifying an server resources.</li> +<li>BPE DB Server: PostgreSQL database for the BPE App Server.</li> +<li>PDP: IHE Policy Decision Point for deciding on patient consent.</li> +<li>MDAT Repo: Repository (e.g. openEHR) for storing medical data (MDAT).</li> +<li>MPI: IHE Master Patient Index for storing identifying patient date (IDAT) e.g. first name, last name, date of birth.</li> +<li>Cohort Browser: Example for a system to trigger patient cohort size estimations across multiple organizations.</li> +</ul> +<p>More information on Client- and Server-Certificates are available on the dedicated wiki page: <a href="Authentication">Authentication: Client/Server Certificates</a></p> +<h2 id="additional-reverse-proxy-in-external-dmz" tabindex="-1"><a class="header-anchor" href="#additional-reverse-proxy-in-external-dmz"><span>Additional Reverse Proxy in external DMZ</span></a></h2> +<p>In some organizations an additional reverse proxy in an external DMZ is needed. This can be accomplished by using for example nginx or haproxy as a TCP-Proxy. Example configurations routing traffic using SNI can be found below. Configuring an additional reverse proxy to terminate the incoming TLS connection early is not recommended.</p> +<figure><img src="/photos/guideline/generalInformation/highmed_dsf_network_setup_ext_dmz.svg" alt="Network Setup Diagramm" tabindex="0" loading="lazy"><figcaption>Network Setup Diagramm</figcaption></figure> +<!-- +**nginx** +``` +http { + # ... +} + +stream { + map $ssl_preread_server_name $name { + fhir.example.com fhir; + } + + upstream fhir { + server 192.168.0.1:443; + } + + server { + listen 443; + proxy_pass $name; + ssl_preread on; + } +} +``` + +**haproxy** +``` +defaults + timeout connect 5s + timeout client 30s + timeout server 30s + +frontend ingress + bind :443 + mode tcp + + tcp-request inspect-delay 5s + tcp-request content accept if { req_ssl_hello_type 1 } + use_backend fhir if { req.ssl_sni fhir.example.com } + +backend fhir + mode tcp + + server fhir 192.168.0.1:443 +``` +--></div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/process-plugins.html.js b/src/.vuepress/.temp/pages/intro/info/process-plugins.html.js new file mode 100644 index 000000000..c18e11b5b --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/process-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/process-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/process-plugins.html\",\"title\":\"Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"BPMN: Example\",\"slug\":\"bpmn-example\",\"link\":\"#bpmn-example\",\"children\":[]},{\"level\":2,\"title\":\"Ping Pong Process\",\"slug\":\"ping-pong-process\",\"link\":\"#ping-pong-process\",\"children\":[{\"level\":3,\"title\":\"Autostart Ping Process\",\"slug\":\"autostart-ping-process\",\"link\":\"#autostart-ping-process\",\"children\":[]},{\"level\":3,\"title\":\"Ping Process\",\"slug\":\"ping-process\",\"link\":\"#ping-process\",\"children\":[]},{\"level\":3,\"title\":\"Pong Process\",\"slug\":\"pong-process\",\"link\":\"#pong-process\",\"children\":[]}]}],\"readingTime\":{\"minutes\":1.8,\"words\":540},\"filePathRelative\":\"intro/info/process-plugins.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>It is important to understand that the DSF is <em>only</em> the silent helper in the background: a middleware. The DSF is use case agnostic. This means that process plugins make it possible to execute almost any use case you can imagine with the DSF. Process plugins provide individual functionality. For example, it is possible to use the Ping Pong process to test bilateral communication or the <a href=\\\"/intro/use-cases/feasibility\\\">Feasibility process</a> to perform feasibility queries for research.<br>\\nHowever, it is possible to deploy several process plugins together, even the same process plugin in different versions. A process plugin is basically an archive of BPMN 2.0 models, FHIR R4 resources and Java code. This process plugin is deployed as a Jar file on the BPE.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/process-plugins.html.vue b/src/.vuepress/.temp/pages/intro/info/process-plugins.html.vue new file mode 100644 index 000000000..9c9ffc7f9 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/process-plugins.html.vue @@ -0,0 +1,50 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>It is important to understand that the DSF is <em>only</em> the silent helper in the background: a middleware. The DSF is use case agnostic. This means that process plugins make it possible to execute almost any use case you can imagine with the DSF. Process plugins provide individual functionality. For example, it is possible to use the Ping Pong process to test bilateral communication or the <a href="/intro/use-cases/feasibility">Feasibility process</a> to perform feasibility queries for research.<br> +However, it is possible to deploy several process plugins together, even the same process plugin in different versions. A process plugin is basically an archive of BPMN 2.0 models, FHIR R4 resources and Java code. This process plugin is deployed as a Jar file on the BPE.</p> +<h2 id="bpmn-example" tabindex="-1"><a class="header-anchor" href="#bpmn-example"><span>BPMN: Example</span></a></h2> +<p>BPMN models can be created with <a href="https://camunda.com/de" target="_blank" rel="noopener noreferrer">Camunda Modeler</a>. The following model is a BPMN model consisting of two lanes: These are the square boxes, i.e. Organization A and B. This process is intended only as an example to illustrate the formalities. We will look at realistic processes in the next <a href="/intro/use-cases">chapter</a>.</p> +<figure><img src="/photos/info/plugins/bpmn-example.png" alt="BPMN: Example" tabindex="0" loading="lazy"><figcaption>BPMN: Example</figcaption></figure> +<h2 id="ping-pong-process" tabindex="-1"><a class="header-anchor" href="#ping-pong-process"><span>Ping Pong Process</span></a></h2> +<p>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping process plugin</a> can be used for (periodic) connection testing between organizations that are part of your DSF allow list. The following figure shows a representation of the process.</p> +<figure><img src="/photos/info/use-cases/ping-pong.png" alt="Ping-Pong Process" tabindex="0" loading="lazy"><figcaption>Ping-Pong Process</figcaption></figure> +<p>The ping pong process is composed of 3 different subprocesses:</p> +<h3 id="autostart-ping-process" tabindex="-1"><a class="header-anchor" href="#autostart-ping-process"><span>Autostart Ping Process</span></a></h3> +<p>The autostart ping process is used to execute connection tests in a predefined interval. This subprocess performs the following steps:</p> +<ul> +<li>Start a timer with a predefined interval (default 24 h)</li> +<li>Start the ping process once per interval</li> +<li>Stop the timer after the current interval completes</li> +</ul> +<h3 id="ping-process" tabindex="-1"><a class="header-anchor" href="#ping-process"><span>Ping Process</span></a></h3> +<p>The ping process is used to check outgoing and incoming connections to organizations in your allow-list. This subprocess performs the following steps:</p> +<ul> +<li>Select organizations in your allow list that should receive a ping message</li> +<li>Send ping message to selected organizations</li> +<li>Receive pong message from selected organizations</li> +<li>Log status of ping/pong messages</li> +<li>Log errors if any occur</li> +</ul> +<h3 id="pong-process" tabindex="-1"><a class="header-anchor" href="#pong-process"><span>Pong Process</span></a></h3> +<p>The pong process is used to send a response during the connection test to the requesting organization. This subprocess performs the following steps:</p> +<ul> +<li>Receive ping message from requesting organizations</li> +<li>Send pong message to requesting organizations</li> +<li>Log status of ping/pong message</li> +<li>Log errors if any occur</li> +</ul> +<!-- +## BPMN: Communicate +*Message Events* enable the communication between different organizations. Every time there is a *Message Event* between two business processes, there is a corresponding *TaskResource* on the FHIR side. When one organization sends a message for example “do some work” to another organization or when we send a message to ourselves to start or continue a process, we do this by creating a FHIR *TaskResource* with the status “requested”. After that the Business Process Engine starts the work and the status switches to “in-progress” and if the work is done to “completed” or if there is a problem to “failed”. + +![Message Send Task / Message Receive Task (Multi-Instance, Error Handling)](/photos/info/plugins/bpmn-communicate.png) + +blablabla + +![Event Based Gateway – OK Message, Error Message, Timeout](/photos/info/plugins/bpmn-event-based-gateway.png) + +blablabla + +![Message Events Intermediate | Send / Receive](/photos/info/plugins/bpmn-intermediate.png =750x90) +--></div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/info/security.html.js b/src/.vuepress/.temp/pages/intro/info/security.html.js new file mode 100644 index 000000000..5124572db --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/security.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/info/security.html.vue" +const data = JSON.parse("{\"path\":\"/intro/info/security.html\",\"title\":\"Security by Design\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Security by Design\",\"icon\":\"safe\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Basics Security\",\"slug\":\"basics-security\",\"link\":\"#basics-security\",\"children\":[]},{\"level\":2,\"title\":\"Authentication\",\"slug\":\"authentication\",\"link\":\"#authentication\",\"children\":[{\"level\":3,\"title\":\"Certificate Requests 🔒\",\"slug\":\"certificate-requests\",\"link\":\"#certificate-requests\",\"children\":[]}]}],\"readingTime\":{\"minutes\":1.54,\"words\":461},\"filePathRelative\":\"intro/info/security.md\",\"excerpt\":\"<h2>Basics Security</h2>\\n<p>The open-source Data Sharing Framework is EU-GDPR compliant and meets the highest security standards by design. DSF FHIR servers only accept certain FHIR resources from internal systems/administrators (e.g. tasks, binary resources...). In addition, the communication partners are defined via Allow Lists. This means that an organisation can only communicate with organisations that are included in the allow list of approved organisations of the participating organisations. More information about allow lists can be found in the <a href=\\\"allowList\\\">next chapter</a>.<br>\\nFor transport encryption, the TLS protocol is used. Secure Web Socket (WSS) connections provide security for the connection between the DSF FHIR server (DMZ) and the BPE (internal network). In addition, the DSF is being actively developed and there is an excellent community, both of which guarantee fast security patches.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/info/security.html.vue b/src/.vuepress/.temp/pages/intro/info/security.html.vue new file mode 100644 index 000000000..bad3938bc --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/info/security.html.vue @@ -0,0 +1,41 @@ +<template><div><h2 id="basics-security" tabindex="-1"><a class="header-anchor" href="#basics-security"><span>Basics Security</span></a></h2> +<p>The open-source Data Sharing Framework is EU-GDPR compliant and meets the highest security standards by design. DSF FHIR servers only accept certain FHIR resources from internal systems/administrators (e.g. tasks, binary resources...). In addition, the communication partners are defined via Allow Lists. This means that an organisation can only communicate with organisations that are included in the allow list of approved organisations of the participating organisations. More information about allow lists can be found in the <a href="allowList">next chapter</a>.<br> +For transport encryption, the TLS protocol is used. Secure Web Socket (WSS) connections provide security for the connection between the DSF FHIR server (DMZ) and the BPE (internal network). In addition, the DSF is being actively developed and there is an excellent community, both of which guarantee fast security patches.</p> +<figure><img src="/photos/info/security/certificates-light.svg" alt="" tabindex="0" loading="lazy" data-mode="lightmode-only"><figcaption></figcaption></figure> +<figure><img src="/photos/info/security/certificates-dark.svg" alt="" tabindex="0" loading="lazy" data-mode="darkmode-only"><figcaption></figcaption></figure> +<h2 id="authentication" tabindex="-1"><a class="header-anchor" href="#authentication"><span>Authentication</span></a></h2> +<p>Authentication of organizations within the DSF is handled by the use of X.509 client and server certificates. Currently the certificate authorities run by <a href="https://www.pki.dfn.de/ueberblick-dfn-pki/" target="_blank" rel="noopener noreferrer">DFN-PKI Global G2</a>, <a href="https://www.tmf-ev.de" target="_blank" rel="noopener noreferrer">D-Trust via TMF e.V.</a> and <a href="https://doku.tid.dfn.de/de:dfnpki:start" target="_blank" rel="noopener noreferrer">GÉANT TCS via DFN</a> are supported. All participating organizations are entered in a distributed and synchronized allow-list of valid organizations and certificates.</p> +<p>A webserver certificate is needed to run the FHIR endpoint and a 802.1X client certificate is used to authenticate against other organizations endpoints and as a server certificate for the business process engine. For available certificate profiles see <a href="https://www.pki.dfn.de/fileadmin/PKI/anleitungen/DFN-PKI-Zertifikatprofile_Global.pdf" target="_blank" rel="noopener noreferrer">DFN-PKI-Zertifikatprofile_Global.pdf</a></p> +<p>More information about client and server certificates can be found <a href="/stable/maintain/install#client-server-certificates">here</a>.</p> +<h3 id="certificate-requests" tabindex="-1"><a class="header-anchor" href="#certificate-requests"><span>Certificate Requests 🔒</span></a></h3> +<h4 id="fhir-endpoint" tabindex="-1"><a class="header-anchor" href="#fhir-endpoint"><span>FHIR Endpoint</span></a></h4> +<p>Server certificates are used to authenticate the FHIR endpoint on the local network and to other organisations</p> +<ul> +<li>Certificate profile: +<ul> +<li>DFN-PKI Global G2 via DFN e.V.: Web Server</li> +<li>D-Trust via TMF e.V.: Advanced SSL ID</li> +<li>GÉANT TCS via DFN e.V.: Web Server</li> +</ul> +</li> +<li>Common name: FQDN of the server used while accessing from other organizations (external FQDN)</li> +<li>Subject alternative DNS entries: Use additional alternative FQDNs if a different name is used while accessing the Server from the local Network (local FQDN)</li> +</ul> +<p>More information: <a href="/stable/maintain/configuration/fhir">Parameters FHIR Server</a></p> +<h4 id="business-process-engine-server" tabindex="-1"><a class="header-anchor" href="#business-process-engine-server"><span>Business Process Engine Server</span></a></h4> +<p>Client certificates are used to authenticate against remote FHIR endpoints (when either the BPE server or the FHIR endpoint server acts as the client).<br> +In addition, client certificates are used to authenticate the Business Process Engine server on the local network.</p> +<ul> +<li>Certificate profile: +<ul> +<li>DFN-PKI Global G2 via DFN e.V.: 802.1X Client</li> +<li>D-Trust via TMF e.V.: Basic Team ID</li> +<li>GÉANT TCS via DFN e.V.: Web Server</li> +</ul> +</li> +<li>Common name: FQDN of the server used while accessing from the local network (local FQDN)</li> +</ul> +<p>More information: <a href="/stable/maintain/configuration/bpe">Parameters BPE Server</a></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/publications.html.js b/src/.vuepress/.temp/pages/intro/publications.html.js new file mode 100644 index 000000000..3cd0105f1 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/publications.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/publications.html.vue" +const data = JSON.parse("{\"path\":\"/intro/publications.html\",\"title\":\"Publications and Talks\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Publications and Talks\",\"icon\":\"blog\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Publications\",\"slug\":\"publications\",\"link\":\"#publications\",\"children\":[]},{\"level\":3,\"title\":\"Recorded Talks\",\"slug\":\"recorded-talks\",\"link\":\"#recorded-talks\",\"children\":[]}],\"readingTime\":{\"minutes\":1.3,\"words\":390},\"filePathRelative\":\"intro/publications.md\",\"excerpt\":\"<h3>Publications</h3>\\n<ul>\\n<li>\\n<p>H. Hund, R. Wettstein, C.M. Heidt, C. Fegeler, <strong>Executing Distributed Healthcare and Research Processes – The HiGHmed Data Sharing Framework</strong>, Stud Health Technol Inform, 278 (2021) 126-133, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI210060\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI210060</a></p>\\n</li>\\n<li>\\n<p>R. Wettstein, H. Hund, I. Kobylinski, C. Fegeler, O. Heinze, <strong>Feasibility Queries in Distributed Architectures – Concept and Implementation in HiGHmed</strong>, Stud Health Technol Inform, 278 (2021) 134-141, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI210061\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI210061</a></p>\\n</li>\\n<li>\\n<p>C.M. Heidt, H. Hund, C. Fegeler, <strong>A Federated Record Linkage Algorithm for Secure Medical Data Sharing</strong>, Stud Health Technol Inform, 278 (2021) 142-149, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI210062\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI210062</a></p>\\n</li>\\n<li>\\n<p>R. Wettstein, H. Hund, C. Fegeler, O. Heinze, <strong>Data Sharing in Distributed Architectures – Concept and Implementation in HiGHmed</strong>, Stud Health Technol Inform, 283 (2021) 111-118, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI210548\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI210548</a></p>\\n</li>\\n<li>\\n<p>H.-U. Prokosch, T. Bahls, M. Bialke, J. Eils, C. Fegeler, J. Gruendner, B. Haarbrandt, C. Hampf, W. Hoffmann, H. Hund, et al. <strong>The COVID-19 Data Exchange Platform of the German University Medicine</strong>, Stud Health Technol Inform, 294 (2022) 674-678, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI220554\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI220554</a></p>\\n</li>\\n<li>\\n<p>R. Wettstein, T. Kussel, H. Hund, C. Fegeler, M. Dugas, K. Hamacher, <strong>Secure Multi-Party Computation Based Distributed Feasibility Queries – A HiGHmed Use Case</strong>, Stud Health Technol Inform, 296 (2022) 41-49, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI220802\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI220802</a></p>\\n</li>\\n<li>\\n<p>C. Zilske, M. Kurscheidt, S.T. Schweizer, H. Hund, S. Mödinger, C. Fegeler, <strong>Monitoring Distributed Business Processes in Biomedical Research</strong>, Stud Health Technol Inform, 302 (2023) 252-256, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI230113\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI230113</a></p>\\n</li>\\n<li>\\n<p>H. Hund, R. Wettstein, C. Hampf, M. Bialke, M. Kurscheidt, S.T. Schweizer, C. Zilske, S. Mödinger, C. Fegeler, <strong>No Transfer Without Validation: A Data Sharing Framework Use Case</strong>, Stud Health Technol Inform, 302 (2023) 68-72, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI230066\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI230066</a></p>\\n</li>\\n<li>\\n<p>H. Hund, R. Wettstein, M. Kurscheidt, S.T. Schweizer, C. Zilske, C. Fegeler, <strong>Interoperability Is a Process- The Data Sharing Framework</strong>, Stud Health Technol Inform, 310 (2024) 28-32, <a href=\\\"https://ebooks.iospress.nl/doi/10.3233/SHTI230921\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">doi:10.3233/SHTI230921</a></p>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/publications.html.vue b/src/.vuepress/.temp/pages/intro/publications.html.vue new file mode 100644 index 000000000..4e1ba6c00 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/publications.html.vue @@ -0,0 +1,45 @@ +<template><div><h3 id="publications" tabindex="-1"><a class="header-anchor" href="#publications"><span>Publications</span></a></h3> +<ul> +<li> +<p>H. Hund, R. Wettstein, C.M. Heidt, C. Fegeler, <strong>Executing Distributed Healthcare and Research Processes – The HiGHmed Data Sharing Framework</strong>, Stud Health Technol Inform, 278 (2021) 126-133, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI210060" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI210060</a></p> +</li> +<li> +<p>R. Wettstein, H. Hund, I. Kobylinski, C. Fegeler, O. Heinze, <strong>Feasibility Queries in Distributed Architectures – Concept and Implementation in HiGHmed</strong>, Stud Health Technol Inform, 278 (2021) 134-141, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI210061" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI210061</a></p> +</li> +<li> +<p>C.M. Heidt, H. Hund, C. Fegeler, <strong>A Federated Record Linkage Algorithm for Secure Medical Data Sharing</strong>, Stud Health Technol Inform, 278 (2021) 142-149, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI210062" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI210062</a></p> +</li> +<li> +<p>R. Wettstein, H. Hund, C. Fegeler, O. Heinze, <strong>Data Sharing in Distributed Architectures – Concept and Implementation in HiGHmed</strong>, Stud Health Technol Inform, 283 (2021) 111-118, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI210548" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI210548</a></p> +</li> +<li> +<p>H.-U. Prokosch, T. Bahls, M. Bialke, J. Eils, C. Fegeler, J. Gruendner, B. Haarbrandt, C. Hampf, W. Hoffmann, H. Hund, et al. <strong>The COVID-19 Data Exchange Platform of the German University Medicine</strong>, Stud Health Technol Inform, 294 (2022) 674-678, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI220554" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI220554</a></p> +</li> +<li> +<p>R. Wettstein, T. Kussel, H. Hund, C. Fegeler, M. Dugas, K. Hamacher, <strong>Secure Multi-Party Computation Based Distributed Feasibility Queries – A HiGHmed Use Case</strong>, Stud Health Technol Inform, 296 (2022) 41-49, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI220802" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI220802</a></p> +</li> +<li> +<p>C. Zilske, M. Kurscheidt, S.T. Schweizer, H. Hund, S. Mödinger, C. Fegeler, <strong>Monitoring Distributed Business Processes in Biomedical Research</strong>, Stud Health Technol Inform, 302 (2023) 252-256, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI230113" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI230113</a></p> +</li> +<li> +<p>H. Hund, R. Wettstein, C. Hampf, M. Bialke, M. Kurscheidt, S.T. Schweizer, C. Zilske, S. Mödinger, C. Fegeler, <strong>No Transfer Without Validation: A Data Sharing Framework Use Case</strong>, Stud Health Technol Inform, 302 (2023) 68-72, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI230066" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI230066</a></p> +</li> +<li> +<p>H. Hund, R. Wettstein, M. Kurscheidt, S.T. Schweizer, C. Zilske, C. Fegeler, <strong>Interoperability Is a Process- The Data Sharing Framework</strong>, Stud Health Technol Inform, 310 (2024) 28-32, <a href="https://ebooks.iospress.nl/doi/10.3233/SHTI230921" target="_blank" rel="noopener noreferrer">doi:10.3233/SHTI230921</a></p> +</li> +</ul> +<h3 id="recorded-talks" tabindex="-1"><a class="header-anchor" href="#recorded-talks"><span>Recorded Talks</span></a></h3> +<h4 id="gmds-conference-2022" tabindex="-1"><a class="header-anchor" href="#gmds-conference-2022"><span>GMDS Conference 2022</span></a></h4> +<ul> +<li><a href="https://www.youtube.com/playlist?list=PLsHs7HOt6jDMe3PNevpo-uGsDTWVSMsYZ" target="_blank" rel="noopener noreferrer">Hands On! - Introduction to the Data Sharing Framework from a User Perspective </a></li> +<li>Tutorial: <RouteLink to="/oldstable/tutorial/">Implementing BPMN Processes as DSF Process-Plugins</RouteLink></li> +</ul> +<h4 id="gmds-conference-2020" tabindex="-1"><a class="header-anchor" href="#gmds-conference-2020"><span>GMDS Conference 2020</span></a></h4> +<ul> +<li><a href="https://www.youtube.com/watch?v=OzjyqmZZPSA" target="_blank" rel="noopener noreferrer">Executing Distributed Healthcare and Research Processes – the HiGHmed Data Sharing Framework</a></li> +<li><a href="https://www.youtube.com/watch?v=6Pom8KqYhTs" target="_blank" rel="noopener noreferrer">Feasibility Queries in Distributed Architectures – Concept and Implementation in HiGHmed</a></li> +<li><a href="https://www.youtube.com/watch?v=bSEPqzxF8mM" target="_blank" rel="noopener noreferrer">A Federated Record Linkage Algorithm for Secure Medical Data Sharing</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.js b/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.js new file mode 100644 index 000000000..850bfef0e --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.vue" +const data = JSON.parse("{\"path\":\"/intro/tutorials/GMDS2022-dev.html\",\"title\":\"GMDS2022 - Process Development\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"GMDS2022 - Process Development\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"intro/tutorials/GMDS2022-dev.md\",\"excerpt\":\"<p>Redirect to <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">this webpage</a>.</p>\\n<meta http-equiv=\\\"refresh\\\" content=\\\"0; URL=/oldstable/tutorial/\\\">\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.vue b/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.vue new file mode 100644 index 000000000..a75194b0c --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/GMDS2022-dev.html.vue @@ -0,0 +1,5 @@ +<template><div><p>Redirect to <RouteLink to="/oldstable/tutorial/">this webpage</RouteLink>.</p> +<meta http-equiv="refresh" content="0; URL=/oldstable/tutorial/"> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.js b/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.js new file mode 100644 index 000000000..34ad9e596 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.vue" +const data = JSON.parse("{\"path\":\"/intro/tutorials/MIE2023.html\",\"title\":\"MIE May 2023\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"MIE May 2023\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Abstract\",\"slug\":\"abstract\",\"link\":\"#abstract\",\"children\":[]},{\"level\":2,\"title\":\"Topic\",\"slug\":\"topic\",\"link\":\"#topic\",\"children\":[]},{\"level\":2,\"title\":\"Target Group\",\"slug\":\"target-group\",\"link\":\"#target-group\",\"children\":[]},{\"level\":2,\"title\":\"What you need\",\"slug\":\"what-you-need\",\"link\":\"#what-you-need\",\"children\":[]},{\"level\":2,\"title\":\"What you will learn\",\"slug\":\"what-you-will-learn\",\"link\":\"#what-you-will-learn\",\"children\":[]}],\"readingTime\":{\"minutes\":1.95,\"words\":585},\"filePathRelative\":\"intro/tutorials/MIE2023.md\",\"excerpt\":\"<h2>Abstract</h2>\\n<p>With this tutorial, participants will gain a detailed insight into the Data Sharing Framework (DSF) (<a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>). The open source DSF enables users to execute biomedical research and healthcare delivery processes across organizations, and the tutorial will demonstrate this with examples from the German Medical Informatics Initiative (MII) (<a href=\\\"https://www.medizininformatik-initiative.de/en/start\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://www.medizininformatik-initiative.de/en/start</a>) funded by the Federal Ministry of Education and Research (BMBF). The tutorial will cover fundamental concepts of distributed processes, the DSFs architecture and key standards such as HL7 FHIR and BPMN 2.0. Participants will have the opportunity to gain hands-on experience with the DSF by working with different processes in a lab setting. Technical aspects such as authentication and authorization will be covered, as well as guidance on using the DSF for other use cases. This tutorial is designed for those involved in distributed research projects, including project members and software developers, as well as individuals interested in multi-organizational research projects.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.vue b/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.vue new file mode 100644 index 000000000..25fc19f55 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/MIE2023.html.vue @@ -0,0 +1,25 @@ +<template><div><h2 id="abstract" tabindex="-1"><a class="header-anchor" href="#abstract"><span>Abstract</span></a></h2> +<p>With this tutorial, participants will gain a detailed insight into the Data Sharing Framework (DSF) (<a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>). The open source DSF enables users to execute biomedical research and healthcare delivery processes across organizations, and the tutorial will demonstrate this with examples from the German Medical Informatics Initiative (MII) (<a href="https://www.medizininformatik-initiative.de/en/start" target="_blank" rel="noopener noreferrer">https://www.medizininformatik-initiative.de/en/start</a>) funded by the Federal Ministry of Education and Research (BMBF). The tutorial will cover fundamental concepts of distributed processes, the DSFs architecture and key standards such as HL7 FHIR and BPMN 2.0. Participants will have the opportunity to gain hands-on experience with the DSF by working with different processes in a lab setting. Technical aspects such as authentication and authorization will be covered, as well as guidance on using the DSF for other use cases. This tutorial is designed for those involved in distributed research projects, including project members and software developers, as well as individuals interested in multi-organizational research projects.</p> +<h2 id="topic" tabindex="-1"><a class="header-anchor" href="#topic"><span>Topic</span></a></h2> +<p>The use of real-world data collected by healthcare providers for bio-medical research requires the data to be available and accessible. This is especially important when considering the usage of data across organizations. Distributed processes such as feasibility studies, record linkage, and data sharing need to be established for effective consolidation and analysis.<br> +While even multi-center retrospective studies using real-world data become commonplace, maintaining infrastructure components for every project conducted is not sustainable. To address this, the Data Sharing Framework (DSF) was developed as an open source, use case independent distributed business process engine to execute cross-organizational research and healthcare delivery processes.</p> +<img src="/photos/tutorials/dsf-architecture.svg" > +<p>The tutorial will cover the fundamental concepts of distributed processes and will provide an overview of the DSF's architecture and key standards such as HL7 FHIR and BPMN 2.0 that are used in the framework. The tutorial will present real-world examples to illustrate the DSFs capabilities and delve into specific issues the DSF addresses for the German Medical Informatics Initiative (MII).</p> +<p>Participants will have the opportunity to gain hands-on experience with the DSF by working with different processes in a lab setting. Technical aspects such as authentication and authorization, onboarding of new organizations and guidance on using the DSF for other use cases, such as specific research projects or new infrastructure developments, will be covered.<br> +Finally, the tutorial will present lessons learned from the last years of using the DSF in test and production environments in multiple research consortia and will present ideas for future improvements based on feedback from end-users, process developers, project managers and administrative staff.</p> +<h2 id="target-group" tabindex="-1"><a class="header-anchor" href="#target-group"><span>Target Group</span></a></h2> +<p>Decision makers and project members with data sharing ideas looking for an architecture, as well as medical informatics professionals and software developers tasked with building multi-centric data sharing applications, are the target audience for this tutorial.</p> +<h2 id="what-you-need" tabindex="-1"><a class="header-anchor" href="#what-you-need"><span>What you need</span></a></h2> +<p>You need a laptop with a web browser for the hands-on portion of the tutorial.</p> +<h2 id="what-you-will-learn" tabindex="-1"><a class="header-anchor" href="#what-you-will-learn"><span>What you will learn</span></a></h2> +<p><strong>You will...</strong></p> +<ul> +<li>… gain knowledge on various distributed processes specific to bio-medical research.</li> +<li>… understand the unique challenges and considerations from the German MII resulting in the design and architecture of the DSF.</li> +<li>… be introduced to the key concepts of the DSF and the various contexts in which it can be applied.</li> +<li>… learn how to evaluate if the DSF is appropriate for their particular project or application your planning.</li> +<li>… understand the difficulties that can occur when implementing distributed processes, as well as strategies for addressing them.</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.js b/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.js new file mode 100644 index 000000000..5d2801f12 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.vue" +const data = JSON.parse("{\"path\":\"/intro/tutorials/Talks.html\",\"title\":\"Recorded talks\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Recorded talks\",\"icon\":\"globe\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.08,\"words\":23},\"filePathRelative\":\"intro/tutorials/Talks.md\",\"excerpt\":\"<p>Redirect to <a href=\\\"/oldstable/guideline/publications.html#recorded-talks\\\" target=\\\"_blank\\\">this webpage</a>.</p>\\n<meta http-equiv=\\\"refresh\\\" content=\\\"0; URL=/oldstable/guideline/publications.html#recorded-talks\\\">\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.vue b/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.vue new file mode 100644 index 000000000..7b2a57b9c --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/Talks.html.vue @@ -0,0 +1,5 @@ +<template><div><p>Redirect to <RouteLink to="/oldstable/guideline/publications.html#recorded-talks">this webpage</RouteLink>.</p> +<meta http-equiv="refresh" content="0; URL=/oldstable/guideline/publications.html#recorded-talks"> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/tutorials/index.html.js b/src/.vuepress/.temp/pages/intro/tutorials/index.html.js new file mode 100644 index 000000000..8d73dd58b --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/tutorials/index.html.vue" +const data = JSON.parse("{\"path\":\"/intro/tutorials/\",\"title\":\"Tutorials\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Tutorials\",\"icon\":\"edit\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.06,\"words\":17},\"filePathRelative\":\"intro/tutorials/README.md\",\"excerpt\":\"<ul>\\n<li><a href=\\\"/intro/tutorials/MIE2023.html\\\" target=\\\"_blank\\\">MIE 2023</a></li>\\n<li><a href=\\\"/intro/tutorials/GMDS2022-dev.html\\\" target=\\\"_blank\\\">GMDS 2022 - DSF Process Plugin Tutorial v 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/tutorials/index.html.vue b/src/.vuepress/.temp/pages/intro/tutorials/index.html.vue new file mode 100644 index 000000000..9eaac88b9 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/tutorials/index.html.vue @@ -0,0 +1,7 @@ +<template><div><ul> +<li><RouteLink to="/intro/tutorials/MIE2023.html">MIE 2023</RouteLink></li> +<li><RouteLink to="/intro/tutorials/GMDS2022-dev.html">GMDS 2022 - DSF Process Plugin Tutorial v 0.9.x</RouteLink></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.js b/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.js new file mode 100644 index 000000000..77d37aa7b --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.vue" +const data = JSON.parse("{\"path\":\"/intro/use-cases/feasibility.html\",\"title\":\"Feasibility\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Feasibility\",\"icon\":\"diagram\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"The Feasibility Process\",\"slug\":\"the-feasibility-process\",\"link\":\"#the-feasibility-process\",\"children\":[]},{\"level\":2,\"title\":\"Technical Information\",\"slug\":\"technical-information\",\"link\":\"#technical-information\",\"children\":[]}],\"readingTime\":{\"minutes\":1.23,\"words\":370},\"filePathRelative\":\"intro/use-cases/feasibility.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Funded by the German Federal Ministry of Research and Education, 25 <a href=\\\"https://www.forschen-fuer-gesundheit.de/menu_standorte.php\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">sites</a> have installed the DSF to execute the <a href=\\\"https://github.com/medizininformatik-initiative/feasibility-dsf-process/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Feasibility</a> process. To perform feasibility queries, a researcher can register and query data on the <a href=\\\"https://www.forschen-fuer-gesundheit.de/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">FDPG (Forschungsdaten Portal für Gesundheit - Research Data Portal)</a> website. Basic data of hospitalizations of over 8 million patients with over 40 million diagnoses and much more such as laboratory values or drug prescriptions are available. After a successful query, the data is made available in standardized FHIR format. Further information can be found in the <a href=\\\"https://www.medizininformatik-initiative.de/sites/default/files/2023-05/20230509_TMF_Faltflyer_A4_digital.pdf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">flyer</a>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.vue b/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.vue new file mode 100644 index 000000000..4c6eecfcc --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/feasibility.html.vue @@ -0,0 +1,16 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Funded by the German Federal Ministry of Research and Education, 25 <a href="https://www.forschen-fuer-gesundheit.de/menu_standorte.php" target="_blank" rel="noopener noreferrer">sites</a> have installed the DSF to execute the <a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/" target="_blank" rel="noopener noreferrer">Feasibility</a> process. To perform feasibility queries, a researcher can register and query data on the <a href="https://www.forschen-fuer-gesundheit.de/" target="_blank" rel="noopener noreferrer">FDPG (Forschungsdaten Portal für Gesundheit - Research Data Portal)</a> website. Basic data of hospitalizations of over 8 million patients with over 40 million diagnoses and much more such as laboratory values or drug prescriptions are available. After a successful query, the data is made available in standardized FHIR format. Further information can be found in the <a href="https://www.medizininformatik-initiative.de/sites/default/files/2023-05/20230509_TMF_Faltflyer_A4_digital.pdf" target="_blank" rel="noopener noreferrer">flyer</a>.</p> +<h2 id="the-feasibility-process" tabindex="-1"><a class="header-anchor" href="#the-feasibility-process"><span>The Feasibility Process</span></a></h2> +<p>Medical routine data holds great promise for advancing research, yet its integration into a research context poses significant challenges. To address this, Medical Data Integration Centers have been established, by the medical informatics initiative to consolidate data from primary information systems into a central repository. However, relying on data from only one organization is rarely sufficient to answer complex research questions, so merging data across institutional boundaries is necessary.</p> +<p>To enable researchers to leverage this integrated data for specific research projects, there is a critical need for the ability to query cohort sizes across institutions. The <a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/" target="_blank" rel="noopener noreferrer">feasibility</a> process allows researchers to conduct automated and distributed feasibility queries, i.e., cohort size estimates. This process is executed according to the open standard BPMN 2.0, the underlying process data model is based on HL7 FHIR R4 resources.</p> +<h2 id="technical-information" tabindex="-1"><a class="header-anchor" href="#technical-information"><span>Technical Information</span></a></h2> +<ul> +<li><a href="https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup" target="_blank" rel="noopener noreferrer">DSF Middleware Setup</a>: The DSF middleware connects your site to the central platform. This allows it to receive feasibility query requests as well as reporting back any results of these queries.</li> +<li><a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/" target="_blank" rel="noopener noreferrer">Feasibility Process</a>: Core Feasibility Process</li> +<li><a href="https://github.com/medizininformatik-initiative/feasibility-deploy/tree/main/feasibility-triangle" target="_blank" rel="noopener noreferrer">Feasibility Triangle</a>: The Feasibility Triangle part of this repository provides a site (data integration center) with all the necessary components to set up in order to allow feasibility queries from the central feasibility portal.</li> +<li><a href="https://github.com/medizininformatik-initiative/mii-dsf-processes/tree/main" target="_blank" rel="noopener noreferrer">Data Transfer</a></li> +<li><a href="https://github.com/medizininformatik-initiative/mii-dsf-processes/blob/main/mii-dsf-processes-docker-test-setup/README-Process-Projectathon-Data-Sharing.md" target="_blank" rel="noopener noreferrer">Data extraction after successful feasibility query</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/use-cases/index.html.js b/src/.vuepress/.temp/pages/intro/use-cases/index.html.js new file mode 100644 index 000000000..21af9f2ed --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/index.html.vue" +const data = JSON.parse("{\"path\":\"/intro/use-cases/\",\"title\":\"Use-Cases\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Use-Cases\",\"icon\":\"view\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.04,\"words\":12},\"filePathRelative\":\"intro/use-cases/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"feasibility\\\">Feasibility</a></li>\\n<li><a href=\\\"num\\\">Network University Medicine</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/use-cases/index.html.vue b/src/.vuepress/.temp/pages/intro/use-cases/index.html.vue new file mode 100644 index 000000000..b4205d35a --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="feasibility">Feasibility</a></li> +<li><a href="num">Network University Medicine</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/intro/use-cases/num.html.js b/src/.vuepress/.temp/pages/intro/use-cases/num.html.js new file mode 100644 index 000000000..aa2f44fe2 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/num.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/intro/use-cases/num.html.vue" +const data = JSON.parse("{\"path\":\"/intro/use-cases/num.html\",\"title\":\"Network University Medicine\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Network University Medicine\",\"icon\":\"map\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"The Data Transfer Process\",\"slug\":\"the-data-transfer-process\",\"link\":\"#the-data-transfer-process\",\"children\":[]}],\"readingTime\":{\"minutes\":0.66,\"words\":199},\"filePathRelative\":\"intro/use-cases/num.md\",\"excerpt\":\"<p>The <a href=\\\"https://www.netzwerk-universitaetsmedizin.de/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Network University Medicine</a> was established in April 2020 as part of the COVID-19 pandemic crisis management. The aim of the NUM is to better coordinate COVID-19 research at all 36 university hospitals in Germany.'</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/intro/use-cases/num.html.vue b/src/.vuepress/.temp/pages/intro/use-cases/num.html.vue new file mode 100644 index 000000000..9b6c949c1 --- /dev/null +++ b/src/.vuepress/.temp/pages/intro/use-cases/num.html.vue @@ -0,0 +1,12 @@ +<template><div><p>The <a href="https://www.netzwerk-universitaetsmedizin.de/" target="_blank" rel="noopener noreferrer">Network University Medicine</a> was established in April 2020 as part of the COVID-19 pandemic crisis management. The aim of the NUM is to better coordinate COVID-19 research at all 36 university hospitals in Germany.'</p> +<div style="text-align:center"> +<figure><img src="/photos/learnmore/projects/num.png" alt="" width="370" height="220" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +</div> +<p>As part of the <em><a href="https://www.netzwerk-universitaetsmedizin.de/projekte/codex#c599" target="_blank" rel="noopener noreferrer">CODEX | COVID-19 Data Exchange Platform</a></em> project, a nationwide, uniform, privacy-compliant infrastructure for storing and providing COVID-19 research datasets was established. Since 2022, the work continues within the project <a href="https://www.netzwerk-universitaetsmedizin.de/projekte/num-rdp" target="_blank" rel="noopener noreferrer">NUM RDP</a>. All 36 university hospitals have installed the DSF to share Covid-19 research data.</p> +<h3 id="the-data-transfer-process" tabindex="-1"><a class="header-anchor" href="#the-data-transfer-process"><span>The Data Transfer Process</span></a></h3> +<p>The <a href="https://github.com/num-codex/codex-processes-ap1" target="_blank" rel="noopener noreferrer">Data Transfer Process</a> is used in NUM CODEX to send data from a Data Integration Center (DIC), via the Gecco Transfer Hub (GTH), to the Central Research Repository (CRR). The infrastructure and communincation messages on which the process is based can be seen in the following figure. All organizations use the Data Sharing Framework (DSF) for deployment and execution of the process.</p> +<figure><img src="/photos/learnmore/projects/ap1.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure> +<p>More technical information can be found on <a href="https://github.com/num-codex/codex-processes-ap1/wiki/Process-Description-v1.0.0.0" target="_blank" rel="noopener noreferrer">GitHub</a>.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/introduction/index.html.js b/src/.vuepress/.temp/pages/introduction/index.html.js new file mode 100644 index 000000000..1be856840 --- /dev/null +++ b/src/.vuepress/.temp/pages/introduction/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/introduction/index.html.vue" +const data = JSON.parse("{\"path\":\"/introduction/\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":\"introduction/readme.md\",\"excerpt\":\"<p>Introduction</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/introduction/index.html.vue b/src/.vuepress/.temp/pages/introduction/index.html.vue new file mode 100644 index 000000000..bc8224c16 --- /dev/null +++ b/src/.vuepress/.temp/pages/introduction/index.html.vue @@ -0,0 +1,4 @@ +<template><div><p>Introduction</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/reference/index.html.js b/src/.vuepress/.temp/pages/reference/index.html.js new file mode 100644 index 000000000..012b85372 --- /dev/null +++ b/src/.vuepress/.temp/pages/reference/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/reference/index.html.vue" +const data = JSON.parse("{\"path\":\"/reference/\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":\"reference/readme.md\",\"excerpt\":\"<p>Reference</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/reference/index.html.vue b/src/.vuepress/.temp/pages/reference/index.html.vue new file mode 100644 index 000000000..0e1aa122a --- /dev/null +++ b/src/.vuepress/.temp/pages/reference/index.html.vue @@ -0,0 +1,4 @@ +<template><div><p>Reference</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/index.html.js b/src/.vuepress/.temp/pages/release/archive/index.html.js new file mode 100644 index 000000000..9a2555f66 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/\",\"title\":\"Archive\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Archive\",\"article\":false,\"feed\":false,\"sitemap\":false,\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":null,\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/index.html.vue b/src/.vuepress/.temp/pages/release/archive/index.html.vue new file mode 100644 index 000000000..33da939f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/index.html.vue @@ -0,0 +1,3 @@ +<template><div><Catalog/></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.js new file mode 100644 index 000000000..8f46d14f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.0.0/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/guideline/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world/tree/develop\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.vue new file mode 100644 index 000000000..0285c9a51 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/guideline/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world/tree/develop" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.js new file mode 100644 index 000000000..13bb0662e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.0.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..427197954 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.0.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world/tree/develop\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..fe9181123 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world/tree/develop" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.js new file mode 100644 index 000000000..831ec3142 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.0.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.js new file mode 100644 index 000000000..d88c57b1a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/\",\"title\":\"DSF 1.0.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.0.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.42,\"words\":127},\"filePathRelative\":\"release/archive/v1.0.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.0.0 is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.vue new file mode 100644 index 000000000..507e177b2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/index.html.vue @@ -0,0 +1,28 @@ +<template><div><p>Data Sharing Framework 1.0.0 is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/install">Install DSF 1.0.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow user authenitication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more <a href="https://github.com/datasharingframework/dsf/releases/tag/v1.0.0" target="_blank" rel="noopener noreferrer">features</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..cf34064e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.3,\"words\":390},\"filePathRelative\":\"release/archive/v1.0.0/maintain/allowList-mgm.md\",\"excerpt\":\"<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Caution</p>\\n<p>This is an outdated version of the Allow List Management documentation. Please use <a href=\\\"/stable//maintain/allowList-mgm\\\">the current version</a>, even if you use an outdated DSF version.</p>\\n</div>\\n<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">here</a>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..9846cf0a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,30 @@ +<template><div><div class="hint-container caution"> +<p class="hint-container-title">Caution</p> +<p>This is an outdated version of the Allow List Management documentation. Please use <a href="/stable//maintain/allowList-mgm">the current version</a>, even if you use an outdated DSF version.</p> +</div> +<p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">here</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow <a href="https://www.ssl.com/how-to/configuring-client-authentication-certificates-in-web-browsers/">here</a>.<br> +Currently, the Allow List Management Tool is only for DSF <b>TEST</b> infrastructure. For production, please write us an <a href="mailto:dsf-gecko@hs-heilbronn.de">E-Mail</a> with your information.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test infrastructure)<br> +1.1 If none exists yet, read <a href="install">here</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">here</a></li> +<li>Organization identifier (FQDN of your organization, e.g. <em><a href="http://hs-heilbronn.de" target="_blank" rel="noopener noreferrer">hs-heilbronn.de</a></em>)</li> +<li>FHIR Endpoint URL (e.g. <em><a href="https://gth.gecko.hs-heilbronn.de/fhir" target="_blank" rel="noopener noreferrer">https://gth.gecko.hs-heilbronn.de/fhir</a></em> )</li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the <a href="https://allowlist-test.gecko.hs-heilbronn.de/">DSF Allow List Management Tool</a>.<br> +At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.js new file mode 100644 index 000000000..9af44aedd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/configuration/bpe.html\",\"title\":\"Parameters BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-bpe-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-bpe-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":5.96,\"words\":1789},\"filePathRelative\":\"release/archive/v1.0.0/maintain/configuration/bpe.md\",\"excerpt\":\"\\n<p>Please also check <a href=\\\"common\\\">common parameters</a> for additional configuration options.</p>\\n<h3>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li>\\n<li><strong>Required:</strong> No</li>\\n<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code>true</code></li>\\n<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li>\\n<li><strong>Default:</strong> <code>false</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.vue new file mode 100644 index 000000000..acbf0f46a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/bpe.html.vue @@ -0,0 +1,437 @@ +<template><div><h1 id="parameters-bpe-server" tabindex="-1"><a class="header-anchor" href="#parameters-bpe-server"><span>Parameters BPE Server</span></a></h1> +<p>Please also check <a href="common">common parameters</a> for additional configuration options.</p> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable loging bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-organization-identifier-value"><span>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.js new file mode 100644 index 000000000..aa891d060 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/configuration/common.html\",\"title\":\"Common Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":1.84,\"words\":552},\"filePathRelative\":\"release/archive/v1.0.0/maintain/configuration/common.md\",\"excerpt\":\"\\n<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.vue new file mode 100644 index 000000000..9fc651a5e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/common.html.vue @@ -0,0 +1,176 @@ +<template><div><h1 id="common-parameters" tabindex="-1"><a class="header-anchor" href="#common-parameters"><span>Common Parameters</span></a></h1> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.js new file mode 100644 index 000000000..f4689e533 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/configuration/fhir.html\",\"title\":\"Parameters FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":2.77,\"words\":830},\"filePathRelative\":\"release/archive/v1.0.0/maintain/configuration/fhir.md\",\"excerpt\":\"\\n<p>Please also check <a href=\\\"common\\\">common parameters</a> for additional configuration options.</p>\\n<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.vue new file mode 100644 index 000000000..f662bc0e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/fhir.html.vue @@ -0,0 +1,215 @@ +<template><div><h1 id="parameters-fhir-server" tabindex="-1"><a class="header-anchor" href="#parameters-fhir-server"><span>Parameters FHIR Server</span></a></h1> +<p>Please also check <a href="common">common parameters</a> for additional configuration options.</p> +<h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Role config YAML</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.js new file mode 100644 index 000000000..9d1427efb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/configuration/\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":22},\"filePathRelative\":\"release/archive/v1.0.0/maintain/configuration/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"common\\\">Common Parameters</a></li>\\n<li><a href=\\\"fhir\\\">Parameters FHIR Server</a></li>\\n<li><a href=\\\"bpe\\\">Parameters BPE Server</a></li>\\n<li><a href=\\\"reverseproxy\\\">Parameters FHIR Reverse Proxy</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.vue new file mode 100644 index 000000000..af4f0cfd8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/index.html.vue @@ -0,0 +1,10 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="common">Common Parameters</a></li> +<li><a href="fhir">Parameters FHIR Server</a></li> +<li><a href="bpe">Parameters BPE Server</a></li> +<li><a href="reverseproxy">Parameters FHIR Reverse Proxy</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.js new file mode 100644 index 000000000..b67f714d0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/configuration/reverseproxy.html\",\"title\":\"Parameters FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]}],\"readingTime\":{\"minutes\":1.16,\"words\":348},\"filePathRelative\":\"release/archive/v1.0.0/maintain/configuration/reverseproxy.md\",\"excerpt\":\"\\n<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.vue new file mode 100644 index 000000000..2ecd1ab88 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/configuration/reverseproxy.html.vue @@ -0,0 +1,75 @@ +<template><div><h1 id="parameters-fhir-reverse-proxy" tabindex="-1"><a class="header-anchor" href="#parameters-fhir-reverse-proxy"><span>Parameters FHIR Reverse Proxy</span></a></h1> +<h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.js new file mode 100644 index 000000000..b23216a60 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.09,\"words\":27},\"filePathRelative\":\"release/archive/v1.0.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.0.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li><a href=\\\"/release/archive/v1.0.0/maintain/configuration/\\\" target=\\\"_blank\\\">Configuration Paramters</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.vue new file mode 100644 index 000000000..e0a26d920 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/index.html.vue @@ -0,0 +1,10 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.0.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li><RouteLink to="/release/archive/v1.0.0/maintain/configuration/">Configuration Paramters</RouteLink></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.js new file mode 100644 index 000000000..f19d007df --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/install.html\",\"title\":\"Install DSF 1.0.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.0.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":6.1,\"words\":1831},\"filePathRelative\":\"release/archive/v1.0.0/maintain/install.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Member of existing networks</p>\\n<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href=\\\"/oldstable\\\">DSF 0.9.x</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.vue new file mode 100644 index 000000000..1e38b9135 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/install.html.vue @@ -0,0 +1,321 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Member of existing networks</p> +<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href="/oldstable">DSF 0.9.x</a>.</p> +</div> +<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo addgroup --gid 2101 fhir</span></span> +<span class="line"><span>sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_0_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_0_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L44: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L149: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L150: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="configuration/reverseproxy">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: https://<em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN</em>/fhir<br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></li> +<li><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <em>TODO_ORGANIZATION_IDENTIFIER</em><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></li> +<li><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <em>TODO_CLIENT_CERTIFICATE_THUMBPRINT</em><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</li> +<li><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: You can add other client certificates (e.g. personal DFN PKI S/MIME certificates, e.g. from admins) to your DSF instance.<br> +Set the SHA-512 Hash (lowercase hex) of your additional client certificates. The parameter TODO_WEBUSER_CLIENT_CERTIFICATE_THUMBPRINT can be a single thumbprint or can be expanded to a list (like dsf-role). If you don't have additional thumbprints you want to add, simply remove the <em>DEV_DSF_FHIR_SERVER_ROLECONFIG</em> variable from your docker-compose file.</li> +<li>For additional environment variables, see <a href="configuration/fhir">DSF configuration parameters - FHIR Server</a></li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo addgroup --gid 2202 bpe</span></span> +<span class="line"><span>sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_0_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_0_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L18: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li><strong>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <em>TODO_ORGANIZATION_IDENTIFIER</em><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></li> +<li><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: https://<em>TODO_DSF_FHIR_SERVER_FQDN</em>/fhir<br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></li> +<li>For additional environment variables, see <a href="configuration/bpe">DSF configuration parameters - BPE Server</a></li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..75db5d080 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.45,\"words\":134},\"filePathRelative\":\"release/archive/v1.0.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Do not upgrade unless prompted!</p>\\n<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p>\\n</div>\\n<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..000bbc92a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,17 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Do not upgrade unless prompted!</p> +<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p> +</div> +<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p> +<ol> +<li>shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>install the new DSF according to the <a href="install">instructions</a>.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..93aabf2a6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.0.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.0.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.0.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.js new file mode 100644 index 000000000..c944554be --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.1.0/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.vue new file mode 100644 index 000000000..3893ce82d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.js new file mode 100644 index 000000000..b1312e15e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.1.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..bed3cc5f4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.1.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.js new file mode 100644 index 000000000..e4062ce4f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.1.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.js new file mode 100644 index 000000000..0177ad86c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/\",\"title\":\"DSF 1.1.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.1.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.1.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.vue new file mode 100644 index 000000000..6d3f2682b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.x.</a></li> +<li><a href="maintain/install">Install DSF 1.1.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..7f8a45ae5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.3,\"words\":391},\"filePathRelative\":\"release/archive/v1.1.0/maintain/allowList-mgm.md\",\"excerpt\":\"<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Caution</p>\\n<p>This is an outdated version of the Allow List Management documentation. Please use <a href=\\\"/stable//maintain/allowList-mgm\\\">the current version</a>, even if you use an outdated DSF version.</p>\\n</div>\\n<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">here</a>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..9163bd912 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,30 @@ +<template><div><div class="hint-container caution"> +<p class="hint-container-title">Caution</p> +<p>This is an outdated version of the Allow List Management documentation. Please use <a href="/stable//maintain/allowList-mgm">the current version</a>, even if you use an outdated DSF version.</p> +</div> +<p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">here</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow <a href="https://www.ssl.com/how-to/configuring-client-authentication-certificates-in-web-browsers/">here</a>.<br> +Currently, the Allow List Management Tool is only for DSF <b>TEST</b> infrastructure. For production, please write us an <a href="mailto:dsf-gecko@hs-heilbronn.de">E-Mail</a> with your information.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test infrastructure)<br> +1.1 If none exists yet, read <a href="install">here</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">here</a></li> +<li>Organization identifier (FQDN of your organization website, e.g. <em><a href="http://hs-heilbronn.de" target="_blank" rel="noopener noreferrer">hs-heilbronn.de</a></em>)</li> +<li>FHIR Endpoint URL (e.g. <em><a href="https://gth.gecko.hs-heilbronn.de/fhir" target="_blank" rel="noopener noreferrer">https://gth.gecko.hs-heilbronn.de/fhir</a></em> )</li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the <a href="https://allowlist-test.gecko.hs-heilbronn.de/">DSF Allow List Management Tool</a>.<br> +At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..f46971d14 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-bpe-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-bpe-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":7.77,\"words\":2331},\"filePathRelative\":\"release/archive/v1.1.0/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..9a8136169 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/configuration.html.vue @@ -0,0 +1,607 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable loging bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-organization-identifier-value"><span>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.js new file mode 100644 index 000000000..7ced13218 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.1.0/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..6a82271e8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.23,\"words\":370},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..7bea7084d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,81 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient </code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..e25484a8a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..1727f964e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..e4a54f5fb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.76,\"words\":1428},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..7a353384d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/configuration.html.vue @@ -0,0 +1,393 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +<li><strong>Recommendation:</strong> Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character if no roles should be configured</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.js new file mode 100644 index 000000000..1afafa60e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..8134fb0e9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.1.0/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..baa2db3b4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.1.0/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.js new file mode 100644 index 000000000..a77261d4d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.1.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.1.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.vue new file mode 100644 index 000000000..fa0165506 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.1.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.js new file mode 100644 index 000000000..042cd7231 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/install.html\",\"title\":\"Install DSF 1.1.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.1.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.97,\"words\":1790},\"filePathRelative\":\"release/archive/v1.1.0/maintain/install.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Member of existing networks</p>\\n<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href=\\\"/oldstable\\\">DSF 0.9.x</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.vue new file mode 100644 index 000000000..60a143b0c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/install.html.vue @@ -0,0 +1,337 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Member of existing networks</p> +<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href="/oldstable">DSF 0.9.x</a>.</p> +</div> +<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo addgroup --gid 2101 fhir</span></span> +<span class="line"><span>sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_1_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_1_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L44: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L146: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L147: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo addgroup --gid 2202 bpe</span></span> +<span class="line"><span>sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_1_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_1_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L18: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L97: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L98: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..96ecdabc8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.45,\"words\":134},\"filePathRelative\":\"release/archive/v1.1.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Do not upgrade unless prompted!</p>\\n<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p>\\n</div>\\n<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..000bbc92a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,17 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Do not upgrade unless prompted!</p> +<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p> +</div> +<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p> +<ol> +<li>shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>install the new DSF according to the <a href="install">instructions</a>.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..8b00c4c60 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.06,\"words\":317},\"filePathRelative\":\"release/archive/v1.1.0/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.0.0 to 1.1.0 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Upgrade from 0.9.x</p>\\n<p>If you want to migrate from DSF 0.9.x, please follow <a href=\\\"upgrade-from-0\\\">these instructions</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..88d4b07d9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.0.0 to 1.1.0 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Upgrade from 0.9.x</p> +<p>If you want to migrate from DSF 0.9.x, please follow <a href="upgrade-from-0">these instructions</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.1.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.1.0</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.0.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.0.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.1.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.1.0</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.0.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.1.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.1.0, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.1.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.1.0, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..f19560e32 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.1.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.1.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.1.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.js new file mode 100644 index 000000000..d5104ac07 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.2.0/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.vue new file mode 100644 index 000000000..3893ce82d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.js new file mode 100644 index 000000000..f21a58eb4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.2.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..30d27ced1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.2.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.js new file mode 100644 index 000000000..c821e10d8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.2.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.js new file mode 100644 index 000000000..6904231df --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/\",\"title\":\"DSF 1.2.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.2.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.2.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.vue new file mode 100644 index 000000000..f9d6e880a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.x.</a></li> +<li><a href="maintain/install">Install DSF 1.2.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..90014f7f9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.3,\"words\":391},\"filePathRelative\":\"release/archive/v1.2.0/maintain/allowList-mgm.md\",\"excerpt\":\"<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Caution</p>\\n<p>This is an outdated version of the Allow List Management documentation. Please use <a href=\\\"/stable//maintain/allowList-mgm\\\">the current version</a>, even if you use an outdated DSF version.</p>\\n</div>\\n<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">here</a>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..9163bd912 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,30 @@ +<template><div><div class="hint-container caution"> +<p class="hint-container-title">Caution</p> +<p>This is an outdated version of the Allow List Management documentation. Please use <a href="/stable//maintain/allowList-mgm">the current version</a>, even if you use an outdated DSF version.</p> +</div> +<p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">here</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow <a href="https://www.ssl.com/how-to/configuring-client-authentication-certificates-in-web-browsers/">here</a>.<br> +Currently, the Allow List Management Tool is only for DSF <b>TEST</b> infrastructure. For production, please write us an <a href="mailto:dsf-gecko@hs-heilbronn.de">E-Mail</a> with your information.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test infrastructure)<br> +1.1 If none exists yet, read <a href="install">here</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">here</a></li> +<li>Organization identifier (FQDN of your organization website, e.g. <em><a href="http://hs-heilbronn.de" target="_blank" rel="noopener noreferrer">hs-heilbronn.de</a></em>)</li> +<li>FHIR Endpoint URL (e.g. <em><a href="https://gth.gecko.hs-heilbronn.de/fhir" target="_blank" rel="noopener noreferrer">https://gth.gecko.hs-heilbronn.de/fhir</a></em> )</li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the <a href="https://allowlist-test.gecko.hs-heilbronn.de/">DSF Allow List Management Tool</a>.<br> +At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..4ff903315 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.21,\"words\":2464},\"filePathRelative\":\"release/archive/v1.2.0/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..c545bb69e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/configuration.html.vue @@ -0,0 +1,637 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.js new file mode 100644 index 000000000..7d07d6f1b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.2.0/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..702d5899f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..dbea82d78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..b0a56b693 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..392cacaf4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..21629dbe6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.7,\"words\":1411},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..cd1a5c34c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/configuration.html.vue @@ -0,0 +1,392 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.js new file mode 100644 index 000000000..1c70a1efd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..64c1880b9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.2.0/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..ec4ecdbf3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.2.0/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.js new file mode 100644 index 000000000..73ebc6ac9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.2.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.2.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.vue new file mode 100644 index 000000000..bab6066eb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.2.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.js new file mode 100644 index 000000000..b525f592e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/install.html\",\"title\":\"Install DSF 1.2.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.2.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.97,\"words\":1791},\"filePathRelative\":\"release/archive/v1.2.0/maintain/install.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Member of existing networks</p>\\n<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href=\\\"/oldstable\\\">DSF 0.9.x</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.vue new file mode 100644 index 000000000..efe2c52c8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/install.html.vue @@ -0,0 +1,337 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Member of existing networks</p> +<p>If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently <a href="/oldstable">DSF 0.9.x</a>.</p> +</div> +<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_2_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_2_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L44: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L146: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L147: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_2_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_2_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L18: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L97: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L98: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..f4861b387 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.45,\"words\":134},\"filePathRelative\":\"release/archive/v1.2.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Do not upgrade unless prompted!</p>\\n<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p>\\n</div>\\n<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..000bbc92a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,17 @@ +<template><div><div class="hint-container warning"> +<p class="hint-container-title">Do not upgrade unless prompted!</p> +<p>Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).</p> +</div> +<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:</p> +<ol> +<li>shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>install the new DSF according to the <a href="install">instructions</a>.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..c80aeefbb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.1.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.1.0\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.71,\"words\":513},\"filePathRelative\":\"release/archive/v1.2.0/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.1.0 to 1.2.0 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Upgrade from 0.9.x</p>\\n<p>If you want to migrate from DSF 0.9.x, please follow <a href=\\\"upgrade-from-0\\\">these instructions</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..f02efef4e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/maintain/upgrade-from-1.html.vue @@ -0,0 +1,103 @@ +<template><div><p>Upgrading the DSF from 1.1.0 to 1.2.0 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Upgrade from 0.9.x</p> +<p>If you want to migrate from DSF 0.9.x, please follow <a href="upgrade-from-0">these instructions</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.2.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.2.0 and remove the old healthcheck definition. The new healthcheck is defined as part of the docker image.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- healthcheck:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- test: ["CMD", "java", "-cp", "dsf_fhir.jar", "dev.dsf.common.status.client.StatusClient"]</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- interval: 10s</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- timeout: 15s</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- retries: 5</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>The role configuration is now optional. If you don't use roles, you can remove the role config (default for new installations):</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> environment:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- # TODO specify role configuration to allow access to the UI via web-browser or REST API for specific users, see documentation at dsf.dev</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- DEV_DSF_FHIR_SERVER_ROLECONFIG: |</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="4"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.2.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.2.0 and remove the old healthcheck definition. The new healthcheck is defined as part of the docker image.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.1.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- healthcheck:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- test: ["CMD", "java", "-cp", "dsf_bpe.jar", "dev.dsf.common.status.client.StatusClient"]</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- interval: 10s</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- timeout: 15s</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- retries: 5</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>DSF v1.2.0 is not compatible with the Ping/Pong process plugin v1.0.0.0, upgrade to the <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">Ping/Pong plugin v1.0.1.0</a> by removing the old jar file and replacing it with the new v1.0.1.0 one.</p> +</li> +<li> +<p>We have released a new version of the Allow List Process plugin where we added support for delete operations. Please upgrade to the <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">Allow-List process v1.0.0.1</a> by removing the old jar file and replacing it with the new v1.0.0.1 one.</p> +</li> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.2.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.2.0, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.2.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.2.0, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..e36a44bb2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.2.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.2.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.2.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.js new file mode 100644 index 000000000..1b311b9a3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.3.0/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.vue new file mode 100644 index 000000000..3893ce82d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.js new file mode 100644 index 000000000..4ddd89ee9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.3.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..094564782 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.3.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.js new file mode 100644 index 000000000..3635088a1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.js new file mode 100644 index 000000000..d52deb6a6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/\",\"title\":\"DSF 1.3.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.3.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.3.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.vue new file mode 100644 index 000000000..445edd9ff --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.x.</a></li> +<li><a href="maintain/install">Install DSF 1.3.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..ef61fd9d8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.31,\"words\":392},\"filePathRelative\":\"release/archive/v1.3.0/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..a8a994cd0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,28 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow <a href="https://www.ssl.com/how-to/configuring-client-authentication-certificates-in-web-browsers/">here</a>.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier (FQDN of your organization website, e.g. <em><a href="http://hs-heilbronn.de" target="_blank" rel="noopener noreferrer">hs-heilbronn.de</a></em>)</li> +<li>FHIR Endpoint URL (e.g. <em><a href="https://gth.gecko.hs-heilbronn.de/fhir" target="_blank" rel="noopener noreferrer">https://gth.gecko.hs-heilbronn.de/fhir</a></em> )</li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists respective Allow List Management Tool.</p> +<p><a href="https://allowlist-test.gecko.hs-heilbronn.de/">Click here to open the DSF Allow List Management Tool for the <strong>Test</strong> infrastructure</a>.</p> +<p><a href="https://allowlist.gecko.hs-heilbronn.de/">Click here to open the DSF Allow List Management Tool for the <strong>Production</strong> infrastructure</a>.</p> +<p>We use different colors for the DSF Allow List Management Tools in the <strong>Test</strong> (green) and <strong>Production</strong> (blue) infastructure.</p> +<p>At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..4d3f373ac --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.21,\"words\":2464},\"filePathRelative\":\"release/archive/v1.3.0/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..80543e4e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/configuration.html.vue @@ -0,0 +1,637 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.js new file mode 100644 index 000000000..66f85ec0e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.3.0/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..cd5926cdd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..dbea82d78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..df07454b5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..59883d90c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..00bd12b9b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.71,\"words\":1412},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..eb0365cc2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/configuration.html.vue @@ -0,0 +1,392 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.js new file mode 100644 index 000000000..9633a4306 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..da6b72e67 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.3.0/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..0785c612e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.3.0/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.js new file mode 100644 index 000000000..9df945850 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.3.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.3.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.vue new file mode 100644 index 000000000..2f3db9058 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.3.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.js new file mode 100644 index 000000000..dda768f9b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.3.0/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatable process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.vue new file mode 100644 index 000000000..c09c49eca --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install-plugins.html.vue @@ -0,0 +1,20 @@ +<template><div><p>You can find an overview of compatable process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +</ul> +<!-- - MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases +- MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases --> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.js new file mode 100644 index 000000000..18a17b52c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/install.html\",\"title\":\"Install DSF 1.3.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.3.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.84,\"words\":1753},\"filePathRelative\":\"release/archive/v1.3.0/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.vue new file mode 100644 index 000000000..748d13af8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/install.html.vue @@ -0,0 +1,333 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_3_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_3_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L44: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L146: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L147: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_3_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_3_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L18: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L97: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L98: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..6d4ba9101 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.3.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..2e2c08f8d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.2.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.2.0\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.14,\"words\":342},\"filePathRelative\":\"release/archive/v1.3.0/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.2.0 to 1.3.0 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Upgrade from 0.9.x</p>\\n<p>If you want to migrate from DSF 0.9.x, please follow <a href=\\\"upgrade-from-0\\\">these instructions</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..b4d9e990c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/maintain/upgrade-from-1.html.vue @@ -0,0 +1,82 @@ +<template><div><p>Upgrading the DSF from 1.2.0 to 1.3.0 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Upgrade from 0.9.x</p> +<p>If you want to migrate from DSF 0.9.x, please follow <a href="upgrade-from-0">these instructions</a>.</p> +</div> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.2.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.3.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.0, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.3.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.0, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..ec27cb192 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.js new file mode 100644 index 000000000..e0e13a11e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.3.1/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.vue new file mode 100644 index 000000000..3893ce82d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.js new file mode 100644 index 000000000..a1fdd7651 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.3.1/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..95a00e104 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.3.1/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.js new file mode 100644 index 000000000..18466b624 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.1/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.js new file mode 100644 index 000000000..039884d37 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/\",\"title\":\"DSF 1.3.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.3.1\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.3.1/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.vue new file mode 100644 index 000000000..584f2a34a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.3.0</a></li> +<li><a href="maintain/install">Install DSF 1.3.1</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..b9d3a2e98 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.3.1/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..32fc8507d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.21,\"words\":2464},\"filePathRelative\":\"release/archive/v1.3.1/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..80543e4e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/configuration.html.vue @@ -0,0 +1,637 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.js new file mode 100644 index 000000000..e83056422 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.3.1/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..e399edb52 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..dbea82d78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..bba22c9c0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..806cc50cf --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..b5efe0223 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.71,\"words\":1412},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..eb0365cc2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/configuration.html.vue @@ -0,0 +1,392 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.js new file mode 100644 index 000000000..2739e305b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..3e300e610 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.3.1/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..cb40ae6ca --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.3.1/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.js new file mode 100644 index 000000000..8fc2fba60 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.3.1/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.3.1</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.vue new file mode 100644 index 000000000..7f6371b18 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.3.1</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.js new file mode 100644 index 000000000..3ae488d2d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.3.1/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatable process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.vue new file mode 100644 index 000000000..c09c49eca --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install-plugins.html.vue @@ -0,0 +1,20 @@ +<template><div><p>You can find an overview of compatable process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +</ul> +<!-- - MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases +- MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases --> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.js new file mode 100644 index 000000000..116d165a2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/install.html\",\"title\":\"Install DSF 1.3.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.3.1\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.77,\"words\":1731},\"filePathRelative\":\"release/archive/v1.3.1/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.vue new file mode 100644 index 000000000..54d0f1553 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_3_1.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_3_1.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_3_1.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_3_1.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..b4757d353 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.3.1/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..e2e503343 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.3.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.3.0\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.3.1/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.3.0 to 1.3.1 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..0f14824cd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.3.0 to 1.3.1 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.1_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.1.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.1_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.1.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.3.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.3.1. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.1, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.3.1. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.1, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.js new file mode 100644 index 000000000..dd4e6fe5a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.1/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.1/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.1/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.js new file mode 100644 index 000000000..624c71ac7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.29,\"words\":88},\"filePathRelative\":\"release/archive/v1.3.2/develop/create.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.vue new file mode 100644 index 000000000..3893ce82d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/create.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.js new file mode 100644 index 000000000..db86de3d4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.3.2/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..1cee4c669 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.3.2/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.js new file mode 100644 index 000000000..29f84ae59 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.2/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.js new file mode 100644 index 000000000..320f6ee78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/\",\"title\":\"DSF 1.3.2\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.3.2\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.3.2/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.vue new file mode 100644 index 000000000..f106aa58b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.3.0</a></li> +<li><a href="maintain/install">Install DSF 1.3.2</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..19b157a47 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.3.2/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..eea04d770 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.21,\"words\":2464},\"filePathRelative\":\"release/archive/v1.3.2/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..80543e4e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/configuration.html.vue @@ -0,0 +1,637 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.js new file mode 100644 index 000000000..2e210f03d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.3.2/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..31780c602 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..dbea82d78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..261dbd3ad --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..415995b04 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..29862762d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.71,\"words\":1412},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..eb0365cc2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/configuration.html.vue @@ -0,0 +1,392 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.js new file mode 100644 index 000000000..ed564fa26 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..817779621 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.3.2/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..395a4ff53 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.3.2/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.js new file mode 100644 index 000000000..c3730c1ec --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.3.2/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.3.1</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.vue new file mode 100644 index 000000000..7f6371b18 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.3.1</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.js new file mode 100644 index 000000000..9c09d0af9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.3.2/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatable process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.vue new file mode 100644 index 000000000..110d8638e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install-plugins.html.vue @@ -0,0 +1,22 @@ +<template><div><p>You can find an overview of compatable process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +</ul> +<!-- - MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases --> +<ul> +<li>MII-Data-Transfer: <a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases</a></li> +</ul> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.js new file mode 100644 index 000000000..b18133d55 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/install.html\",\"title\":\"Install DSF 1.3.2\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.3.2\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.77,\"words\":1731},\"filePathRelative\":\"release/archive/v1.3.2/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.vue new file mode 100644 index 000000000..4f483d498 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_3_2.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_3_2.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_3_2.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_3_2.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..38aa221db --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.3.2/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..fc580b39d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.3.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.3.1\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.3.2/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.3.1 to 1.3.2 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..d90951207 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.3.1 to 1.3.2 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.2_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.2.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.2_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.2.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.3.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.3.2. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.2, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.3.2. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.2, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.js new file mode 100644 index 000000000..40d8909b9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.3.2/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.3.2/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.3.2/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.js new file mode 100644 index 000000000..76866e4a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/contribute/code.html\",\"title\":\"Contribute code\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute code\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Benefits of Contributing:\",\"slug\":\"benefits-of-contributing\",\"link\":\"#benefits-of-contributing\",\"children\":[]},{\"level\":2,\"title\":\"General\",\"slug\":\"general\",\"link\":\"#general\",\"children\":[{\"level\":3,\"title\":\"Code style\",\"slug\":\"code-style\",\"link\":\"#code-style\",\"children\":[]},{\"level\":3,\"title\":\"Branching strategy\",\"slug\":\"branching-strategy\",\"link\":\"#branching-strategy\",\"children\":[]}]},{\"level\":2,\"title\":\"Setting up the project\",\"slug\":\"setting-up-the-project\",\"link\":\"#setting-up-the-project\",\"children\":[{\"level\":3,\"title\":\"Java\",\"slug\":\"java\",\"link\":\"#java\",\"children\":[]},{\"level\":3,\"title\":\"Docker\",\"slug\":\"docker\",\"link\":\"#docker\",\"children\":[]},{\"level\":3,\"title\":\"Maven\",\"slug\":\"maven\",\"link\":\"#maven\",\"children\":[]}]},{\"level\":2,\"title\":\"Workflow\",\"slug\":\"workflow\",\"link\":\"#workflow\",\"children\":[{\"level\":3,\"title\":\"Pull request process\",\"slug\":\"pull-request-process\",\"link\":\"#pull-request-process\",\"children\":[]}]},{\"level\":2,\"title\":\"Data Security in DSF Development\",\"slug\":\"data-security-in-dsf-development\",\"link\":\"#data-security-in-dsf-development\",\"children\":[]}],\"readingTime\":{\"minutes\":2.51,\"words\":754},\"filePathRelative\":\"release/archive/v1.4.0/contribute/code.md\",\"excerpt\":\"<p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p>\\n<h3>Benefits of Contributing:</h3>\\n<ul>\\n<li>Foster community growth and diversification.</li>\\n<li>Sharpen your coding skills.</li>\\n<li>Gain recognition in the DSF community.</li>\\n<li>Directly impact the future of data sharing in medicine.</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.vue new file mode 100644 index 000000000..7ba4c5366 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/code.html.vue @@ -0,0 +1,76 @@ +<template><div><p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p> +<h3 id="benefits-of-contributing" tabindex="-1"><a class="header-anchor" href="#benefits-of-contributing"><span>Benefits of Contributing:</span></a></h3> +<ul> +<li>Foster community growth and diversification.</li> +<li>Sharpen your coding skills.</li> +<li>Gain recognition in the DSF community.</li> +<li>Directly impact the future of data sharing in medicine.</li> +</ul> +<p>Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.</p> +<h2 id="general" tabindex="-1"><a class="header-anchor" href="#general"><span>General</span></a></h2> +<h3 id="code-style" tabindex="-1"><a class="header-anchor" href="#code-style"><span>Code style</span></a></h3> +<p>You can import our code style for your specific IDE:</p> +<ul> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/eclipse-formatter-config.xml" target="_blank" rel="noopener noreferrer">Eclipse</a>. Open your preferences, click on <code v-pre>Java</code>, <code v-pre>Code style</code>, <code v-pre>Formatter</code>, <code v-pre>Import</code> and select the downloaded file.</li> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/intellij-formatter-config.xml" target="_blank" rel="noopener noreferrer">IntelliJ</a>. Open your settings, click on <code v-pre>Editor</code>, <code v-pre>Code style</code>, <code v-pre>Java</code>, the settings icon, <code v-pre>import scheme</code>, <code v-pre>IntelliJ</code> and select the downloaded file.</li> +</ul> +<p>Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use <code v-pre>mvn compile -Pformat-and-sort</code>.</p> +<h3 id="branching-strategy" tabindex="-1"><a class="header-anchor" href="#branching-strategy"><span>Branching strategy</span></a></h3> +<p><a href="https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow" target="_blank" rel="noopener noreferrer">Git Flow</a> is used as this project's branching strategy. Therefore, you will find the following structure:</p> +<ul> +<li>main</li> +<li>develop</li> +<li>issue</li> +<li>hotfix</li> +<li>release</li> +</ul> +<p>Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.</p> +<h4 id="branch-naming" tabindex="-1"><a class="header-anchor" href="#branch-naming"><span>Branch naming</span></a></h4> +<p>The following ruleset is applied to name branches:</p> +<ul> +<li><code v-pre>issue/<issue-number>_<issue-name></code></li> +<li><code v-pre>hotfix/<version></code></li> +<li><code v-pre>release/<version></code></li> +</ul> +<h2 id="setting-up-the-project" tabindex="-1"><a class="header-anchor" href="#setting-up-the-project"><span>Setting up the project</span></a></h2> +<p>This chapter lists all important requirements to get the project buildable and running properly.</p> +<h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3> +<p>This project uses Java JDK 17, so make sure you have it installed on your system.</p> +<h3 id="docker" tabindex="-1"><a class="header-anchor" href="#docker"><span>Docker</span></a></h3> +<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is used in this project to test database functionality and to run more complex test-setups.</p> +<h3 id="maven" tabindex="-1"><a class="header-anchor" href="#maven"><span>Maven</span></a></h3> +<p>The project relies on <a href="https://maven.apache.org/" target="_blank" rel="noopener noreferrer">Maven</a> as its management tool.<br> +<em>Important:</em> When building the project you might encounter the following error:<br> +<em>Could not determine gpg version</em> <a href="https://gnupg.org/" target="_blank" rel="noopener noreferrer">GPG</a> is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with <code v-pre>-Dgpg.skip</code>.</p> +<h2 id="workflow" tabindex="-1"><a class="header-anchor" href="#workflow"><span>Workflow</span></a></h2> +<ol> +<li>Create an issue or comment on an issue that you want to contribute some feature</li> +<li>Fork the repository, create a branch and mention it in the issue</li> +<li>If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests</li> +<li>If your changes are production-ready, create a <a href="https://github.com/datasharingframework/dsf/pulls" target="_blank" rel="noopener noreferrer">pull request</a>.</li> +</ol> +<h3 id="pull-request-process" tabindex="-1"><a class="header-anchor" href="#pull-request-process"><span>Pull request process</span></a></h3> +<p>We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:</p> +<ol> +<li> +<p><strong>Ship</strong>: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.</p> +</li> +<li> +<p><strong>Show</strong>: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.</p> +</li> +<li> +<p><strong>Ask</strong>: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.</p> +</li> +</ol> +<p>This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.</p> +<p>For more information on Fowler's approach, visit <a href="https://martinfowler.com/articles/ship-show-ask.html" target="_blank" rel="noopener noreferrer">Martin Fowler's article on Pull Requests</a>.</p> +<h2 id="data-security-in-dsf-development" tabindex="-1"><a class="header-anchor" href="#data-security-in-dsf-development"><span>Data Security in DSF Development</span></a></h2> +<p>The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:</p> +<ul> +<li><strong>No development with real personal data:</strong> Always use anonymized or synthetic data for development purposes.</li> +<li><strong>No personal data in repositories:</strong> Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.</li> +<li><strong>Review all log files:</strong> Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.js new file mode 100644 index 000000000..9f5a2d847 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/contribute/documentation.html\",\"title\":\"Contribute documentation\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute documentation\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.74,\"words\":222},\"filePathRelative\":\"release/archive/v1.4.0/contribute/documentation.md\",\"excerpt\":\"<p><strong>Join us in enhancing our documentation!</strong></p>\\n<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p>\\n<ol>\\n<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li>\\n<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io/issues\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li>\\n<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li>\\n</ol>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.vue new file mode 100644 index 000000000..5679136e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/documentation.html.vue @@ -0,0 +1,11 @@ +<template><div><p><strong>Join us in enhancing our documentation!</strong></p> +<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p> +<ol> +<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li> +<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io/issues" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li> +<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li> +</ol> +<p>We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.js new file mode 100644 index 000000000..d4eb4bbd8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/contribute/\",\"title\":\"Contribute\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Ways you can contribute:\",\"slug\":\"ways-you-can-contribute\",\"link\":\"#ways-you-can-contribute\",\"children\":[]}],\"readingTime\":{\"minutes\":1.64,\"words\":491},\"filePathRelative\":\"release/archive/v1.4.0/contribute/readme.md\",\"excerpt\":\"<p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.vue new file mode 100644 index 000000000..f22652543 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/contribute/index.html.vue @@ -0,0 +1,51 @@ +<template><div><p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p> +<h3 id="ways-you-can-contribute" tabindex="-1"><a class="header-anchor" href="#ways-you-can-contribute"><span><strong>Ways you can contribute:</strong></span></a></h3> +<ol> +<li><strong>Helping other users</strong>: +<ul> +<li><strong>MII Zulip</strong>: If you are part of the German Medical Informatics Initiative, <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29" target="_blank" rel="noopener noreferrer">join the MII Zulip community</a> to assist others, share your knowledge, and learn from fellow contributors.</li> +<li><strong>GitHub Discussions</strong>: Engage with our community in <a href="https://github.com/datasharingframework/dsf/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> by answering questions, providing feedback, and sharing your insights.</li> +</ul> +</li> +<li><strong>Testing releases</strong>: +<ul> +<li><strong>Stay ahead</strong>: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.</li> +<li><strong>Report findings</strong>: Share your testing results to help us refine and enhance our releases.</li> +</ul> +</li> +<li><strong>Reviewing changes</strong>: +<ul> +<li><strong>Peer review</strong>: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.</li> +<li><strong>Constructive feedback</strong>: Offer constructive feedback and suggestions to help improve and refine proposed changes.</li> +</ul> +</li> +<li><strong>Documentation changes</strong>: +<ul> +<li><strong>Improve documentation</strong>: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our <a href="./documentation">Getting started guide for documentation contributions</a> to DSF.</li> +<li><strong>Suggest improvements</strong>: If you notice gaps or areas for enhancement in our documentation, we welcome <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">your suggestions and contributions</a>.</li> +</ul> +</li> +<li><strong>Contributing bug reports</strong>: +<ul> +<li><strong>Report bugs</strong>: If you find a bug, please report it via <a href="https://github.com/datasharingframework/dsf/issues" target="_blank" rel="noopener noreferrer">an issue on GitHub</a>. Detailed bug reports are incredibly helpful.</li> +<li><strong>Reproduction steps</strong>: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.</li> +</ul> +</li> +<li><strong>Contributing feature requests</strong>: +<ul> +<li><strong>Suggest features</strong>: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.</li> +<li><strong>Collaborate on implementation</strong>: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our <a href="./code">Getting started guide for code contributions</a> to DSF.</li> +</ul> +</li> +<li><strong>Contributing process plugins</strong>: +<ul> +<li><strong>Develop process plugins for the DSF</strong>: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our <a href="https://dsf.dev/stable/develop/" target="_blank" rel="noopener noreferrer">Getting started guide for process plugin development</a> will be a useful reference.</li> +<li><strong>Share your work</strong>: Your plugins could be a valuable addition to the ecosystem and benefit other users.</li> +</ul> +</li> +</ol> +<p>Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.</p> +<p><strong>Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!</strong></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.js new file mode 100644 index 000000000..b0c09e2d8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.34,\"words\":102},\"filePathRelative\":\"release/archive/v1.4.0/develop/create.md\",\"excerpt\":\"<p>Visit the <a href=\\\"/release/archive/for-you/\\\" target=\\\"_blank\\\">how the DSF can help you</a> page to get started.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.vue new file mode 100644 index 000000000..379827b6b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/create.html.vue @@ -0,0 +1,13 @@ +<template><div><p>Visit the <RouteLink to="/release/archive/for-you/">how the DSF can help you</RouteLink> page to get started.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.js new file mode 100644 index 000000000..14168d30b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.4.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..461792a9d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.4.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.js new file mode 100644 index 000000000..a32d0f1a8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.4.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.js new file mode 100644 index 000000000..99c2c791f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/\",\"title\":\"DSF 1.4.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.4.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.4.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.vue new file mode 100644 index 000000000..86297b1b4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.3.2</a></li> +<li><a href="maintain/install">Install DSF 1.4.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..6680e8938 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.4.0/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..2327b3337 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.21,\"words\":2464},\"filePathRelative\":\"release/archive/v1.4.0/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..80543e4e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/configuration.html.vue @@ -0,0 +1,637 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.js new file mode 100644 index 000000000..23278bd35 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":9},\"filePathRelative\":\"release/archive/v1.4.0/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/bpe/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..3d68b06b1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..dbea82d78 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..3e476cf18 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..bbbdd5d87 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.47,\"words\":742},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..ee0f70860 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>To types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..18d515564 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":4.71,\"words\":1412},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..eb0365cc2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/configuration.html.vue @@ -0,0 +1,392 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.js new file mode 100644 index 000000000..7f0893b89 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..a5c19669b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.33,\"words\":400},\"filePathRelative\":\"release/archive/v1.4.0/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..ce013fc27 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.4.0/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.js new file mode 100644 index 000000000..0f3adf9f1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.16,\"words\":49},\"filePathRelative\":\"release/archive/v1.4.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.4.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.vue new file mode 100644 index 000000000..a0e6480f5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/index.html.vue @@ -0,0 +1,26 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.4.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.js new file mode 100644 index 000000000..770ed2a24 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.4.0/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatable process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.vue new file mode 100644 index 000000000..7650f5c19 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install-plugins.html.vue @@ -0,0 +1,22 @@ +<template><div><p>You can find an overview of compatable process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-feasibility/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +</ul> +<!-- - MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases --> +<ul> +<li>MII-Data-Transfer: <a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases</a></li> +</ul> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.js new file mode 100644 index 000000000..90e652d11 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/install.html\",\"title\":\"Install DSF 1.4.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.4.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.77,\"words\":1731},\"filePathRelative\":\"release/archive/v1.4.0/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.vue new file mode 100644 index 000000000..e4bcc3d71 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_4_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_4_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_4_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_4_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..06c628e87 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.4.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..fb5b6ef4d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.3.2\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.3.2\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.4.0/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.3.2 to 1.4.0 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..a55fd4213 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.3.2 to 1.4.0 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.4.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.4.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.4.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.4.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.3.2</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.4.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.4.0, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.4.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.4.0, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..1f57a2d4e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.4.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.4.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.4.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.js new file mode 100644 index 000000000..53a7c2789 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/contribute/code.html\",\"title\":\"Contribute code\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute code\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Benefits of Contributing:\",\"slug\":\"benefits-of-contributing\",\"link\":\"#benefits-of-contributing\",\"children\":[]},{\"level\":2,\"title\":\"General\",\"slug\":\"general\",\"link\":\"#general\",\"children\":[{\"level\":3,\"title\":\"Code style\",\"slug\":\"code-style\",\"link\":\"#code-style\",\"children\":[]},{\"level\":3,\"title\":\"Branching strategy\",\"slug\":\"branching-strategy\",\"link\":\"#branching-strategy\",\"children\":[]}]},{\"level\":2,\"title\":\"Setting up the project\",\"slug\":\"setting-up-the-project\",\"link\":\"#setting-up-the-project\",\"children\":[{\"level\":3,\"title\":\"Java\",\"slug\":\"java\",\"link\":\"#java\",\"children\":[]},{\"level\":3,\"title\":\"Docker\",\"slug\":\"docker\",\"link\":\"#docker\",\"children\":[]},{\"level\":3,\"title\":\"Maven\",\"slug\":\"maven\",\"link\":\"#maven\",\"children\":[]}]},{\"level\":2,\"title\":\"Workflow\",\"slug\":\"workflow\",\"link\":\"#workflow\",\"children\":[{\"level\":3,\"title\":\"Pull request process\",\"slug\":\"pull-request-process\",\"link\":\"#pull-request-process\",\"children\":[]}]},{\"level\":2,\"title\":\"Data Security in DSF Development\",\"slug\":\"data-security-in-dsf-development\",\"link\":\"#data-security-in-dsf-development\",\"children\":[]}],\"readingTime\":{\"minutes\":2.51,\"words\":754},\"filePathRelative\":\"release/archive/v1.5.0/contribute/code.md\",\"excerpt\":\"<p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p>\\n<h3>Benefits of Contributing:</h3>\\n<ul>\\n<li>Foster community growth and diversification.</li>\\n<li>Sharpen your coding skills.</li>\\n<li>Gain recognition in the DSF community.</li>\\n<li>Directly impact the future of data sharing in medicine.</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.vue new file mode 100644 index 000000000..7ba4c5366 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/code.html.vue @@ -0,0 +1,76 @@ +<template><div><p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p> +<h3 id="benefits-of-contributing" tabindex="-1"><a class="header-anchor" href="#benefits-of-contributing"><span>Benefits of Contributing:</span></a></h3> +<ul> +<li>Foster community growth and diversification.</li> +<li>Sharpen your coding skills.</li> +<li>Gain recognition in the DSF community.</li> +<li>Directly impact the future of data sharing in medicine.</li> +</ul> +<p>Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.</p> +<h2 id="general" tabindex="-1"><a class="header-anchor" href="#general"><span>General</span></a></h2> +<h3 id="code-style" tabindex="-1"><a class="header-anchor" href="#code-style"><span>Code style</span></a></h3> +<p>You can import our code style for your specific IDE:</p> +<ul> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/eclipse-formatter-config.xml" target="_blank" rel="noopener noreferrer">Eclipse</a>. Open your preferences, click on <code v-pre>Java</code>, <code v-pre>Code style</code>, <code v-pre>Formatter</code>, <code v-pre>Import</code> and select the downloaded file.</li> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/intellij-formatter-config.xml" target="_blank" rel="noopener noreferrer">IntelliJ</a>. Open your settings, click on <code v-pre>Editor</code>, <code v-pre>Code style</code>, <code v-pre>Java</code>, the settings icon, <code v-pre>import scheme</code>, <code v-pre>IntelliJ</code> and select the downloaded file.</li> +</ul> +<p>Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use <code v-pre>mvn compile -Pformat-and-sort</code>.</p> +<h3 id="branching-strategy" tabindex="-1"><a class="header-anchor" href="#branching-strategy"><span>Branching strategy</span></a></h3> +<p><a href="https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow" target="_blank" rel="noopener noreferrer">Git Flow</a> is used as this project's branching strategy. Therefore, you will find the following structure:</p> +<ul> +<li>main</li> +<li>develop</li> +<li>issue</li> +<li>hotfix</li> +<li>release</li> +</ul> +<p>Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.</p> +<h4 id="branch-naming" tabindex="-1"><a class="header-anchor" href="#branch-naming"><span>Branch naming</span></a></h4> +<p>The following ruleset is applied to name branches:</p> +<ul> +<li><code v-pre>issue/<issue-number>_<issue-name></code></li> +<li><code v-pre>hotfix/<version></code></li> +<li><code v-pre>release/<version></code></li> +</ul> +<h2 id="setting-up-the-project" tabindex="-1"><a class="header-anchor" href="#setting-up-the-project"><span>Setting up the project</span></a></h2> +<p>This chapter lists all important requirements to get the project buildable and running properly.</p> +<h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3> +<p>This project uses Java JDK 17, so make sure you have it installed on your system.</p> +<h3 id="docker" tabindex="-1"><a class="header-anchor" href="#docker"><span>Docker</span></a></h3> +<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is used in this project to test database functionality and to run more complex test-setups.</p> +<h3 id="maven" tabindex="-1"><a class="header-anchor" href="#maven"><span>Maven</span></a></h3> +<p>The project relies on <a href="https://maven.apache.org/" target="_blank" rel="noopener noreferrer">Maven</a> as its management tool.<br> +<em>Important:</em> When building the project you might encounter the following error:<br> +<em>Could not determine gpg version</em> <a href="https://gnupg.org/" target="_blank" rel="noopener noreferrer">GPG</a> is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with <code v-pre>-Dgpg.skip</code>.</p> +<h2 id="workflow" tabindex="-1"><a class="header-anchor" href="#workflow"><span>Workflow</span></a></h2> +<ol> +<li>Create an issue or comment on an issue that you want to contribute some feature</li> +<li>Fork the repository, create a branch and mention it in the issue</li> +<li>If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests</li> +<li>If your changes are production-ready, create a <a href="https://github.com/datasharingframework/dsf/pulls" target="_blank" rel="noopener noreferrer">pull request</a>.</li> +</ol> +<h3 id="pull-request-process" tabindex="-1"><a class="header-anchor" href="#pull-request-process"><span>Pull request process</span></a></h3> +<p>We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:</p> +<ol> +<li> +<p><strong>Ship</strong>: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.</p> +</li> +<li> +<p><strong>Show</strong>: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.</p> +</li> +<li> +<p><strong>Ask</strong>: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.</p> +</li> +</ol> +<p>This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.</p> +<p>For more information on Fowler's approach, visit <a href="https://martinfowler.com/articles/ship-show-ask.html" target="_blank" rel="noopener noreferrer">Martin Fowler's article on Pull Requests</a>.</p> +<h2 id="data-security-in-dsf-development" tabindex="-1"><a class="header-anchor" href="#data-security-in-dsf-development"><span>Data Security in DSF Development</span></a></h2> +<p>The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:</p> +<ul> +<li><strong>No development with real personal data:</strong> Always use anonymized or synthetic data for development purposes.</li> +<li><strong>No personal data in repositories:</strong> Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.</li> +<li><strong>Review all log files:</strong> Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.js new file mode 100644 index 000000000..0965ed402 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/contribute/documentation.html\",\"title\":\"Contribute documentation\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute documentation\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.74,\"words\":222},\"filePathRelative\":\"release/archive/v1.5.0/contribute/documentation.md\",\"excerpt\":\"<p><strong>Join us in enhancing our documentation!</strong></p>\\n<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p>\\n<ol>\\n<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li>\\n<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io/issues\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li>\\n<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li>\\n</ol>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.vue new file mode 100644 index 000000000..5679136e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/documentation.html.vue @@ -0,0 +1,11 @@ +<template><div><p><strong>Join us in enhancing our documentation!</strong></p> +<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p> +<ol> +<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li> +<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io/issues" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li> +<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li> +</ol> +<p>We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.js new file mode 100644 index 000000000..26d8bf37e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/contribute/\",\"title\":\"Contribute\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Ways you can contribute:\",\"slug\":\"ways-you-can-contribute\",\"link\":\"#ways-you-can-contribute\",\"children\":[]}],\"readingTime\":{\"minutes\":1.64,\"words\":491},\"filePathRelative\":\"release/archive/v1.5.0/contribute/readme.md\",\"excerpt\":\"<p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.vue new file mode 100644 index 000000000..f22652543 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/contribute/index.html.vue @@ -0,0 +1,51 @@ +<template><div><p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p> +<h3 id="ways-you-can-contribute" tabindex="-1"><a class="header-anchor" href="#ways-you-can-contribute"><span><strong>Ways you can contribute:</strong></span></a></h3> +<ol> +<li><strong>Helping other users</strong>: +<ul> +<li><strong>MII Zulip</strong>: If you are part of the German Medical Informatics Initiative, <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29" target="_blank" rel="noopener noreferrer">join the MII Zulip community</a> to assist others, share your knowledge, and learn from fellow contributors.</li> +<li><strong>GitHub Discussions</strong>: Engage with our community in <a href="https://github.com/datasharingframework/dsf/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> by answering questions, providing feedback, and sharing your insights.</li> +</ul> +</li> +<li><strong>Testing releases</strong>: +<ul> +<li><strong>Stay ahead</strong>: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.</li> +<li><strong>Report findings</strong>: Share your testing results to help us refine and enhance our releases.</li> +</ul> +</li> +<li><strong>Reviewing changes</strong>: +<ul> +<li><strong>Peer review</strong>: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.</li> +<li><strong>Constructive feedback</strong>: Offer constructive feedback and suggestions to help improve and refine proposed changes.</li> +</ul> +</li> +<li><strong>Documentation changes</strong>: +<ul> +<li><strong>Improve documentation</strong>: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our <a href="./documentation">Getting started guide for documentation contributions</a> to DSF.</li> +<li><strong>Suggest improvements</strong>: If you notice gaps or areas for enhancement in our documentation, we welcome <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">your suggestions and contributions</a>.</li> +</ul> +</li> +<li><strong>Contributing bug reports</strong>: +<ul> +<li><strong>Report bugs</strong>: If you find a bug, please report it via <a href="https://github.com/datasharingframework/dsf/issues" target="_blank" rel="noopener noreferrer">an issue on GitHub</a>. Detailed bug reports are incredibly helpful.</li> +<li><strong>Reproduction steps</strong>: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.</li> +</ul> +</li> +<li><strong>Contributing feature requests</strong>: +<ul> +<li><strong>Suggest features</strong>: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.</li> +<li><strong>Collaborate on implementation</strong>: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our <a href="./code">Getting started guide for code contributions</a> to DSF.</li> +</ul> +</li> +<li><strong>Contributing process plugins</strong>: +<ul> +<li><strong>Develop process plugins for the DSF</strong>: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our <a href="https://dsf.dev/stable/develop/" target="_blank" rel="noopener noreferrer">Getting started guide for process plugin development</a> will be a useful reference.</li> +<li><strong>Share your work</strong>: Your plugins could be a valuable addition to the ecosystem and benefit other users.</li> +</ul> +</li> +</ol> +<p>Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.</p> +<p><strong>Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!</strong></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.js new file mode 100644 index 000000000..b031ee307 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.34,\"words\":102},\"filePathRelative\":\"release/archive/v1.5.0/develop/create.md\",\"excerpt\":\"<p>Visit the <a href=\\\"/release/archive/for-you/\\\" target=\\\"_blank\\\">how the DSF can help you</a> page to get started.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.vue new file mode 100644 index 000000000..379827b6b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/create.html.vue @@ -0,0 +1,13 @@ +<template><div><p>Visit the <RouteLink to="/release/archive/for-you/">how the DSF can help you</RouteLink> page to get started.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.js new file mode 100644 index 000000000..0d9d2a94c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.5.0/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..1b59feddd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.5.0/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.js new file mode 100644 index 000000000..5ac850b17 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.0/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.js new file mode 100644 index 000000000..e10cf02f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/\",\"title\":\"DSF 1.5.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.5.0\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.5.0/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.vue new file mode 100644 index 000000000..6bd5224a3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.4.0</a></li> +<li><a href="maintain/install">Install DSF 1.5.0</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..0fde91469 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.5.0/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..e788e7f76 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..e4722e6f8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF BPE server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/bpe</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.js new file mode 100644 index 000000000..65e5320b0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe-reverse-proxy/\",\"title\":\"BPE Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.js new file mode 100644 index 000000000..4568c6c3a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":1.94,\"words\":583},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">OpenID Connect</p>\\n<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href=\\\"oidc\\\">configuration page</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.vue new file mode 100644 index 000000000..57e2acaeb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/access-control.html.vue @@ -0,0 +1,61 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the user interface. Allowed values are:</p> +<p><code v-pre>ADMIN</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>The BPE server currently does not support any practionier-roles.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - email-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..937d6995b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-bpe-debug-log-message-currentuser\",\"link\":\"#dev-dsf-bpe-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-bpe-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-bpe-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-bpe-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-bpe-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-server-base-url\",\"link\":\"#dev-dsf-bpe-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-bpe-server-roleconfig\",\"link\":\"#dev-dsf-bpe-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-bpe-server-static-resource-cache\",\"link\":\"#dev-dsf-bpe-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"slug\":\"dev-dsf-bpe-server-ui-theme\",\"link\":\"#dev-dsf-bpe-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.88,\"words\":2664},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..68a762429 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/configuration.html.vue @@ -0,0 +1,689 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-currentuser"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-dbstatement"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-webservicerequest"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-base-url"><span>DEV_DSF_BPE_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Base address of the BPE server, configure when exposing the web-ui</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/bpe</code></li> +<li><strong>Default:</strong> <code v-pre>https</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-roleconfig"><span>DEV_DSF_BPE_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-bpe-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-static-resource-cache"><span>DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-ui-theme"><span>DEV_DSF_BPE_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.js new file mode 100644 index 000000000..38b289d8f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.js new file mode 100644 index 000000000..7f0f08b2f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/bpe/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.16,\"words\":347},\"filePathRelative\":\"release/archive/v1.5.0/maintain/bpe/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF BPE server user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.vue new file mode 100644 index 000000000..0e128e996 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/bpe/oidc.html.vue @@ -0,0 +1,42 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF BPE server user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF BPE server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">BPE Reverse Proxy</p> +<p>The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.0/maintain/bpe/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF BPE server accepts logout tokens at <a href="configuration#dev-dsf-bpe-server-base-url">DEV_DSF_BPE_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF BPE server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/bpe:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-bpe</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..c6c67b31d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..298d24d3f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..b8b005b49 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..c6020edd7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.52,\"words\":755},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..19e4068c5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..08df30a04 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-fhir-debug-log-message-currentuser\",\"link\":\"#dev-dsf-fhir-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-fhir-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-fhir-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-fhir-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-fhir-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"slug\":\"dev-dsf-fhir-server-ui-theme\",\"link\":\"#dev-dsf-fhir-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":5.15,\"words\":1546},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..f398912d2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/configuration.html.vue @@ -0,0 +1,422 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-currentuser"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-dbstatement"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-webservicerequest"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-ui-theme"><span>DEV_DSF_FHIR_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.js new file mode 100644 index 000000000..1eff3b4cb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..0b32d6102 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.34,\"words\":401},\"filePathRelative\":\"release/archive/v1.5.0/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..0c32730cc --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.0/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.js new file mode 100644 index 000000000..2a4ccede8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.21,\"words\":64},\"filePathRelative\":\"release/archive/v1.5.0/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.5.0</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Reverse Proxy\\n<ul>\\n<li><a href=\\\"bpe-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"bpe/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"bpe/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.vue new file mode 100644 index 000000000..c8048285f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/index.html.vue @@ -0,0 +1,33 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.5.0</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Reverse Proxy +<ul> +<li><a href="bpe-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +<li><a href="bpe/access-control">Access Control</a></li> +<li><a href="bpe/oidc">OpenID Connect</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.js new file mode 100644 index 000000000..3abab7524 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.5.0/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatable process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.vue new file mode 100644 index 000000000..7650f5c19 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install-plugins.html.vue @@ -0,0 +1,22 @@ +<template><div><p>You can find an overview of compatable process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-feasibility/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +</ul> +<!-- - MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases --> +<ul> +<li>MII-Data-Transfer: <a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases</a></li> +</ul> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.js new file mode 100644 index 000000000..7f274242a --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/install.html\",\"title\":\"Install DSF 1.5.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.5.0\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.77,\"words\":1731},\"filePathRelative\":\"release/archive/v1.5.0/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.vue new file mode 100644 index 000000000..5954349c6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_5_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_5_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_5_0.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_5_0.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1}</span></span> +<span class="line"><span>INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..4ceb37c51 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.5.0/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..4749f52f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.4.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.4.0\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.5.0/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.4.0 to 1.5.0 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..1b3c96376 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.4.0 to 1.5.0 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.0_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.0.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.4.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.5.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.0, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.5.0. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.0, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.js new file mode 100644 index 000000000..aed2a6949 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.0/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.0/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.0/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.js new file mode 100644 index 000000000..4914d0bfb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/contribute/code.html\",\"title\":\"Contribute code\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute code\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Benefits of Contributing:\",\"slug\":\"benefits-of-contributing\",\"link\":\"#benefits-of-contributing\",\"children\":[]},{\"level\":2,\"title\":\"General\",\"slug\":\"general\",\"link\":\"#general\",\"children\":[{\"level\":3,\"title\":\"Code style\",\"slug\":\"code-style\",\"link\":\"#code-style\",\"children\":[]},{\"level\":3,\"title\":\"Branching strategy\",\"slug\":\"branching-strategy\",\"link\":\"#branching-strategy\",\"children\":[]}]},{\"level\":2,\"title\":\"Setting up the project\",\"slug\":\"setting-up-the-project\",\"link\":\"#setting-up-the-project\",\"children\":[{\"level\":3,\"title\":\"Java\",\"slug\":\"java\",\"link\":\"#java\",\"children\":[]},{\"level\":3,\"title\":\"Docker\",\"slug\":\"docker\",\"link\":\"#docker\",\"children\":[]},{\"level\":3,\"title\":\"Maven\",\"slug\":\"maven\",\"link\":\"#maven\",\"children\":[]}]},{\"level\":2,\"title\":\"Workflow\",\"slug\":\"workflow\",\"link\":\"#workflow\",\"children\":[{\"level\":3,\"title\":\"Pull request process\",\"slug\":\"pull-request-process\",\"link\":\"#pull-request-process\",\"children\":[]}]},{\"level\":2,\"title\":\"Data Security in DSF Development\",\"slug\":\"data-security-in-dsf-development\",\"link\":\"#data-security-in-dsf-development\",\"children\":[]}],\"readingTime\":{\"minutes\":2.51,\"words\":754},\"filePathRelative\":\"release/archive/v1.5.1/contribute/code.md\",\"excerpt\":\"<p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p>\\n<h3>Benefits of Contributing:</h3>\\n<ul>\\n<li>Foster community growth and diversification.</li>\\n<li>Sharpen your coding skills.</li>\\n<li>Gain recognition in the DSF community.</li>\\n<li>Directly impact the future of data sharing in medicine.</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.vue new file mode 100644 index 000000000..7ba4c5366 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/code.html.vue @@ -0,0 +1,76 @@ +<template><div><p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p> +<h3 id="benefits-of-contributing" tabindex="-1"><a class="header-anchor" href="#benefits-of-contributing"><span>Benefits of Contributing:</span></a></h3> +<ul> +<li>Foster community growth and diversification.</li> +<li>Sharpen your coding skills.</li> +<li>Gain recognition in the DSF community.</li> +<li>Directly impact the future of data sharing in medicine.</li> +</ul> +<p>Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.</p> +<h2 id="general" tabindex="-1"><a class="header-anchor" href="#general"><span>General</span></a></h2> +<h3 id="code-style" tabindex="-1"><a class="header-anchor" href="#code-style"><span>Code style</span></a></h3> +<p>You can import our code style for your specific IDE:</p> +<ul> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/eclipse-formatter-config.xml" target="_blank" rel="noopener noreferrer">Eclipse</a>. Open your preferences, click on <code v-pre>Java</code>, <code v-pre>Code style</code>, <code v-pre>Formatter</code>, <code v-pre>Import</code> and select the downloaded file.</li> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/intellij-formatter-config.xml" target="_blank" rel="noopener noreferrer">IntelliJ</a>. Open your settings, click on <code v-pre>Editor</code>, <code v-pre>Code style</code>, <code v-pre>Java</code>, the settings icon, <code v-pre>import scheme</code>, <code v-pre>IntelliJ</code> and select the downloaded file.</li> +</ul> +<p>Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use <code v-pre>mvn compile -Pformat-and-sort</code>.</p> +<h3 id="branching-strategy" tabindex="-1"><a class="header-anchor" href="#branching-strategy"><span>Branching strategy</span></a></h3> +<p><a href="https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow" target="_blank" rel="noopener noreferrer">Git Flow</a> is used as this project's branching strategy. Therefore, you will find the following structure:</p> +<ul> +<li>main</li> +<li>develop</li> +<li>issue</li> +<li>hotfix</li> +<li>release</li> +</ul> +<p>Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.</p> +<h4 id="branch-naming" tabindex="-1"><a class="header-anchor" href="#branch-naming"><span>Branch naming</span></a></h4> +<p>The following ruleset is applied to name branches:</p> +<ul> +<li><code v-pre>issue/<issue-number>_<issue-name></code></li> +<li><code v-pre>hotfix/<version></code></li> +<li><code v-pre>release/<version></code></li> +</ul> +<h2 id="setting-up-the-project" tabindex="-1"><a class="header-anchor" href="#setting-up-the-project"><span>Setting up the project</span></a></h2> +<p>This chapter lists all important requirements to get the project buildable and running properly.</p> +<h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3> +<p>This project uses Java JDK 17, so make sure you have it installed on your system.</p> +<h3 id="docker" tabindex="-1"><a class="header-anchor" href="#docker"><span>Docker</span></a></h3> +<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is used in this project to test database functionality and to run more complex test-setups.</p> +<h3 id="maven" tabindex="-1"><a class="header-anchor" href="#maven"><span>Maven</span></a></h3> +<p>The project relies on <a href="https://maven.apache.org/" target="_blank" rel="noopener noreferrer">Maven</a> as its management tool.<br> +<em>Important:</em> When building the project you might encounter the following error:<br> +<em>Could not determine gpg version</em> <a href="https://gnupg.org/" target="_blank" rel="noopener noreferrer">GPG</a> is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with <code v-pre>-Dgpg.skip</code>.</p> +<h2 id="workflow" tabindex="-1"><a class="header-anchor" href="#workflow"><span>Workflow</span></a></h2> +<ol> +<li>Create an issue or comment on an issue that you want to contribute some feature</li> +<li>Fork the repository, create a branch and mention it in the issue</li> +<li>If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests</li> +<li>If your changes are production-ready, create a <a href="https://github.com/datasharingframework/dsf/pulls" target="_blank" rel="noopener noreferrer">pull request</a>.</li> +</ol> +<h3 id="pull-request-process" tabindex="-1"><a class="header-anchor" href="#pull-request-process"><span>Pull request process</span></a></h3> +<p>We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:</p> +<ol> +<li> +<p><strong>Ship</strong>: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.</p> +</li> +<li> +<p><strong>Show</strong>: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.</p> +</li> +<li> +<p><strong>Ask</strong>: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.</p> +</li> +</ol> +<p>This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.</p> +<p>For more information on Fowler's approach, visit <a href="https://martinfowler.com/articles/ship-show-ask.html" target="_blank" rel="noopener noreferrer">Martin Fowler's article on Pull Requests</a>.</p> +<h2 id="data-security-in-dsf-development" tabindex="-1"><a class="header-anchor" href="#data-security-in-dsf-development"><span>Data Security in DSF Development</span></a></h2> +<p>The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:</p> +<ul> +<li><strong>No development with real personal data:</strong> Always use anonymized or synthetic data for development purposes.</li> +<li><strong>No personal data in repositories:</strong> Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.</li> +<li><strong>Review all log files:</strong> Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.js new file mode 100644 index 000000000..9469e2fae --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/contribute/documentation.html\",\"title\":\"Contribute documentation\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute documentation\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.74,\"words\":222},\"filePathRelative\":\"release/archive/v1.5.1/contribute/documentation.md\",\"excerpt\":\"<p><strong>Join us in enhancing our documentation!</strong></p>\\n<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p>\\n<ol>\\n<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li>\\n<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io/issues\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li>\\n<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li>\\n</ol>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.vue new file mode 100644 index 000000000..5679136e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/documentation.html.vue @@ -0,0 +1,11 @@ +<template><div><p><strong>Join us in enhancing our documentation!</strong></p> +<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p> +<ol> +<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li> +<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io/issues" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li> +<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li> +</ol> +<p>We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.js new file mode 100644 index 000000000..21e13d30b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/contribute/\",\"title\":\"Contribute\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Ways you can contribute:\",\"slug\":\"ways-you-can-contribute\",\"link\":\"#ways-you-can-contribute\",\"children\":[]}],\"readingTime\":{\"minutes\":1.64,\"words\":491},\"filePathRelative\":\"release/archive/v1.5.1/contribute/readme.md\",\"excerpt\":\"<p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.vue new file mode 100644 index 000000000..f22652543 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/contribute/index.html.vue @@ -0,0 +1,51 @@ +<template><div><p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p> +<h3 id="ways-you-can-contribute" tabindex="-1"><a class="header-anchor" href="#ways-you-can-contribute"><span><strong>Ways you can contribute:</strong></span></a></h3> +<ol> +<li><strong>Helping other users</strong>: +<ul> +<li><strong>MII Zulip</strong>: If you are part of the German Medical Informatics Initiative, <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29" target="_blank" rel="noopener noreferrer">join the MII Zulip community</a> to assist others, share your knowledge, and learn from fellow contributors.</li> +<li><strong>GitHub Discussions</strong>: Engage with our community in <a href="https://github.com/datasharingframework/dsf/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> by answering questions, providing feedback, and sharing your insights.</li> +</ul> +</li> +<li><strong>Testing releases</strong>: +<ul> +<li><strong>Stay ahead</strong>: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.</li> +<li><strong>Report findings</strong>: Share your testing results to help us refine and enhance our releases.</li> +</ul> +</li> +<li><strong>Reviewing changes</strong>: +<ul> +<li><strong>Peer review</strong>: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.</li> +<li><strong>Constructive feedback</strong>: Offer constructive feedback and suggestions to help improve and refine proposed changes.</li> +</ul> +</li> +<li><strong>Documentation changes</strong>: +<ul> +<li><strong>Improve documentation</strong>: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our <a href="./documentation">Getting started guide for documentation contributions</a> to DSF.</li> +<li><strong>Suggest improvements</strong>: If you notice gaps or areas for enhancement in our documentation, we welcome <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">your suggestions and contributions</a>.</li> +</ul> +</li> +<li><strong>Contributing bug reports</strong>: +<ul> +<li><strong>Report bugs</strong>: If you find a bug, please report it via <a href="https://github.com/datasharingframework/dsf/issues" target="_blank" rel="noopener noreferrer">an issue on GitHub</a>. Detailed bug reports are incredibly helpful.</li> +<li><strong>Reproduction steps</strong>: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.</li> +</ul> +</li> +<li><strong>Contributing feature requests</strong>: +<ul> +<li><strong>Suggest features</strong>: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.</li> +<li><strong>Collaborate on implementation</strong>: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our <a href="./code">Getting started guide for code contributions</a> to DSF.</li> +</ul> +</li> +<li><strong>Contributing process plugins</strong>: +<ul> +<li><strong>Develop process plugins for the DSF</strong>: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our <a href="https://dsf.dev/stable/develop/" target="_blank" rel="noopener noreferrer">Getting started guide for process plugin development</a> will be a useful reference.</li> +<li><strong>Share your work</strong>: Your plugins could be a valuable addition to the ecosystem and benefit other users.</li> +</ul> +</li> +</ol> +<p>Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.</p> +<p><strong>Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!</strong></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.js new file mode 100644 index 000000000..f4e557713 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.34,\"words\":102},\"filePathRelative\":\"release/archive/v1.5.1/develop/create.md\",\"excerpt\":\"<p>Visit the <a href=\\\"/release/archive/for-you/\\\" target=\\\"_blank\\\">how the DSF can help you</a> page to get started.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.vue new file mode 100644 index 000000000..379827b6b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/create.html.vue @@ -0,0 +1,13 @@ +<template><div><p>Visit the <RouteLink to="/release/archive/for-you/">how the DSF can help you</RouteLink> page to get started.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.js new file mode 100644 index 000000000..2056b7979 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.5.1/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..65da5253d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.5.1/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.js new file mode 100644 index 000000000..b9a6a57b8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.1/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.js new file mode 100644 index 000000000..d9a6638c6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/\",\"title\":\"DSF 1.5.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.5.1\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.5.1/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.vue new file mode 100644 index 000000000..af70562ef --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.5.0</a></li> +<li><a href="maintain/install">Install DSF 1.5.1</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..5c701946b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.5.1/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..f63c7c813 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..e4722e6f8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF BPE server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/bpe</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.js new file mode 100644 index 000000000..b978ae3b9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe-reverse-proxy/\",\"title\":\"BPE Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.js new file mode 100644 index 000000000..9b7b71a15 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":1.94,\"words\":583},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">OpenID Connect</p>\\n<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href=\\\"oidc\\\">configuration page</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.vue new file mode 100644 index 000000000..57e2acaeb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/access-control.html.vue @@ -0,0 +1,61 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the user interface. Allowed values are:</p> +<p><code v-pre>ADMIN</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>The BPE server currently does not support any practionier-roles.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - email-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..214e2f447 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-bpe-debug-log-message-currentuser\",\"link\":\"#dev-dsf-bpe-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-bpe-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-bpe-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-bpe-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-bpe-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-server-base-url\",\"link\":\"#dev-dsf-bpe-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-bpe-server-roleconfig\",\"link\":\"#dev-dsf-bpe-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-bpe-server-static-resource-cache\",\"link\":\"#dev-dsf-bpe-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"slug\":\"dev-dsf-bpe-server-ui-theme\",\"link\":\"#dev-dsf-bpe-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.88,\"words\":2664},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..68a762429 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/configuration.html.vue @@ -0,0 +1,689 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-currentuser"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-dbstatement"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-webservicerequest"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-base-url"><span>DEV_DSF_BPE_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Base address of the BPE server, configure when exposing the web-ui</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/bpe</code></li> +<li><strong>Default:</strong> <code v-pre>https</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-roleconfig"><span>DEV_DSF_BPE_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-bpe-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-static-resource-cache"><span>DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-ui-theme"><span>DEV_DSF_BPE_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.js new file mode 100644 index 000000000..733e7d260 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.js new file mode 100644 index 000000000..8d6a2ab4c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/bpe/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.16,\"words\":347},\"filePathRelative\":\"release/archive/v1.5.1/maintain/bpe/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF BPE server user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.vue new file mode 100644 index 000000000..1f5dd8cbf --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/bpe/oidc.html.vue @@ -0,0 +1,42 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF BPE server user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF BPE server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">BPE Reverse Proxy</p> +<p>The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.1/maintain/bpe/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF BPE server accepts logout tokens at <a href="configuration#dev-dsf-bpe-server-base-url">DEV_DSF_BPE_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF BPE server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/bpe:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-bpe</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..dfaca82f4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..298d24d3f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..bcd7615f8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..ee2669038 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.52,\"words\":755},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..19e4068c5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..d61f23749 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-fhir-debug-log-message-currentuser\",\"link\":\"#dev-dsf-fhir-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-fhir-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-fhir-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-fhir-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-fhir-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"slug\":\"dev-dsf-fhir-server-ui-theme\",\"link\":\"#dev-dsf-fhir-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":5.15,\"words\":1546},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..f398912d2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/configuration.html.vue @@ -0,0 +1,422 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-currentuser"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-dbstatement"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-webservicerequest"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-ui-theme"><span>DEV_DSF_FHIR_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.js new file mode 100644 index 000000000..7b6a4818f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..0e0e05cb0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.34,\"words\":401},\"filePathRelative\":\"release/archive/v1.5.1/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..d5e81f8c4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.1/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.js new file mode 100644 index 000000000..a46c17c9d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.21,\"words\":64},\"filePathRelative\":\"release/archive/v1.5.1/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.5.1</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Reverse Proxy\\n<ul>\\n<li><a href=\\\"bpe-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"bpe/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"bpe/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.vue new file mode 100644 index 000000000..4cc3c1cac --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/index.html.vue @@ -0,0 +1,33 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.5.1</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Reverse Proxy +<ul> +<li><a href="bpe-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +<li><a href="bpe/access-control">Access Control</a></li> +<li><a href="bpe/oidc">OpenID Connect</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.js new file mode 100644 index 000000000..b39aa8e59 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Common processes\",\"slug\":\"common-processes\",\"link\":\"#common-processes\",\"children\":[]},{\"level\":2,\"title\":\"MII processes\",\"slug\":\"mii-processes\",\"link\":\"#mii-processes\",\"children\":[]},{\"level\":2,\"title\":\"NUM processes\",\"slug\":\"num-processes\",\"link\":\"#num-processes\",\"children\":[]}],\"readingTime\":{\"minutes\":0.24,\"words\":73},\"filePathRelative\":\"release/archive/v1.5.1/maintain/install-plugins.md\",\"excerpt\":\"<p>You can find an overview of compatible process plugins below.</p>\\n<h2>Common processes</h2>\\n<ul>\\n<li>Ping-Pong: <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li>\\n<li>AllowList Download: <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list/releases\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.vue new file mode 100644 index 000000000..78db0e2c1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install-plugins.html.vue @@ -0,0 +1,20 @@ +<template><div><p>You can find an overview of compatible process plugins below.</p> +<h2 id="common-processes" tabindex="-1"><a class="header-anchor" href="#common-processes"><span>Common processes</span></a></h2> +<ul> +<li>Ping-Pong: <a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-ping-pong/releases</a></li> +<li>AllowList Download: <a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">https://github.com/datasharingframework/dsf-process-allow-list/releases</a></li> +</ul> +<h2 id="mii-processes" tabindex="-1"><a class="header-anchor" href="#mii-processes"><span>MII processes</span></a></h2> +<ul> +<li>Feasibility: <a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-feasibility/releases</a></li> +<li>KDS-Report: <a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-report/releases</a></li> +<li>MII-Data-Sharing: <a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases</a></li> +<li>MII-Data-Transfer: <a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases" target="_blank" rel="noopener noreferrer">https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases</a></li> +</ul> +<h2 id="num-processes" tabindex="-1"><a class="header-anchor" href="#num-processes"><span>NUM processes</span></a></h2> +<ul> +<li>NUM-RDP: <a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">https://github.com/num-codex/codex-processes-ap1/releases</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.js new file mode 100644 index 000000000..14b1eda23 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/install.html\",\"title\":\"Install DSF 1.5.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.5.1\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.76,\"words\":1729},\"filePathRelative\":\"release/archive/v1.5.1/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.vue new file mode 100644 index 000000000..a4fcf004f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_5_1.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_5_1.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_5_1.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_5_1.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID1</span></span> +<span class="line"><span>INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID2</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..260ace6bb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.5.1/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..b9b08cbe6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.5.0\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.5.0\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.5.1/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.5.0 to 1.5.1 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..baa943287 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.5.0 to 1.5.1 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.1_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.1.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.1_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.1.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.5.0</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.5.1. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.1, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.5.1. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.1, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.js new file mode 100644 index 000000000..9fe57d974 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.1/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.1/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.1/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.js new file mode 100644 index 000000000..b34591b36 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/contribute/code.html\",\"title\":\"Contribute code\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute code\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Benefits of Contributing:\",\"slug\":\"benefits-of-contributing\",\"link\":\"#benefits-of-contributing\",\"children\":[]},{\"level\":2,\"title\":\"General\",\"slug\":\"general\",\"link\":\"#general\",\"children\":[{\"level\":3,\"title\":\"Code style\",\"slug\":\"code-style\",\"link\":\"#code-style\",\"children\":[]},{\"level\":3,\"title\":\"Branching strategy\",\"slug\":\"branching-strategy\",\"link\":\"#branching-strategy\",\"children\":[]}]},{\"level\":2,\"title\":\"Setting up the project\",\"slug\":\"setting-up-the-project\",\"link\":\"#setting-up-the-project\",\"children\":[{\"level\":3,\"title\":\"Java\",\"slug\":\"java\",\"link\":\"#java\",\"children\":[]},{\"level\":3,\"title\":\"Docker\",\"slug\":\"docker\",\"link\":\"#docker\",\"children\":[]},{\"level\":3,\"title\":\"Maven\",\"slug\":\"maven\",\"link\":\"#maven\",\"children\":[]}]},{\"level\":2,\"title\":\"Workflow\",\"slug\":\"workflow\",\"link\":\"#workflow\",\"children\":[{\"level\":3,\"title\":\"Pull request process\",\"slug\":\"pull-request-process\",\"link\":\"#pull-request-process\",\"children\":[]}]},{\"level\":2,\"title\":\"Data Security in DSF Development\",\"slug\":\"data-security-in-dsf-development\",\"link\":\"#data-security-in-dsf-development\",\"children\":[]}],\"readingTime\":{\"minutes\":2.51,\"words\":754},\"filePathRelative\":\"release/archive/v1.5.2/contribute/code.md\",\"excerpt\":\"<p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p>\\n<h3>Benefits of Contributing:</h3>\\n<ul>\\n<li>Foster community growth and diversification.</li>\\n<li>Sharpen your coding skills.</li>\\n<li>Gain recognition in the DSF community.</li>\\n<li>Directly impact the future of data sharing in medicine.</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.vue new file mode 100644 index 000000000..7ba4c5366 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/code.html.vue @@ -0,0 +1,76 @@ +<template><div><p>Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.</p> +<h3 id="benefits-of-contributing" tabindex="-1"><a class="header-anchor" href="#benefits-of-contributing"><span>Benefits of Contributing:</span></a></h3> +<ul> +<li>Foster community growth and diversification.</li> +<li>Sharpen your coding skills.</li> +<li>Gain recognition in the DSF community.</li> +<li>Directly impact the future of data sharing in medicine.</li> +</ul> +<p>Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.</p> +<h2 id="general" tabindex="-1"><a class="header-anchor" href="#general"><span>General</span></a></h2> +<h3 id="code-style" tabindex="-1"><a class="header-anchor" href="#code-style"><span>Code style</span></a></h3> +<p>You can import our code style for your specific IDE:</p> +<ul> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/eclipse-formatter-config.xml" target="_blank" rel="noopener noreferrer">Eclipse</a>. Open your preferences, click on <code v-pre>Java</code>, <code v-pre>Code style</code>, <code v-pre>Formatter</code>, <code v-pre>Import</code> and select the downloaded file.</li> +<li><a href="https://github.com/datasharingframework/dsf/blob/main/src/main/resources/intellij-formatter-config.xml" target="_blank" rel="noopener noreferrer">IntelliJ</a>. Open your settings, click on <code v-pre>Editor</code>, <code v-pre>Code style</code>, <code v-pre>Java</code>, the settings icon, <code v-pre>import scheme</code>, <code v-pre>IntelliJ</code> and select the downloaded file.</li> +</ul> +<p>Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use <code v-pre>mvn compile -Pformat-and-sort</code>.</p> +<h3 id="branching-strategy" tabindex="-1"><a class="header-anchor" href="#branching-strategy"><span>Branching strategy</span></a></h3> +<p><a href="https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow" target="_blank" rel="noopener noreferrer">Git Flow</a> is used as this project's branching strategy. Therefore, you will find the following structure:</p> +<ul> +<li>main</li> +<li>develop</li> +<li>issue</li> +<li>hotfix</li> +<li>release</li> +</ul> +<p>Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.</p> +<h4 id="branch-naming" tabindex="-1"><a class="header-anchor" href="#branch-naming"><span>Branch naming</span></a></h4> +<p>The following ruleset is applied to name branches:</p> +<ul> +<li><code v-pre>issue/<issue-number>_<issue-name></code></li> +<li><code v-pre>hotfix/<version></code></li> +<li><code v-pre>release/<version></code></li> +</ul> +<h2 id="setting-up-the-project" tabindex="-1"><a class="header-anchor" href="#setting-up-the-project"><span>Setting up the project</span></a></h2> +<p>This chapter lists all important requirements to get the project buildable and running properly.</p> +<h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3> +<p>This project uses Java JDK 17, so make sure you have it installed on your system.</p> +<h3 id="docker" tabindex="-1"><a class="header-anchor" href="#docker"><span>Docker</span></a></h3> +<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is used in this project to test database functionality and to run more complex test-setups.</p> +<h3 id="maven" tabindex="-1"><a class="header-anchor" href="#maven"><span>Maven</span></a></h3> +<p>The project relies on <a href="https://maven.apache.org/" target="_blank" rel="noopener noreferrer">Maven</a> as its management tool.<br> +<em>Important:</em> When building the project you might encounter the following error:<br> +<em>Could not determine gpg version</em> <a href="https://gnupg.org/" target="_blank" rel="noopener noreferrer">GPG</a> is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with <code v-pre>-Dgpg.skip</code>.</p> +<h2 id="workflow" tabindex="-1"><a class="header-anchor" href="#workflow"><span>Workflow</span></a></h2> +<ol> +<li>Create an issue or comment on an issue that you want to contribute some feature</li> +<li>Fork the repository, create a branch and mention it in the issue</li> +<li>If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests</li> +<li>If your changes are production-ready, create a <a href="https://github.com/datasharingframework/dsf/pulls" target="_blank" rel="noopener noreferrer">pull request</a>.</li> +</ol> +<h3 id="pull-request-process" tabindex="-1"><a class="header-anchor" href="#pull-request-process"><span>Pull request process</span></a></h3> +<p>We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:</p> +<ol> +<li> +<p><strong>Ship</strong>: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.</p> +</li> +<li> +<p><strong>Show</strong>: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.</p> +</li> +<li> +<p><strong>Ask</strong>: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.</p> +</li> +</ol> +<p>This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.</p> +<p>For more information on Fowler's approach, visit <a href="https://martinfowler.com/articles/ship-show-ask.html" target="_blank" rel="noopener noreferrer">Martin Fowler's article on Pull Requests</a>.</p> +<h2 id="data-security-in-dsf-development" tabindex="-1"><a class="header-anchor" href="#data-security-in-dsf-development"><span>Data Security in DSF Development</span></a></h2> +<p>The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:</p> +<ul> +<li><strong>No development with real personal data:</strong> Always use anonymized or synthetic data for development purposes.</li> +<li><strong>No personal data in repositories:</strong> Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.</li> +<li><strong>Review all log files:</strong> Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.js new file mode 100644 index 000000000..ca0df68a0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/contribute/documentation.html\",\"title\":\"Contribute documentation\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute documentation\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.74,\"words\":222},\"filePathRelative\":\"release/archive/v1.5.2/contribute/documentation.md\",\"excerpt\":\"<p><strong>Join us in enhancing our documentation!</strong></p>\\n<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p>\\n<ol>\\n<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li>\\n<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io/issues\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li>\\n<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href=\\\"https://github.com/datasharingframework/datasharingframework.github.io\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li>\\n</ol>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.vue new file mode 100644 index 000000000..5679136e7 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/documentation.html.vue @@ -0,0 +1,11 @@ +<template><div><p><strong>Join us in enhancing our documentation!</strong></p> +<p>We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!</p> +<ol> +<li><strong>Contact us with feedback</strong>: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.</li> +<li><strong>Create an issue</strong>: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io/issues" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.</li> +<li><strong>Contribute directly with a pull request</strong>: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">Data Sharing Framework Documentation</a> and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.</li> +</ol> +<p>We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.js new file mode 100644 index 000000000..924ff8e49 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/contribute/\",\"title\":\"Contribute\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Contribute\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"Ways you can contribute:\",\"slug\":\"ways-you-can-contribute\",\"link\":\"#ways-you-can-contribute\",\"children\":[]}],\"readingTime\":{\"minutes\":1.64,\"words\":491},\"filePathRelative\":\"release/archive/v1.5.2/contribute/readme.md\",\"excerpt\":\"<p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.vue new file mode 100644 index 000000000..f22652543 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/contribute/index.html.vue @@ -0,0 +1,51 @@ +<template><div><p>We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.</p> +<h3 id="ways-you-can-contribute" tabindex="-1"><a class="header-anchor" href="#ways-you-can-contribute"><span><strong>Ways you can contribute:</strong></span></a></h3> +<ol> +<li><strong>Helping other users</strong>: +<ul> +<li><strong>MII Zulip</strong>: If you are part of the German Medical Informatics Initiative, <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29" target="_blank" rel="noopener noreferrer">join the MII Zulip community</a> to assist others, share your knowledge, and learn from fellow contributors.</li> +<li><strong>GitHub Discussions</strong>: Engage with our community in <a href="https://github.com/datasharingframework/dsf/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> by answering questions, providing feedback, and sharing your insights.</li> +</ul> +</li> +<li><strong>Testing releases</strong>: +<ul> +<li><strong>Stay ahead</strong>: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.</li> +<li><strong>Report findings</strong>: Share your testing results to help us refine and enhance our releases.</li> +</ul> +</li> +<li><strong>Reviewing changes</strong>: +<ul> +<li><strong>Peer review</strong>: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.</li> +<li><strong>Constructive feedback</strong>: Offer constructive feedback and suggestions to help improve and refine proposed changes.</li> +</ul> +</li> +<li><strong>Documentation changes</strong>: +<ul> +<li><strong>Improve documentation</strong>: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our <a href="./documentation">Getting started guide for documentation contributions</a> to DSF.</li> +<li><strong>Suggest improvements</strong>: If you notice gaps or areas for enhancement in our documentation, we welcome <a href="https://github.com/datasharingframework/datasharingframework.github.io" target="_blank" rel="noopener noreferrer">your suggestions and contributions</a>.</li> +</ul> +</li> +<li><strong>Contributing bug reports</strong>: +<ul> +<li><strong>Report bugs</strong>: If you find a bug, please report it via <a href="https://github.com/datasharingframework/dsf/issues" target="_blank" rel="noopener noreferrer">an issue on GitHub</a>. Detailed bug reports are incredibly helpful.</li> +<li><strong>Reproduction steps</strong>: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.</li> +</ul> +</li> +<li><strong>Contributing feature requests</strong>: +<ul> +<li><strong>Suggest features</strong>: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.</li> +<li><strong>Collaborate on implementation</strong>: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our <a href="./code">Getting started guide for code contributions</a> to DSF.</li> +</ul> +</li> +<li><strong>Contributing process plugins</strong>: +<ul> +<li><strong>Develop process plugins for the DSF</strong>: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our <a href="https://dsf.dev/stable/develop/" target="_blank" rel="noopener noreferrer">Getting started guide for process plugin development</a> will be a useful reference.</li> +<li><strong>Share your work</strong>: Your plugins could be a valuable addition to the ecosystem and benefit other users.</li> +</ul> +</li> +</ol> +<p>Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.</p> +<p><strong>Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!</strong></p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.js new file mode 100644 index 000000000..9ebebfdb0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/develop/create.html\",\"title\":\"Create a new process plugin\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Create a new process plugin\",\"icon\":\"code\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.34,\"words\":102},\"filePathRelative\":\"release/archive/v1.5.2/develop/create.md\",\"excerpt\":\"<p>Visit the <a href=\\\"/release/archive/for-you/\\\" target=\\\"_blank\\\">how the DSF can help you</a> page to get started.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <a href=\\\"/oldstable/tutorial/\\\" target=\\\"_blank\\\">process plugin tutorial</a>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.vue new file mode 100644 index 000000000..379827b6b --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/create.html.vue @@ -0,0 +1,13 @@ +<template><div><p>Visit the <RouteLink to="/release/archive/for-you/">how the DSF can help you</RouteLink> page to get started.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the <RouteLink to="/oldstable/tutorial/">process plugin tutorial</RouteLink>. Additionally, we recommend to take a look at the upgraded DSF processes here:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.js new file mode 100644 index 000000000..ae81841fd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/develop/\",\"title\":\"Develop Process Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Develop Process Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.07,\"words\":20},\"filePathRelative\":\"release/archive/v1.5.2/develop/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"create\\\">Create a new process plugin</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade processes from 0.9.x</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.vue new file mode 100644 index 000000000..fedc980e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/index.html.vue @@ -0,0 +1,8 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="create">Create a new process plugin</a></li> +<li><a href="upgrade-from-0">Upgrade processes from 0.9.x</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.js new file mode 100644 index 000000000..c0ba38866 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/develop/upgrade-from-0.html\",\"title\":\"Upgrade processes from 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade processes from 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.26,\"words\":79},\"filePathRelative\":\"release/archive/v1.5.2/develop/upgrade-from-0.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Work in progress</p>\\n<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p>\\n<ul>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-hello-world\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">hello world plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-ping-pong\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">ping pong plugin</a></li>\\n<li>The <a href=\\\"https://github.com/datasharingframework/dsf-process-allow-list\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">update allowlist plugin</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.vue new file mode 100644 index 000000000..042c80c9e --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/develop/upgrade-from-0.html.vue @@ -0,0 +1,12 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Work in progress</p> +<p>We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:</p> +<ul> +<li>The <a href="https://github.com/datasharingframework/dsf-process-hello-world" target="_blank" rel="noopener noreferrer">hello world plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-ping-pong" target="_blank" rel="noopener noreferrer">ping pong plugin</a></li> +<li>The <a href="https://github.com/datasharingframework/dsf-process-allow-list" target="_blank" rel="noopener noreferrer">update allowlist plugin</a></li> +</ul> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.js new file mode 100644 index 000000000..ea5855b0f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/dsf-for-dev.html\",\"title\":\"DSF for Developers\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF for Developers\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.2/dsf-for-dev.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/dsf-for-dev.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.js new file mode 100644 index 000000000..71f1cd63d --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/\",\"title\":\"DSF 1.5.2\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"DSF 1.5.2\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"New features\",\"slug\":\"new-features\",\"link\":\"#new-features\",\"children\":[]}],\"readingTime\":{\"minutes\":0.46,\"words\":139},\"filePathRelative\":\"release/archive/v1.5.2/index.md\",\"excerpt\":\"<p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <a href=\\\"/intro/\\\" target=\\\"_blank\\\">here</a> to find more information about the DSF in general.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Important note</p>\\n<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href=\\\"https://github.com/highmed/highmed-dsf\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://github.com/highmed/highmed-dsf</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.vue new file mode 100644 index 000000000..ae466fe10 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/index.html.vue @@ -0,0 +1,29 @@ +<template><div><p>Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click <RouteLink to="/intro/">here</RouteLink> to find more information about the DSF in general.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Important note</p> +<p>This is a major DSF release not compatible with 0.9.x and older version developed at <a href="https://github.com/highmed/highmed-dsf" target="_blank" rel="noopener noreferrer">https://github.com/highmed/highmed-dsf</a>.</p> +</div> +<h1 id="system-administrators" tabindex="-1"><a class="header-anchor" href="#system-administrators"><span>System Administrators</span></a></h1> +<ul> +<li><a href="maintain/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +<li><a href="maintain/upgrade-from-1">Upgrade from DSF 1.5.1</a></li> +<li><a href="maintain/install">Install DSF 1.5.2</a></li> +</ul> +<h1 id="developers" tabindex="-1"><a class="header-anchor" href="#developers"><span>Developers</span></a></h1> +<ul> +<li><a href="develop/create">Create a new process plugin</a></li> +<li><a href="develop/upgrade-from-0">Upgrade from DSF 0.9.x.</a></li> +</ul> +<h2 id="new-features" tabindex="-1"><a class="header-anchor" href="#new-features"><span>New features</span></a></h2> +<ul> +<li>Improved versioning to support up- and downwards-compatibility</li> +<li>Enhanced web ui to start processes in the web browser</li> +<li>Allow local user authentication and authorization with OpenID Connect</li> +<li>New process plugin API</li> +<li>Removed mostly unused features to simplify instance configuration</li> +<li>Unified proxy setup</li> +<li>Many more features, see <a href="https://github.com/datasharingframework/dsf/releases" target="_blank" rel="noopener noreferrer">1.x release-notes</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.js new file mode 100644 index 000000000..aa1991fcd --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/allowList-mgm.html\",\"title\":\"Allow List Management\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Allow List Management\",\"icon\":\"share\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":2,\"title\":\"Start here\",\"slug\":\"start-here\",\"link\":\"#start-here\",\"children\":[]}],\"readingTime\":{\"minutes\":1.15,\"words\":345},\"filePathRelative\":\"release/archive/v1.5.2/maintain/allowList-mgm.md\",\"excerpt\":\"<p>You can read all about the concept of Allow Lists <a href=\\\"/intro/info/allowList.html\\\" target=\\\"_blank\\\">in our introduction</a>.</p>\\n<h2>Overview</h2>\\n<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.vue new file mode 100644 index 000000000..7a66f0db3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/allowList-mgm.html.vue @@ -0,0 +1,29 @@ +<template><div><p>You can read all about the concept of Allow Lists <RouteLink to="/intro/info/allowList.html">in our introduction</RouteLink>.</p> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.</p> +<p>The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.</p> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<ol> +<li>Deployed DSF instance (test or production infrastructure)<br> +1.1 If none exists yet, read <a href="install">the installation guide</a></li> +<li>Certificate<br> +2.1 If none exists yet, read <a href="install#client-server-certificates">the certificate requirements</a></li> +<li>Organization identifier, shortest FQDN of your organizations website, e.g. <code v-pre>my-hospital.de</code></li> +<li>FHIR endpoint URL, e.g. <code v-pre>https://dsf.my-hospital.de/fhir</code></li> +<li>Contact details from a responsible person of your organization</li> +<li>Access to the E-Mail address from your organization for verification</li> +</ol> +<h2 id="start-here" tabindex="-1"><a class="header-anchor" href="#start-here"><span>Start here</span></a></h2> +<p>When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:</p> +<ul> +<li><a href="https://allowlist-test.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Test</strong> infrastructure</a></li> +<li><a href="https://allowlist.gecko.hs-heilbronn.de" target="_blank" rel="noopener noreferrer"><strong>Production</strong> infrastructure</a></li> +</ul> +<p>We use different highlight colors for the DSF Allow List Management Tool: Green for the <strong>Test</strong> environment and blue for the <strong>Production</strong> infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to contact us on the <a href="https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29">MII-Zulip Channel</a> or write us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..8c9d3c228 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..e4722e6f8 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF BPE server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/bpe</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.js new file mode 100644 index 000000000..3b676bbf9 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe-reverse-proxy/\",\"title\":\"BPE Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.js new file mode 100644 index 000000000..3dbe79b80 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":1.94,\"words\":583},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">OpenID Connect</p>\\n<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href=\\\"oidc\\\">configuration page</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.vue new file mode 100644 index 000000000..57e2acaeb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/access-control.html.vue @@ -0,0 +1,61 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.</p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-bpe-server-roleconfig">DEV_DSF_BPE_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the user interface. Allowed values are:</p> +<p><code v-pre>ADMIN</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>The BPE server currently does not support any practionier-roles.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_BPE_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - email-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.js new file mode 100644 index 000000000..b2d0711b3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-bpe-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-bpe-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-bpe-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-bpe-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"link\":\"#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-bpe-db-liquibase-username\",\"link\":\"#dev-dsf-bpe-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_URL\",\"slug\":\"dev-dsf-bpe-db-url\",\"link\":\"#dev-dsf-bpe-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-camunda-group\",\"link\":\"#dev-dsf-bpe-db-user-camunda-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"link\":\"#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-camunda-username\",\"link\":\"#dev-dsf-bpe-db-user-camunda-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"slug\":\"dev-dsf-bpe-db-user-group\",\"link\":\"#dev-dsf-bpe-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"link\":\"#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"slug\":\"dev-dsf-bpe-db-user-username\",\"link\":\"#dev-dsf-bpe-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-bpe-debug-log-message-currentuser\",\"link\":\"#dev-dsf-bpe-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-bpe-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-bpe-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivityend\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivityend\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"slug\":\"dev-dsf-bpe-debug-log-message-onactivitystart\",\"link\":\"#dev-dsf-bpe-debug-log-message-onactivitystart\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"slug\":\"dev-dsf-bpe-debug-log-message-variables\",\"link\":\"#dev-dsf-bpe-debug-log-message-variables\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"slug\":\"dev-dsf-bpe-debug-log-message-variableslocal\",\"link\":\"#dev-dsf-bpe-debug-log-message-variableslocal\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-bpe-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-bpe-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-local-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-local-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-local-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-local-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-timeout-read\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"slug\":\"dev-dsf-bpe-fhir-client-remote-verbose\",\"link\":\"#dev-dsf-bpe-fhir-client-remote-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-fhir-server-base-url\",\"link\":\"#dev-dsf-bpe-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-max\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"slug\":\"dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"link\":\"#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate\",\"link\":\"#dev-dsf-bpe-mail-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"slug\":\"dev-dsf-bpe-mail-fromaddress\",\"link\":\"#dev-dsf-bpe-mail-fromaddress\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_HOST\",\"slug\":\"dev-dsf-bpe-mail-host\",\"link\":\"#dev-dsf-bpe-mail-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"slug\":\"dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"link\":\"#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"link\":\"#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_PORT\",\"slug\":\"dev-dsf-bpe-mail-port\",\"link\":\"#dev-dsf-bpe-mail-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-replytoaddresses\",\"link\":\"#dev-dsf-bpe-mail-replytoaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"slug\":\"dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"link\":\"#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"slug\":\"dev-dsf-bpe-mail-sendtestmailonstartup\",\"link\":\"#dev-dsf-bpe-mail-sendtestmailonstartup\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"slug\":\"dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"link\":\"#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"slug\":\"dev-dsf-bpe-mail-toaddresses\",\"link\":\"#dev-dsf-bpe-mail-toaddresses\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"slug\":\"dev-dsf-bpe-mail-toaddressescc\",\"link\":\"#dev-dsf-bpe-mail-toaddressescc\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-bpe-mail-trust-server-certificate-cas\",\"link\":\"#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"slug\":\"dev-dsf-bpe-mail-username\",\"link\":\"#dev-dsf-bpe-mail-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"slug\":\"dev-dsf-bpe-mail-usesmtps\",\"link\":\"#dev-dsf-bpe-mail-usesmtps\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-corepoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-corepoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"slug\":\"dev-dsf-bpe-process-engine-maxpoolsize\",\"link\":\"#dev-dsf-bpe-process-engine-maxpoolsize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"slug\":\"dev-dsf-bpe-process-engine-queuesize\",\"link\":\"#dev-dsf-bpe-process-engine-queuesize\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"slug\":\"dev-dsf-bpe-process-excluded\",\"link\":\"#dev-dsf-bpe-process-excluded\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-max\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-max\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"slug\":\"dev-dsf-bpe-process-fhir-server-retry-sleep\",\"link\":\"#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"slug\":\"dev-dsf-bpe-process-plugin-directroy\",\"link\":\"#dev-dsf-bpe-process-plugin-directroy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"slug\":\"dev-dsf-bpe-process-retired\",\"link\":\"#dev-dsf-bpe-process-retired\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"slug\":\"dev-dsf-bpe-process-threads\",\"link\":\"#dev-dsf-bpe-process-threads\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"slug\":\"dev-dsf-bpe-server-base-url\",\"link\":\"#dev-dsf-bpe-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-bpe-server-roleconfig\",\"link\":\"#dev-dsf-bpe-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-bpe-server-static-resource-cache\",\"link\":\"#dev-dsf-bpe-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"slug\":\"dev-dsf-bpe-server-ui-theme\",\"link\":\"#dev-dsf-bpe-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]}],\"readingTime\":{\"minutes\":8.88,\"words\":2664},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_SERVER_API_HOST</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.server.api.host</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> API connector host, default in docker image: <code>0.0.0.0</code></li>\\n<li><strong>Default:</strong> <code>127.0.0.1</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.vue new file mode 100644 index 000000000..68a762429 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/configuration.html.vue @@ -0,0 +1,689 @@ +<template><div><h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-forceunlock"><span>DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-lockwaittime"><span>DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file"><span>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-liquibase-username"><span>DEV_DSF_BPE_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF BPE server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-url"><span>DEV_DSF_BPE_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/bpe</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-group"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Default:</strong> <code v-pre>camunda_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_camunda.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-camunda-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-camunda-username"><span>DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.camunda.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server for camunda processes</li> +<li><strong>Recommendation:</strong> Use a different user then in <em>DEV_DSF_BPE_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>camunda_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-group"><span>DEV_DSF_BPE_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_users</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file"><span>DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF BPE server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-db-user-username"><span>DEV_DSF_BPE_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF BPE server</li> +<li><strong>Default:</strong> <code v-pre>bpe_server_user</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-currentuser"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-dbstatement"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivityend" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivityend"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityEnd</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity end, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-onactivitystart" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-onactivitystart"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.onActivityStart</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable debug log messages for every bpmn activity start, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variables" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variables"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variables</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-variableslocal" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-variableslocal"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.variablesLocal</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-debug-log-message-webservicerequest"><span>DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with the local DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-local-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-local-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.local.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from the local DSF FHIR server, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-connect"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established with a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-timeout-read"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>60000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-remote-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-remote-verbose"><span>DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.remote.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about questionnaire response resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-server-base-url"><span>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of the local DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-max"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a websocket connection can be established with the DSF FHIR server, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-retry-sleep"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a websocket connection with the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-fhir-task-subscription-search-parameter" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-fhir-task-subscription-search-parameter"><span>DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.fhir.task.subscription.search.parameter</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Subscription to receive notifications about task resources from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file"><span>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-fromaddress" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-fromaddress"><span>DEV_DSF_BPE_MAIL_FROMADDRESS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.fromAddress</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service sender address</li> +<li><strong>Example:</strong> <code v-pre>sender@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-host"><span>DEV_DSF_BPE_MAIL_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.host</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server hostname</li> +<li><strong>Example:</strong> <code v-pre>smtp.server.de</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventbuffersize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation"><span>DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.</li> +<li><strong>Default:</strong> <code v-pre>/opt/bpe/log/bpe.log</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file"><span>DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication password</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_PASSWORD_FILE</em>; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-port"><span>DEV_DSF_BPE_MAIL_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.port</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server port</li> +<li><strong>Example:</strong> <code v-pre>465</code></li> +<li><strong>Default:</strong> <code v-pre>0</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-replytoaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-replytoaddresses"><span>DEV_DSF_BPE_MAIL_REPLYTOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.replyToAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service reply to addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>reply.to@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendmailonerrorlogevent" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendmailonerrorlogevent"><span>DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendMailOnErrorLogEvent</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable mails being send for every ERROR logged, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-sendtestmailonstartup" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-sendtestmailonstartup"><span>DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.sendTestMailOnStartup</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable a test mail being send on startup of the BPE, set to <code v-pre>true</code>. Requires SMTP server to be configured.</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file"><span>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.smime.p12Keystore.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the PKCS12 encoded S/MIMIE certificate file</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smime_certificate.p12.password</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddresses" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddresses"><span>DEV_DSF_BPE_MAIL_TOADDRESSES</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddresses</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-toaddressescc" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-toaddressescc"><span>DEV_DSF_BPE_MAIL_TOADDRESSESCC</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.toAddressesCc</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>cc.recipient@localhost</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-trust-server-certificate-cas"><span>DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/smtp_server_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-bpe-mail-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-username"><span>DEV_DSF_BPE_MAIL_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> SMTP server authentication username</li> +<li><strong>Recommendation:</strong> Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via <em>DEV_DSF_BPE_MAIL_USESMTPS</em></li> +</ul> +<h3 id="dev-dsf-bpe-mail-usesmtps" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-mail-usesmtps"><span>DEV_DSF_BPE_MAIL_USESMTPS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.mail.useSmtps</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable SMTP over TLS (smtps), set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-corepoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-corepoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.corePoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor core pool size</li> +<li><strong>Default:</strong> <code v-pre>4</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-maxpoolsize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-maxpoolsize"><span>DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.maxPoolSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor max pool size, additional threads until max pool size are created if the queue is full</li> +<li><strong>Default:</strong> <code v-pre>10</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-engine-queuesize" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-engine-queuesize"><span>DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.engine.queueSize</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy</li> +<li><strong>Default:</strong> <code v-pre>40</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-excluded" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-excluded"><span>DEV_DSF_BPE_PROCESS_EXCLUDED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.excluded</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Only deploy processes that can be started depending on your organization's roles in the Allow-List</li> +<li><strong>Example:</strong> <code v-pre>dsfdev_updateAllowList|1.0, another_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-max" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-max"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.max</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of retries until a connection can be established with the local DSF FHIR server during process deployment, <code v-pre>-1</code> means infinite number of retries</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-fhir-server-retry-sleep" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-fhir-server-retry-sleep"><span>DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.fhir.server.retry.sleep</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-plugin-directroy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-plugin-directroy"><span>DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.plugin.directroy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided directory structure from the installation guide or made changes to tit</li> +<li><strong>Default:</strong> <code v-pre>process</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-retired" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-retired"><span>DEV_DSF_BPE_PROCESS_RETIRED</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.retired</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported</li> +<li><strong>Recommendation:</strong> Retire processes that where deployed previously but are not anymore available</li> +<li><strong>Example:</strong> <code v-pre>old_process|x.y</code></li> +</ul> +<h3 id="dev-dsf-bpe-process-threads" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-process-threads"><span>DEV_DSF_BPE_PROCESS_THREADS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.process.threads</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <code v-pre><= 0</code> means number of cpu cores</li> +<li><strong>Default:</strong> <code v-pre>-1</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-base-url"><span>DEV_DSF_BPE_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Base address of the BPE server, configure when exposing the web-ui</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/bpe</code></li> +<li><strong>Default:</strong> <code v-pre>https</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-roleconfig"><span>DEV_DSF_BPE_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-bpe-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-static-resource-cache"><span>DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-bpe-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-bpe-server-ui-theme"><span>DEV_DSF_BPE_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.bpe.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.js new file mode 100644 index 000000000..5cf423bf1 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe/\",\"title\":\"BPE Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"BPE Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.js new file mode 100644 index 000000000..2e3118530 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/bpe/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.16,\"words\":347},\"filePathRelative\":\"release/archive/v1.5.2/maintain/bpe/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF BPE server user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.vue new file mode 100644 index 000000000..c44e527d5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/bpe/oidc.html.vue @@ -0,0 +1,42 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF BPE server user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF BPE server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">BPE Reverse Proxy</p> +<p>The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.2/maintain/bpe/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF BPE server accepts logout tokens at <a href="configuration#dev-dsf-bpe-server-base-url">DEV_DSF_BPE_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF BPE server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/bpe:1.5.2</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-bpe</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.js new file mode 100644 index 000000000..323e94fe0 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"APP_SERVER_IP\",\"slug\":\"app-server-ip\",\"link\":\"#app-server-ip\",\"children\":[]},{\"level\":3,\"title\":\"HTTPS_SERVER_NAME_PORT\",\"slug\":\"https-server-name-port\",\"link\":\"#https-server-name-port\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-connection-timeout-http\",\"link\":\"#proxy-pass-connection-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"slug\":\"proxy-pass-connection-timeout-ws\",\"link\":\"#proxy-pass-connection-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_HTTP\",\"slug\":\"proxy-pass-timeout-http\",\"link\":\"#proxy-pass-timeout-http\",\"children\":[]},{\"level\":3,\"title\":\"PROXY_PASS_TIMEOUT_WS\",\"slug\":\"proxy-pass-timeout-ws\",\"link\":\"#proxy-pass-timeout-ws\",\"children\":[]},{\"level\":3,\"title\":\"SERVER_CONTEXT_PATH\",\"slug\":\"server-context-path\",\"link\":\"#server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_CERTIFICATE_FILE\",\"slug\":\"ssl-ca-certificate-file\",\"link\":\"#ssl-ca-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CA_DN_REQUEST_FILE\",\"slug\":\"ssl-ca-dn-request-file\",\"link\":\"#ssl-ca-dn-request-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"slug\":\"ssl-certificate-chain-file\",\"link\":\"#ssl-certificate-chain-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_FILE\",\"slug\":\"ssl-certificate-file\",\"link\":\"#ssl-certificate-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_CERTIFICATE_KEY_FILE\",\"slug\":\"ssl-certificate-key-file\",\"link\":\"#ssl-certificate-key-file\",\"children\":[]},{\"level\":3,\"title\":\"SSL_VERIFY_CLIENT\",\"slug\":\"ssl-verify-client\",\"link\":\"#ssl-verify-client\",\"children\":[]}],\"readingTime\":{\"minutes\":1.35,\"words\":404},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.md\",\"excerpt\":\"<h3>APP_SERVER_IP</h3>\\n<ul>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li>\\n<li><strong>Example:</strong> <code>app</code>, <code>172.28.1.3</code></li>\\n</ul>\\n<h3>HTTPS_SERVER_NAME_PORT</h3>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.vue new file mode 100644 index 000000000..298d24d3f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html.vue @@ -0,0 +1,87 @@ +<template><div><h3 id="app-server-ip" tabindex="-1"><a class="header-anchor" href="#app-server-ip"><span>APP_SERVER_IP</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target</li> +<li><strong>Example:</strong> <code v-pre>app</code>, <code v-pre>172.28.1.3</code></li> +</ul> +<h3 id="https-server-name-port" tabindex="-1"><a class="header-anchor" href="#https-server-name-port"><span>HTTPS_SERVER_NAME_PORT</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> External FQDN of your DSF FHIR server with port, typically <code v-pre>443</code></li> +<li><strong>Example:</strong> <code v-pre>my-external.fqdn:443</code></li> +</ul> +<h3 id="proxy-pass-connection-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-http"><span>PROXY_PASS_CONNECTION_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-connection-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-connection-timeout-ws"><span>PROXY_PASS_CONNECTION_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established</li> +<li><strong>Default:</strong> <code v-pre>30</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-http" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-http"><span>PROXY_PASS_TIMEOUT_HTTP</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="proxy-pass-timeout-ws" tabindex="-1"><a class="header-anchor" href="#proxy-pass-timeout-ws"><span>PROXY_PASS_TIMEOUT_WS</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply</li> +<li><strong>Default:</strong> <code v-pre>60</code> seconds</li> +</ul> +<h3 id="server-context-path" tabindex="-1"><a class="header-anchor" href="#server-context-path"><span>SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Reverse proxy context path that delegates to the app server, <code v-pre>/</code> character at start, no <code v-pre>/</code> character at end, use <code v-pre>''</code> (empty string) to configure root as context path.</li> +<li><strong>Default:</strong> <code v-pre>/fhir</code></li> +</ul> +<h3 id="ssl-ca-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-certificate-file"><span>SSL_CA_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCACertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-ca-dn-request-file" tabindex="-1"><a class="header-anchor" href="#ssl-ca-dn-request-file"><span>SSL_CA_DN_REQUEST_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> File containing all signing certificates excepted, will be used to specify the <code v-pre>Acceptable client certificate CA names</code> send to the client, during TLS handshake, sets the apache httpd parameter <code v-pre>SSLCADNRequestFile</code>; if omitted all entries from <code v-pre>SSL_CA_CERTIFICATE_FILE</code> are used</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_ca_dn_request_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-chain-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-chain-file"><span>SSL_CERTIFICATE_CHAIN_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter <code v-pre>SSLCertificateChainFile</code>; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via <code v-pre>SSL_CERTIFICATE_FILE</code> contains the certificate chain</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_chain_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-file"><span>SSL_CERTIFICATE_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate file, PEM encoded, sets the apache httpd parameter <code v-pre>SSLCertificateFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_file.pem</code></li> +</ul> +<h3 id="ssl-certificate-key-file" tabindex="-1"><a class="header-anchor" href="#ssl-certificate-key-file"><span>SSL_CERTIFICATE_KEY_FILE</span></a></h3> +<ul> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter <code v-pre>SSLCertificateKeyFile</code></li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/ssl_certificate_key_file.pem</code></li> +</ul> +<h3 id="ssl-verify-client" tabindex="-1"><a class="header-anchor" href="#ssl-verify-client"><span>SSL_VERIFY_CLIENT</span></a></h3> +<ul> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Modifies the apache mod_ssl config parameter <code v-pre>SSLVerifyClient</code></li> +<li><strong>Recommendation:</strong> Set to <code v-pre>optional</code> when using OIDC authentication</li> +<li><strong>Default:</strong> <code v-pre>require</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.js new file mode 100644 index 000000000..2fa6837fb --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir-reverse-proxy/\",\"title\":\"FHIR Reverse Proxy\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Reverse Proxy\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.03,\"words\":10},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir-reverse-proxy/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.vue new file mode 100644 index 000000000..ea9b1a1ba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir-reverse-proxy/index.html.vue @@ -0,0 +1,7 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.js new file mode 100644 index 000000000..35b1902e3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir/access-control.html\",\"title\":\"Access Control\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Access Control\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Matching Users\",\"slug\":\"matching-users\",\"link\":\"#matching-users\",\"children\":[]},{\"level\":2,\"title\":\"DSF and Practitioner Roles\",\"slug\":\"dsf-and-practitioner-roles\",\"link\":\"#dsf-and-practitioner-roles\",\"children\":[]},{\"level\":2,\"title\":\"Examples\",\"slug\":\"examples\",\"link\":\"#examples\",\"children\":[]}],\"readingTime\":{\"minutes\":2.52,\"words\":755},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir/access-control.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>The DSF FHIR server implements a subset of the FHIR R4 <a href=\\\"http://hl7.org/fhir/R4/http.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href=\\\"configuration#dev-dsf-fhir-server-organization-thumbprint\\\">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.vue new file mode 100644 index 000000000..19e4068c5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/access-control.html.vue @@ -0,0 +1,82 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>The DSF FHIR server implements a subset of the FHIR R4 <a href="http://hl7.org/fhir/R4/http.html" target="_blank" rel="noopener noreferrer">REST API</a>. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: <a href="configuration#dev-dsf-fhir-server-organization-thumbprint">DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</a></p> +<div class="hint-container tip"> +<p class="hint-container-title">OpenID Connect</p> +<p>To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect <a href="oidc">configuration page</a>.</p> +</div> +<p>Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a>. The value for this environment variable is specified as YAML using the block scalar <code v-pre>|</code>.</p> +<p>The listing below shows a minimal configuration to enable read access for a specific client-certificate:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - example_read_only_role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128}</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The list of user roles above contains a single rule-entry <code v-pre>example_read_only_role</code>, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Certificate Thumbprints</p> +<p>SHA-512 certificate thumbprints in HEX form <code v-pre>[a-f0-9]{128}</code> can be calculated using:</p> +<div class="language-sh line-numbers-mode" data-highlighter="shiki" data-ext="sh" data-title="sh" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">certtool</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fingerprint</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --hash=sha512</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --infile=certificate.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div> +<p>Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string <code v-pre>""</code> or a single block scalar <code v-pre>|</code> character as the value for the configuration parameter <a href="configuration#dev-dsf-fhir-server-roleconfig">DEV_DSF_FHIR_SERVER_ROLECONFIG</a> if no roles should be configured.</p> +<h2 id="matching-users" tabindex="-1"><a class="header-anchor" href="#matching-users"><span>Matching Users</span></a></h2> +<p>To apply roles, users can be matched via the <code v-pre>thumbprint</code>, <code v-pre>email</code>, <code v-pre>token-role</code> or <code v-pre>token-group</code> properties. A single value or a list of values can be specified.</p> +<h4 id="thumbprint" tabindex="-1"><a class="header-anchor" href="#thumbprint"><span>thumbprint</span></a></h4> +<p>The property <code v-pre>thumbprint</code> can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.</p> +<h4 id="email" tabindex="-1"><a class="header-anchor" href="#email"><span>email</span></a></h4> +<p>Using the property <code v-pre>email</code> users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the <code v-pre>email</code> <a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" target="_blank" rel="noopener noreferrer">claim</a> from the access token will be matched against the property values.</p> +<h4 id="token-role-and-token-group" tabindex="-1"><a class="header-anchor" href="#token-role-and-token-group"><span>token-role and token-group</span></a></h4> +<p>With the properties <code v-pre>token-role</code> and <code v-pre>token-group</code> role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.</p> +<h2 id="dsf-and-practitioner-roles" tabindex="-1"><a class="header-anchor" href="#dsf-and-practitioner-roles"><span>DSF and Practitioner Roles</span></a></h2> +<p>Two types of roles can be applied to matched users.</p> +<h4 id="dsf-role" tabindex="-1"><a class="header-anchor" href="#dsf-role"><span>dsf-role</span></a></h4> +<p>DSF roles specified via the <code v-pre>dsf-role</code> property define general access to the REST API and user interface. Allowed values are:</p> +<p><code v-pre>CREATE</code>, <code v-pre>READ</code>, <code v-pre>UPDATE</code>, <code v-pre>DELETE</code>, <code v-pre>SEARCH</code>, <code v-pre>HISTORY</code>, <code v-pre>PERMANENT_DELETE</code> and <code v-pre>WEBSOCKET</code>.</p> +<h4 id="practitioner-role" tabindex="-1"><a class="header-anchor" href="#practitioner-role"><span>practitioner-role</span></a></h4> +<p>In order to allow users to start processes, the property <code v-pre>practitioner-role</code> can be used to assign codes from FHIR <a href="http://hl7.org/fhir/R4/codesystem.html" target="_blank" rel="noopener noreferrer">CodeSystem</a> resources. Codes are specified in the form <code v-pre>system-url|code</code>.<br> +If the uses has a code specified here that match with a <code v-pre>requester</code> extension within the process plugin's <a href="http://hl7.org/fhir/R4/activitydefinition.html" target="_blank" rel="noopener noreferrer">ActivityDefinition</a> resource, the user can start the process if he also has the <code v-pre>dsf-role</code> <code v-pre>CREATE</code>.</p> +<p>Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem <code v-pre>http://dsf.dev/fhir/CodeSystem/practitioner-role</code>:</p> +<p><code v-pre>UAC_USER</code>, <code v-pre>COS_USER</code>, <code v-pre>CRR_USER</code>, <code v-pre>DIC_USER</code>, <code v-pre>DMS_USER</code>, <code v-pre>DTS_USER</code>, <code v-pre>HRP_USER</code>, <code v-pre>TTP_USER</code>, <code v-pre>AMS_USER</code> and <code v-pre>DSF_ADMIN</code>.</p> +<h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples"><span>Examples</span></a></h2> +<p>The first example defines a group of DSF administrators. Two client certificates match against this role:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - certificate-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thumbprint: </span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The second example defines a group of DSF administrators by specifying an <code v-pre>admin</code> role that gets matched against OAuth 2.0 access tokens:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - token-role-admins:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> token-role: admin</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - CREATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - UPDATE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - DELETE</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> practitioner-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:</p> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_FHIR_SERVER_ROLECONFIG</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - read-only:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> email:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - first.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - second.user@test.org</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dsf-role:</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - READ</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - SEARCH</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> - HISTORY</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.js new file mode 100644 index 000000000..4f67e5091 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir/configuration.html\",\"title\":\"Configuration Parameters\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Configuration Parameters\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-fhir-client-certificate\",\"link\":\"#dev-dsf-fhir-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"slug\":\"dev-dsf-fhir-client-timeout-connect\",\"link\":\"#dev-dsf-fhir-client-timeout-connect\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"slug\":\"dev-dsf-fhir-client-timeout-read\",\"link\":\"#dev-dsf-fhir-client-timeout-read\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-fhir-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-fhir-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"slug\":\"dev-dsf-fhir-client-verbose\",\"link\":\"#dev-dsf-fhir-client-verbose\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"slug\":\"dev-dsf-fhir-db-liquibase-forceunlock\",\"link\":\"#dev-dsf-fhir-db-liquibase-forceunlock\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"slug\":\"dev-dsf-fhir-db-liquibase-lockwaittime\",\"link\":\"#dev-dsf-fhir-db-liquibase-lockwaittime\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"link\":\"#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-liquibase-username\",\"link\":\"#dev-dsf-fhir-db-liquibase-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_URL\",\"slug\":\"dev-dsf-fhir-db-url\",\"link\":\"#dev-dsf-fhir-db-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-group\",\"link\":\"#dev-dsf-fhir-db-user-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"link\":\"#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-group\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-group\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-permanent-delete-username\",\"link\":\"#dev-dsf-fhir-db-user-permanent-delete-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"slug\":\"dev-dsf-fhir-db-user-username\",\"link\":\"#dev-dsf-fhir-db-user-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"slug\":\"dev-dsf-fhir-debug-log-message-currentuser\",\"link\":\"#dev-dsf-fhir-debug-log-message-currentuser\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"slug\":\"dev-dsf-fhir-debug-log-message-dbstatement\",\"link\":\"#dev-dsf-fhir-debug-log-message-dbstatement\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"slug\":\"dev-dsf-fhir-debug-log-message-webservicerequest\",\"link\":\"#dev-dsf-fhir-debug-log-message-webservicerequest\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"slug\":\"dev-dsf-fhir-server-base-url\",\"link\":\"#dev-dsf-fhir-server-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"slug\":\"dev-dsf-fhir-server-init-bundle\",\"link\":\"#dev-dsf-fhir-server-init-bundle\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"slug\":\"dev-dsf-fhir-server-organization-identifier-value\",\"link\":\"#dev-dsf-fhir-server-organization-identifier-value\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"slug\":\"dev-dsf-fhir-server-organization-thumbprint\",\"link\":\"#dev-dsf-fhir-server-organization-thumbprint\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"slug\":\"dev-dsf-fhir-server-page-count\",\"link\":\"#dev-dsf-fhir-server-page-count\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"slug\":\"dev-dsf-fhir-server-roleconfig\",\"link\":\"#dev-dsf-fhir-server-roleconfig\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"slug\":\"dev-dsf-fhir-server-static-resource-cache\",\"link\":\"#dev-dsf-fhir-server-static-resource-cache\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"slug\":\"dev-dsf-fhir-server-ui-theme\",\"link\":\"#dev-dsf-fhir-server-ui-theme\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_NOPROXY\",\"slug\":\"dev-dsf-proxy-noproxy\",\"link\":\"#dev-dsf-proxy-noproxy\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"slug\":\"dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"link\":\"#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_URL\",\"slug\":\"dev-dsf-proxy-url\",\"link\":\"#dev-dsf-proxy-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_PROXY_USERNAME\",\"slug\":\"dev-dsf-proxy-username\",\"link\":\"#dev-dsf-proxy-username\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_HOST\",\"slug\":\"dev-dsf-server-api-host\",\"link\":\"#dev-dsf-server-api-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_API_PORT\",\"slug\":\"dev-dsf-server-api-port\",\"link\":\"#dev-dsf-server-api-port\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"slug\":\"dev-dsf-server-auth-client-certificate-header\",\"link\":\"#dev-dsf-server-auth-client-certificate-header\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"slug\":\"dev-dsf-server-auth-oidc-authorization-code-flow\",\"link\":\"#dev-dsf-server-auth-oidc-authorization-code-flow\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"slug\":\"dev-dsf-server-auth-oidc-back-channel-logout-path\",\"link\":\"#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"slug\":\"dev-dsf-server-auth-oidc-bearer-token\",\"link\":\"#dev-dsf-server-auth-oidc-bearer-token\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"slug\":\"dev-dsf-server-auth-oidc-client-id\",\"link\":\"#dev-dsf-server-auth-oidc-client-id\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"slug\":\"dev-dsf-server-auth-oidc-client-secret\",\"link\":\"#dev-dsf-server-auth-oidc-client-secret\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"link\":\"#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"slug\":\"dev-dsf-server-auth-oidc-provider-realm-base-url\",\"link\":\"#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"slug\":\"dev-dsf-server-auth-trust-client-certificate-cas\",\"link\":\"#dev-dsf-server-auth-trust-client-certificate-cas\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE\",\"slug\":\"dev-dsf-server-certificate\",\"link\":\"#dev-dsf-server-certificate\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"slug\":\"dev-dsf-server-certificate-chain\",\"link\":\"#dev-dsf-server-certificate-chain\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"slug\":\"dev-dsf-server-certificate-key\",\"link\":\"#dev-dsf-server-certificate-key\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"slug\":\"dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"link\":\"#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"slug\":\"dev-dsf-server-context-path\",\"link\":\"#dev-dsf-server-context-path\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_HOST\",\"slug\":\"dev-dsf-server-status-host\",\"link\":\"#dev-dsf-server-status-host\",\"children\":[]},{\"level\":3,\"title\":\"DEV_DSF_SERVER_STATUS_PORT\",\"slug\":\"dev-dsf-server-status-port\",\"link\":\"#dev-dsf-server-status-port\",\"children\":[]}],\"readingTime\":{\"minutes\":5.15,\"words\":1546},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir/configuration.md\",\"excerpt\":\"<h3>DEV_DSF_FHIR_CLIENT_CERTIFICATE</h3>\\n<ul>\\n<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li>\\n<li><strong>Required:</strong> Yes</li>\\n<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li>\\n<li><strong>Recommendation:</strong> Use docker secret file to configure</li>\\n<li><strong>Example:</strong> <code>/run/secrets/app_client_certificate.pem</code></li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.vue new file mode 100644 index 000000000..f398912d2 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/configuration.html.vue @@ -0,0 +1,422 @@ +<template><div><h3 id="dev-dsf-fhir-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with local client certificate for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Private key corresponding to the local client certificate as PEM encoded file. Use <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file"><span>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the local client certificate encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-connect" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-connect"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.connect</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>2000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-timeout-read" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-timeout-read"><span>DEV_DSF_FHIR_CLIENT_TIMEOUT_READ</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.timeout.read</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted</li> +<li><strong>Recommendation:</strong> Change default value only if timeout exceptions occur</li> +<li><strong>Default:</strong> <code v-pre>10000</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-trust-server-certificate-cas"><span>DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client _trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-client-verbose" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-client-verbose"><span>DEV_DSF_FHIR_CLIENT_VERBOSE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.client.verbose</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to <code v-pre>true</code></li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-forceunlock" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-forceunlock"><span>DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.forceUnlock</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To force liquibase to unlock the migration lock set to <code v-pre>true</code></li> +<li><strong>Recommendation:</strong> Only use this option temporarily to unlock a stuck DB migration step</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-lockwaittime" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-lockwaittime"><span>DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.lockWaitTime</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Liquibase change lock wait time in minutes, default 2 minutes</li> +<li><strong>Default:</strong> <code v-pre>2</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file"><span>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The password to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure by using <em>DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_liquibase.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-liquibase-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-liquibase-username"><span>DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.liquibase.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The user name to access the database from the DSF FHIR server to execute database migrations</li> +<li><strong>Default:</strong> <code v-pre>liquibase_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-url"><span>DEV_DSF_FHIR_DB_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Address of the database used for the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose</li> +<li><strong>Example:</strong> <code v-pre>jdbc:postgresql://db/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-group"><span>DEV_DSF_FHIR_DB_USER_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file"><span>DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-group" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-group"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.group</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> The name of the user group to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Default:</strong> <code v-pre>fhir_permanent_delete_users</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.password</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Password to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/db_user_permanent_delete.password</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-permanent-delete-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-permanent-delete-username"><span>DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.permanent.delete.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server for permanent deletes</li> +<li><strong>Recommendation:</strong> Use a different user then <em>DEV_DSF_FHIR_DB_USER_USERNAME</em></li> +<li><strong>Default:</strong> <code v-pre>fhir_server_permanent_delete_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-db-user-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-db-user-username"><span>DEV_DSF_FHIR_DB_USER_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.db.user.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Username to access the database from the DSF FHIR server</li> +<li><strong>Default:</strong> <code v-pre>fhir_server_user</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-currentuser" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-currentuser"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.currentUser</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of the currently requesting user set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-dbstatement" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-dbstatement"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.dbStatement</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of DB queries set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-debug-log-message-webservicerequest" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-debug-log-message-webservicerequest"><span>DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.debug.log.message.webserviceRequest</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To enable logging of webservices requests set to <code v-pre>true</code>.</li> +<li><strong>Recommendation:</strong> This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-base-url"><span>DEV_DSF_FHIR_SERVER_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.base.url</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Base address of this DSF FHIR server to read/store fhir resources</li> +<li><strong>Example:</strong> <code v-pre>https://foo.bar/fhir</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-init-bundle" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-init-bundle"><span>DEV_DSF_FHIR_SERVER_INIT_BUNDLE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.init.bundle</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server</li> +<li><strong>Recommendation:</strong> Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source</li> +<li><strong>Default:</strong> <code v-pre>conf/bundle.xml</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-identifier-value" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-identifier-value"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.identifier.value</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Local identifier value used in the Allow-List</li> +<li><strong>Recommendation:</strong> By convention: The shortest possible FQDN that resolve the homepage of the organization</li> +<li><strong>Example:</strong> <code v-pre>hospital.com</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-organization-thumbprint" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-organization-thumbprint"><span>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.organization.thumbprint</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> The SHA-512 thumbprint of the local organization client certificate</li> +<li><strong>Recommendation:</strong> The thumbprint can be calculated via <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-page-count" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-page-count"><span>DEV_DSF_FHIR_SERVER_PAGE_COUNT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.page.count</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Page size returned by the DSF FHIR server when reading/searching fhir resources</li> +<li><strong>Default:</strong> <code v-pre>20</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-roleconfig" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-roleconfig"><span>DEV_DSF_FHIR_SERVER_ROLECONFIG</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.roleConfig</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Role config YAML as defined in <a href="access-control">FHIR Server: Access Control</a>.</li> +</ul> +<h3 id="dev-dsf-fhir-server-static-resource-cache" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-static-resource-cache"><span>DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.static.resource.cache</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> To disable static resource caching, set to <code v-pre>false</code></li> +<li><strong>Recommendation:</strong> Only set to <code v-pre>false</code> for development</li> +<li><strong>Default:</strong> <code v-pre>true</code></li> +</ul> +<h3 id="dev-dsf-fhir-server-ui-theme" tabindex="-1"><a class="header-anchor" href="#dev-dsf-fhir-server-ui-theme"><span>DEV_DSF_FHIR_SERVER_UI_THEME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.fhir.server.ui.theme</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> UI theme parameter, adds a color indicator to the ui to distinguish <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code> environments im configured; supported values: <code v-pre>dev</code>, <code v-pre>test</code> and <code v-pre>prod</code></li> +</ul> +<h3 id="dev-dsf-proxy-noproxy" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-noproxy"><span>DEV_DSF_PROXY_NOPROXY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.noProxy</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported</li> +<li><strong>Example:</strong> <code v-pre>foo.bar, test.com:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-password-or-dev-dsf-proxy-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file"><span>DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward Proxy password</li> +<li><strong>Recommendation:</strong> Configure password if proxy requires authentication, use docker secret file to configure using <em>DEV_DSF_PROXY_PASSWORD_FILE</em></li> +</ul> +<h3 id="dev-dsf-proxy-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-url"><span>DEV_DSF_PROXY_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward (http/https) proxy url, use <em>DEV_DSF_BPE_PROXY_NOPROXY</em> to list domains that do not require a forward proxy</li> +<li><strong>Example:</strong> <code v-pre>http://proxy.foo:8080</code></li> +</ul> +<h3 id="dev-dsf-proxy-username" tabindex="-1"><a class="header-anchor" href="#dev-dsf-proxy-username"><span>DEV_DSF_PROXY_USERNAME</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.proxy.username</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Forward proxy username</li> +<li><strong>Recommendation:</strong> Configure username if proxy requires authentication</li> +</ul> +<h3 id="dev-dsf-server-api-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-host"><span>DEV_DSF_SERVER_API_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector host, default in docker image: <code v-pre>0.0.0.0</code></li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-api-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-api-port"><span>DEV_DSF_SERVER_API_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.api.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> API connector port, default in docker image: <code v-pre>8080</code></li> +</ul> +<h3 id="dev-dsf-server-auth-client-certificate-header" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-client-certificate-header"><span>DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.client.certificate.header</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Name of HTTP header with client certificate from reverse proxy</li> +<li><strong>Default:</strong> <code v-pre>X-ClientCert</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-authorization-code-flow"><span>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.authorization.code.flow</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC authorization code flow</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em>, <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC back-channel logout</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> to be set to <code v-pre>true</code> (enabled), <em>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</em> and <em>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-back-channel-logout-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-back-channel-logout-path"><span>DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.back.channel.logout.path</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Path called by the OIDC provide to request back-channel logout</li> +<li><strong>Default:</strong> <code v-pre>/back-channel-logout</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-bearer-token" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-bearer-token"><span>DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.bearer.token</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Set to <code v-pre>true</code> to enable OIDC bearer token authentication</li> +<li><strong>Recommendation:</strong> Requires <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</em> to be specified</li> +<li><strong>Default:</strong> <code v-pre>false</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-id" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-id"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span></a></h3> +<ul> +<li><strong>Property:</strong> <a href="http://dev.dsf.server.auth.oidc.client.id" target="_blank" rel="noopener noreferrer">dev.dsf.server.auth.oidc.client.id</a></li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_id, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-client-secret" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-client-secret"><span>DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.client.secret</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client_secret, must be specified if <em>DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</em> is enabled</li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with client certificate for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD</em> or <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em> if private key is encrypted</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Password to decrypt the client certificate for the OIDC provider encrypted private key</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure using <em>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE</em></li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_client_certificate_private_key.pem.password</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-connecttimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-connecttimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.connectTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client connect timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>5000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-idletimeout" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-idletimeout"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.idleTimeout</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider client idle timeout in milliseconds</li> +<li><strong>Default:</strong> <code v-pre>30000</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/oidc_provider_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-auth-oidc-provider-realm-base-url" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-oidc-provider-realm-base-url"><span>DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.oidc.provider.realm.base.url</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> OIDC provider realm base url</li> +<li><strong>Example:</strong> <code v-pre>https://keycloak.test.com:8443/realms/example-realm-name</code></li> +</ul> +<h3 id="dev-dsf-server-auth-trust-client-certificate-cas" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-auth-trust-client-certificate-cas"><span>DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.auth.trust.client.certificate.cas</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients</li> +<li><strong>Recommendation:</strong> Use docker secret file to configure</li> +<li><strong>Example:</strong> <code v-pre>/run/secrets/app_client_trust_certificates.pem</code></li> +</ul> +<h3 id="dev-dsf-server-certificate" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate"><span>DEV_DSF_SERVER_CERTIFICATE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-chain" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-chain"><span>DEV_DSF_SERVER_CERTIFICATE_CHAIN</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.chain</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate chain file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key"><span>DEV_DSF_SERVER_CERTIFICATE_KEY</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file"><span>DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.certificate.key.password</li> +<li><strong>Required:</strong> No</li> +<li><strong>Description:</strong> Server certificate private key file password for testing</li> +<li><strong>Recommendation:</strong> Only specify For testing when terminating TLS in jetty server</li> +</ul> +<h3 id="dev-dsf-server-context-path" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-context-path"><span>DEV_DSF_SERVER_CONTEXT_PATH</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.context.path</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Web application context path, default in <code v-pre>bpe</code> docker image: <code v-pre>/bpe</code>, default in <code v-pre>fhir</code> docker image: <code v-pre>/fhir</code></li> +<li><strong>Recommendation:</strong> Only modify for testing</li> +</ul> +<h3 id="dev-dsf-server-status-host" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-host"><span>DEV_DSF_SERVER_STATUS_HOST</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.host</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector host</li> +<li><strong>Default:</strong> <code v-pre>127.0.0.1</code></li> +</ul> +<h3 id="dev-dsf-server-status-port" tabindex="-1"><a class="header-anchor" href="#dev-dsf-server-status-port"><span>DEV_DSF_SERVER_STATUS_PORT</span></a></h3> +<ul> +<li><strong>Property:</strong> dev.dsf.server.status.port</li> +<li><strong>Required:</strong> Yes</li> +<li><strong>Description:</strong> Status connector port, default in docker image: <code v-pre>10000</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.js new file mode 100644 index 000000000..e93229b26 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir/\",\"title\":\"FHIR Server\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"FHIR Server\",\"icon\":\"module\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.05,\"words\":16},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"access-control\\\">Access Control</a></li>\\n<li><a href=\\\"oidc\\\">OpenID Connect</a></li>\\n</ul>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.vue new file mode 100644 index 000000000..d106508d3 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/index.html.vue @@ -0,0 +1,9 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="configuration">Configuration Parameters</a></li> +<li><a href="access-control">Access Control</a></li> +<li><a href="oidc">OpenID Connect</a></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.js new file mode 100644 index 000000000..61224494f --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/fhir/oidc.html\",\"title\":\"OpenID Connect\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"OpenID Connect\",\"icon\":\"config\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]},{\"level\":2,\"title\":\"Authorization Code Flow\",\"slug\":\"authorization-code-flow\",\"link\":\"#authorization-code-flow\",\"children\":[]},{\"level\":2,\"title\":\"Bearer Token Authentication\",\"slug\":\"bearer-token-authentication\",\"link\":\"#bearer-token-authentication\",\"children\":[]},{\"level\":2,\"title\":\"Additional ODIC Configuration Parameter\",\"slug\":\"additional-odic-configuration-parameter\",\"link\":\"#additional-odic-configuration-parameter\",\"children\":[]},{\"level\":2,\"title\":\"Example\",\"slug\":\"example\",\"link\":\"#example\",\"children\":[]}],\"readingTime\":{\"minutes\":1.34,\"words\":401},\"filePathRelative\":\"release/archive/v1.5.2/maintain/fhir/oidc.md\",\"excerpt\":\"<h2>Overview</h2>\\n<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href=\\\"access-control\\\">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.vue new file mode 100644 index 000000000..67934150c --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/fhir/oidc.html.vue @@ -0,0 +1,47 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<p>Access to the DSF FHIR server REST API and user interface can be configured via <a href="access-control">access control roles</a>. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.</p> +<p>The DSF FHIR server supports <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank" rel="noopener noreferrer">Authorization Code Flow</a> for the user interface as well as <a href="https://datatracker.ietf.org/doc/html/rfc6750" target="_blank" rel="noopener noreferrer">Bearer Token Authentication</a> for the REST API. <a href="https://openid.net/specs/openid-connect-backchannel-1_0.html" target="_blank" rel="noopener noreferrer">Back-Channel Logout</a> is also supported.</p> +<div class="hint-container tip"> +<p class="hint-container-title">FHIR Reverse Proxy</p> +<p>The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter <RouteLink to="/release/archive/v1.5.2/maintain/fhir/configuration/reverseproxy.html#ssl-verify-client">SSL_VERIFY_CLIENT</RouteLink> needs to be set to <code v-pre>optional</code>.</p> +</div> +<h2 id="authorization-code-flow" tabindex="-1"><a class="header-anchor" href="#authorization-code-flow"><span>Authorization Code Flow</span></a></h2> +<p>To enable authentication via OpenID Connect authorization code flow, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-authorization-code-flow">DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</a> to <code v-pre>true</code> and specify the following parameters:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-id">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</a></li> +<li><a href="configuration#dev-dsf-server-auth-oidc-client-secret">DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</a></li> +</ul> +<p>Optionally, back channel logout can be enabled by setting <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</a> to <code v-pre>true</code>. The DSF FHIR server accepts logout tokens at <a href="configuration#dev-dsf-fhir-server-base-url">DEV_DSF_FHIR_SERVER_BASE_URL</a> + <code v-pre>/back-channel-logout</code>. The path can be modified via <a href="configuration#dev-dsf-server-auth-oidc-back-channel-logout-path">DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH</a>.</p> +<h2 id="bearer-token-authentication" tabindex="-1"><a class="header-anchor" href="#bearer-token-authentication"><span>Bearer Token Authentication</span></a></h2> +<p>To enable bearer token authentication, set the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-bearer-token">DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</a> to <code v-pre>true</code> and specify the following parameter:</p> +<ul> +<li><a href="configuration#dev-dsf-server-auth-oidc-provider-realm-base-url">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</a></li> +</ul> +<h2 id="additional-odic-configuration-parameter" tabindex="-1"><a class="header-anchor" href="#additional-odic-configuration-parameter"><span>Additional ODIC Configuration Parameter</span></a></h2> +<p>A number of additional <code v-pre>DEV_DSF_SERVER_AUTH_OIDC ...</code> configuration parameter are specify on the DSF FHIR server <a href="configuration">configuration parameter page</a>.</p> +<p>For example the configuration parameter <a href="configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas">DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</a> can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.</p> +<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example"><span>Example</span></a></h2> +<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">services</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> image</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ghcr.io/datasharingframework/fhir:1.5.2</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'true'</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://keycloak.test.org/realms/dsf</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/run/secrets/keycloak_root_ca.pem</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">dsf-fhir</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3</span></span> +<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # ...</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">secrets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> keycloak_root_ca.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">./secrets/keycloak_root_ca.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.js new file mode 100644 index 000000000..86538ecba --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/\",\"title\":\"Maintain a DSF instance\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Maintain a DSF instance\",\"icon\":\"tool\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[]}],\"readingTime\":{\"minutes\":0.21,\"words\":64},\"filePathRelative\":\"release/archive/v1.5.2/maintain/README.md\",\"excerpt\":\"<h2>Overview</h2>\\n<ul>\\n<li><a href=\\\"install\\\">Install DSF 1.5.2</a></li>\\n<li><a href=\\\"upgrade-from-0\\\">Upgrade from DSF 0.9.x</a></li>\\n<li><a href=\\\"allowList-mgm\\\">Allow List Management</a></li>\\n<li>FHIR Reverse Proxy\\n<ul>\\n<li><a href=\\\"fhir-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>FHIR Server\\n<ul>\\n<li><a href=\\\"fhir/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"fhir/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"fhir/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n<li>BPE Reverse Proxy\\n<ul>\\n<li><a href=\\\"bpe-reverse-proxy/configuration\\\">Configuration Parameters</a></li>\\n</ul>\\n</li>\\n<li>BPE Server\\n<ul>\\n<li><a href=\\\"bpe/configuration\\\">Configuration Parameters</a></li>\\n<li><a href=\\\"bpe/access-control\\\">Access Control</a></li>\\n<li><a href=\\\"bpe/oidc\\\">OpenID Connect</a></li>\\n</ul>\\n</li>\\n</ul>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.vue new file mode 100644 index 000000000..975f16565 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/index.html.vue @@ -0,0 +1,33 @@ +<template><div><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2> +<ul> +<li><a href="install">Install DSF 1.5.2</a></li> +<li><a href="upgrade-from-0">Upgrade from DSF 0.9.x</a></li> +<li><a href="allowList-mgm">Allow List Management</a></li> +<li>FHIR Reverse Proxy +<ul> +<li><a href="fhir-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>FHIR Server +<ul> +<li><a href="fhir/configuration">Configuration Parameters</a></li> +<li><a href="fhir/access-control">Access Control</a></li> +<li><a href="fhir/oidc">OpenID Connect</a></li> +</ul> +</li> +<li>BPE Reverse Proxy +<ul> +<li><a href="bpe-reverse-proxy/configuration">Configuration Parameters</a></li> +</ul> +</li> +<li>BPE Server +<ul> +<li><a href="bpe/configuration">Configuration Parameters</a></li> +<li><a href="bpe/access-control">Access Control</a></li> +<li><a href="bpe/oidc">OpenID Connect</a></li> +</ul> +</li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.js new file mode 100644 index 000000000..7127e0be4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/install-plugins.html\",\"title\":\"Install Plugins\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install Plugins\",\"icon\":\"plugin\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Overview\",\"slug\":\"overview\",\"link\":\"#overview\",\"children\":[{\"level\":3,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[]},{\"level\":3,\"title\":\"Deployment\",\"slug\":\"deployment\",\"link\":\"#deployment\",\"children\":[]}]}],\"readingTime\":{\"minutes\":1.18,\"words\":353},\"filePathRelative\":\"release/archive/v1.5.2/maintain/install-plugins.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Marketplace for process plugins</p>\\n<p>To install and learn more about each Process Plugin, you can visit the Marketplace <a href=\\\"https://hub.dsf.dev/\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">here</a>.</p>\\n</div>\\n<h2><strong>Overview</strong></h2>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.vue new file mode 100644 index 000000000..235cde3c4 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install-plugins.html.vue @@ -0,0 +1,84 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Marketplace for process plugins</p> +<p>To install and learn more about each Process Plugin, you can visit the Marketplace <a href="https://hub.dsf.dev/" target="_blank" rel="noopener noreferrer">here</a>.</p> +</div> +<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span><strong>Overview</strong></span></a></h2> +<ul> +<li>You can find an overview of compatable process plugins below (last updated 14/08/2024).</li> +</ul> +<table> +<thead> +<tr> +<th>Process Plugin</th> +<th>released for test</th> +<th>released for production</th> +</tr> +</thead> +<tbody> +<tr> +<td><a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases" target="_blank" rel="noopener noreferrer">Ping-Pong</a></td> +<td><a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases/tag/v1.0.1.0" target="_blank" rel="noopener noreferrer">v1.0.1.0</a></td> +<td><a href="https://github.com/datasharingframework/dsf-process-ping-pong/releases/tag/v1.0.1.0" target="_blank" rel="noopener noreferrer">v1.0.1.0</a></td> +</tr> +<tr> +<td><a href="https://github.com/datasharingframework/dsf-process-allow-list/releases" target="_blank" rel="noopener noreferrer">Allow-List</a></td> +<td><a href="https://github.com/datasharingframework/dsf-process-allow-list/releases/tag/v1.0.0.1" target="_blank" rel="noopener noreferrer">v1.0.0.1</a></td> +<td><a href="https://github.com/datasharingframework/dsf-process-allow-list/releases/tag/v1.0.0.1" target="_blank" rel="noopener noreferrer">v1.0.0.1</a></td> +</tr> +<tr> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases" target="_blank" rel="noopener noreferrer">MII Process Feasibility</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases/tag/v1.0.0.6" target="_blank" rel="noopener noreferrer">v1.0.0.6</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-feasibility/releases/tag/v1.0.0.6" target="_blank" rel="noopener noreferrer">v1.0.0.6</a></td> +</tr> +<tr> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-report/releases" target="_blank" rel="noopener noreferrer">MII Process Report</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-report/releases/tag/v1.1.1.1" target="_blank" rel="noopener noreferrer">v1.1.1.1</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-report/releases/tag/v1.1.1.1" target="_blank" rel="noopener noreferrer">v1.1.1.1</a></td> +</tr> +<tr> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases" target="_blank" rel="noopener noreferrer">MII Process Data Transfer</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases/tag/v1.0.2.1" target="_blank" rel="noopener noreferrer">v1.0.2.1</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases/tag/v1.0.2.1" target="_blank" rel="noopener noreferrer">v1.0.2.1</a></td> +</tr> +<tr> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases" target="_blank" rel="noopener noreferrer">MII Process Data Sharing</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/tag/v1.0.1.1" target="_blank" rel="noopener noreferrer">v1.0.1.1</a></td> +<td><a href="https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/tag/v1.0.1.1" target="_blank" rel="noopener noreferrer">v1.0.1.1</a></td> +</tr> +<tr> +<td><a href="https://github.com/num-codex/codex-processes-ap1/releases" target="_blank" rel="noopener noreferrer">NUM-RDP</a></td> +<td><a href="https://github.com/num-codex/codex-processes-ap1/releases/tag/v1.1.0.0" target="_blank" rel="noopener noreferrer">v1.1.0.0</a></td> +<td><a href="https://github.com/num-codex/codex-processes-ap1/releases/tag/v1.1.0.0" target="_blank" rel="noopener noreferrer">v1.1.0.0</a></td> +</tr> +</tbody> +</table> +<ul> +<li>Explore and install Process Plugins in the Marketplace. Details on each plugin are available <a href="https://hub.dsf.dev/" target="_blank" rel="noopener noreferrer">here</a>.</li> +<li>Deploying the process plugin to the DSF involves copy the process jar-file and configuring environment variable for the business process engine (BPE).</li> +</ul> +<h3 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h3> +<ul> +<li>A DSF installation of version 1.3.x or higher. An installation guide can be found <a href="https://dsf.dev/stable/maintain/install.html" target="_blank" rel="noopener noreferrer">here</a>.</li> +</ul> +<h3 id="deployment" tabindex="-1"><a class="header-anchor" href="#deployment"><span>Deployment</span></a></h3> +<ul> +<li>Add the process jar-file to the DSF BPE folder <code v-pre>/opt/bpe/process</code>:</li> +</ul> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>wget (your jar-file download link)</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>For example:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span> wget https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/download/v1.0.0.1/mii-process-data-sharing-1.0.0.1.jar</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul> +<li>Make sure the process is readable by the bpe user or group, for example by executing:</li> +</ul> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo chmod 440 (your jar-file name.jar)</span></span> +<span class="line"><span>sudo chown root:bpe (your jar-file name.jar)</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>For example:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo chmod 440 mii-process-data-sharing-1.0.0.1.jar</span></span> +<span class="line"><span>sudo chown root:bpe mii-process-data-sharing-1.0.0.1.jar</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul> +<li>Modify the process exclude config in <code v-pre>/opt/bpe/docker-compose.yml</code></li> +<li><strong>Reminder:</strong> Update/verify required configurations in <code v-pre>docker-compose.yml</code></li> +</ul> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.js new file mode 100644 index 000000000..5226db8de --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/install.html\",\"title\":\"Install DSF 1.5.2\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Install DSF 1.5.2\",\"icon\":\"install\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Prerequisites\",\"slug\":\"prerequisites\",\"link\":\"#prerequisites\",\"children\":[{\"level\":3,\"title\":\"Virtual Machines\",\"slug\":\"virtual-machines\",\"link\":\"#virtual-machines\",\"children\":[]},{\"level\":3,\"title\":\"Docker / Docker-Compose\",\"slug\":\"docker-docker-compose\",\"link\":\"#docker-docker-compose\",\"children\":[]},{\"level\":3,\"title\":\"Client/Server Certificates\",\"slug\":\"client-server-certificates\",\"link\":\"#client-server-certificates\",\"children\":[]},{\"level\":3,\"title\":\"Network setup / Network access\",\"slug\":\"network-setup-network-access\",\"link\":\"#network-setup-network-access\",\"children\":[]}]},{\"level\":2,\"title\":\"Setup\",\"slug\":\"setup\",\"link\":\"#setup\",\"children\":[{\"level\":3,\"title\":\"Prepare Certificates\",\"slug\":\"prepare-certificates\",\"link\":\"#prepare-certificates\",\"children\":[]},{\"level\":3,\"title\":\"DSF FHIR Server\",\"slug\":\"dsf-fhir-server\",\"link\":\"#dsf-fhir-server\",\"children\":[]},{\"level\":3,\"title\":\"DSF BPE Server\",\"slug\":\"dsf-bpe-server\",\"link\":\"#dsf-bpe-server\",\"children\":[]},{\"level\":3,\"title\":\"Logs\",\"slug\":\"logs\",\"link\":\"#logs\",\"children\":[]},{\"level\":3,\"title\":\"On-Boarding\",\"slug\":\"on-boarding\",\"link\":\"#on-boarding\",\"children\":[]}]}],\"readingTime\":{\"minutes\":5.76,\"words\":1729},\"filePathRelative\":\"release/archive/v1.5.2/maintain/install.md\",\"excerpt\":\"<p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p>\\n<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Unified installation manual</p>\\n<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.vue new file mode 100644 index 000000000..bfe3d09aa --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/install.html.vue @@ -0,0 +1,329 @@ +<template><div><p>In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Unified installation manual</p> +<p>The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.</p> +</div> +<h2 id="prerequisites" tabindex="-1"><a class="header-anchor" href="#prerequisites"><span>Prerequisites</span></a></h2> +<h3 id="virtual-machines" tabindex="-1"><a class="header-anchor" href="#virtual-machines"><span>Virtual Machines</span></a></h3> +<ul> +<li>DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +<li>DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD</li> +</ul> +<h3 id="docker-docker-compose" tabindex="-1"><a class="header-anchor" href="#docker-docker-compose"><span>Docker / Docker-Compose</span></a></h3> +<p>Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see <a href="https://docs.docker.com/engine/install" target="_blank" rel="noopener noreferrer">https://docs.docker.com/engine/install</a>.</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release</span></span> +<span class="line"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span></span> +<span class="line"><span>echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</span></span> +<span class="line"><span>sudo apt-get update</span></span> +<span class="line"><span>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span></span> +<span class="line"><span>sudo systemctl enable docker.service</span></span> +<span class="line"><span>sudo systemctl enable containerd.service</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The current version of docker compose is installed with the current docker version.</p> +<h3 id="client-server-certificates" tabindex="-1"><a class="header-anchor" href="#client-server-certificates"><span>Client/Server Certificates</span></a></h3> +<p>Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:</p> +<ul> +<li>Certificate <em>A</em>: Server Certificate - <code v-pre>TLS Web Server Authentication</code> (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)</li> +<li>Certificate <em>B</em>: Client Certificate - <code v-pre>TLS Web Client Authentication</code> (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)</li> +</ul> +<p>If you use GÉANT TCS certificates, then they are configured by default with the necessary <em>X509v3 Extended Key Usage</em>s: <code v-pre>TLS Web Server Authentication, TLS Web Client Authentication</code>.</p> +<h3 id="network-setup-network-access" tabindex="-1"><a class="header-anchor" href="#network-setup-network-access"><span>Network setup / Network access</span></a></h3> +<ul> +<li>The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.</li> +<li>The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.</li> +</ul> +<p>Here is a quick overview of the expected network setup.</p> +<table> +<thead> +<tr> +<th>Source</th> +<th>Target</th> +<th>Port</th> +<th>Protocol</th> +</tr> +</thead> +<tbody> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https, wss</td> +</tr> +<tr> +<td>DSF BPE (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (local)</td> +<td>DSF FHIR (other DSF communication partners)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +<tr> +<td>DSF BPE (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https</td> +</tr> +<tr> +<td>DSF FHIR (other DSF communication partners)</td> +<td>DSF FHIR (local)</td> +<td>443</td> +<td>https (HTTP HEAD only)</td> +</tr> +</tbody> +</table> +<p>Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, <a href="http://simplifier.net" target="_blank" rel="noopener noreferrer">simplifier.net</a> or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.</p> +<h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup"><span>Setup</span></a></h2> +<h3 id="prepare-certificates" tabindex="-1"><a class="header-anchor" href="#prepare-certificates"><span>Prepare Certificates</span></a></h3> +<ol> +<li> +<p>Server Certificate (certificate <em>A</em>)<br> +<em>This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>ssl_certificate_file.pem</code></li> +<li>Store unencrypted, PEM encoded private-key as <code v-pre>ssl_certificate_key_file.pem</code></li> +</ul> +</li> +<li> +<p>Client Certificate (Certificate <em>B</em>)<br> +<em>This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)</em></p> +<ul> +<li>Store PEM encoded certificate as <code v-pre>client_certificate.pem</code></li> +<li>Store encrypted or not encrypted, PEM encoded private-key as <code v-pre>client_certificate_private_key.pem</code></li> +</ul> +</li> +</ol> +<h3 id="dsf-fhir-server" tabindex="-1"><a class="header-anchor" href="#dsf-fhir-server"><span>DSF FHIR Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2101 fhir</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and unpack the prepared DSF FHIR server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_fhir_1_5_2.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_fhir_1_5_2.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/fhir</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>fhir</code> system user or group can write into the following folder</p> +<ul> +<li><code v-pre>/opt/fhir/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the server certificate (certificate <em>A</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</li> +<li>ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/fhir/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440, chown: fhir:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/fhir/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L39: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L141: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L142: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +<div class="hint-container tip"> +<p class="hint-container-title">How to chmod / chown</p> +<p>For the example <em>ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)</em> you must:</p> +<ol> +<li>Set the file content as requested</li> +<li>Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):<br> +<code v-pre>chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +<li>Change the owner of the file to the user <code v-pre>fhir</code> and the group the file belongs to to <code v-pre>docker</code>:<br> +<code v-pre>chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem</code></li> +</ol> +</div> +</li> +<li> +<p>Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by <code v-pre>DFN-Verein Global Issuing CA</code></p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L114: ssl_certificate_chain_file.pem:</span></span> +<span class="line"><span>L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/fhir/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/fhir/secrets/db_user_permanent_delete.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> proxy -> environment:</strong> +<ul> +<li><strong>HTTPS_SERVER_NAME_PORT</strong>: <em>TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443</em><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>foo.bar.de:443</code></li> +<li>For additional environment variables, see <a href="fhir-reverse-proxy/configuration">DSF configuration parameters - FHIR Reverse Proxy</a></li> +</ul> +</li> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE</strong>: <code v-pre>todo.organization.com</code><br> +Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. <code v-pre>hs-heilbronn.de</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT</strong>: <code v-pre>f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f</code><br> +Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate <em>B</em>)<br> +Use <code v-pre>certtool --fingerprint --hash=sha512 --infile=client_certificate.pem</code> to generate the hash.</p> +</li> +<li> +<p><strong>DEV_DSF_FHIR_SERVER_ROLECONFIG</strong>: <code v-pre>|</code><br> +(Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server <a href="fhir/access-control">Access Control</a> page.</p> +</li> +<li> +<p>For additional environment variables, see FHIR server <a href="fhir/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF FHIR Server<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +</ol> +<h3 id="dsf-bpe-server" tabindex="-1"><a class="header-anchor" href="#dsf-bpe-server"><span>DSF BPE Server</span></a></h3> +<ol> +<li> +<p>Add Group/User<br> +Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sudo groupadd --gid 2202 bpe</span></span> +<span class="line"><span>sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li> +<li> +<p>Download and Extract Config Files<br> +Download and extract prepared DSF BPE server config files and folder structure:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>cd /opt</span></span> +<span class="line"><span>wget https://dsf.dev/download/dsf_bpe_1_5_2.tar.gz</span></span> +<span class="line"><span>sudo tar --same-owner -zxvf dsf_bpe_1_5_2.tar.gz</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><em>The <code v-pre>tar</code> command will unpack the config files at <code v-pre>/opt/bpe</code> assuming you changed into the <code v-pre>/opt</code> directory.</em></p> +</li> +<li> +<p>Verify that the <code v-pre>bpe</code> system user or group can write into the following folders</p> +<ul> +<li><code v-pre>/opt/bpe/log</code></li> +</ul> +</li> +<li> +<p>Add certificates and keys</p> +<ul> +<li>Add the client certificate (Certificate <em>B</em>) and the corresponding private-key to <strong>/opt/bpe/secrets/</strong> +<ul> +<li>client_certificate.pem (chmod: 440 chown: bpe:docker)</li> +<li>client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)</li> +</ul> +</li> +<li>If the private key is encrypted, add a password file with the password as the only content to <strong>/opt/bpe/secrets/client_certificate_private_key.pem.password</strong></li> +<li>If the private key is not encrypted, remove the corresponding docker secret lines from the <code v-pre>docker-compose.yml</code> file<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>L13: - app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password</span></span> +<span class="line"><span>...</span></span> +<span class="line"><span>L89: app_client_certificate_private_key.pem.password:</span></span> +<span class="line"><span>L90: file: ./secrets/client_certificate_private_key.pem.password</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li> +</ul> +</li> +<li> +<p>Modify database passwords</p> +<ul> +<li><strong>/opt/bpe/secrets/db_liquibase.password</strong> +<ul> +<li>Generate a random password (min. 32 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +<li><strong>/opt/bpe/secrets/db_user_camunda.password</strong> +<ul> +<li>Generate a random password (min. 16 characters recommended) and replace the content of the file.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Modify the docker-compose.yml file and set environment variables to the appropriate values</p> +<ul> +<li><strong>services -> app -> environment:</strong> +<ul> +<li> +<p><strong>DEV_DSF_BPE_FHIR_SERVER_BASE_URL</strong>: <code v-pre>https://dsf.todo.organization.com/fhir</code><br> +Set your FHIR servers external FQDN, e.g. <code v-pre>foo.bar.de</code> -> <code v-pre>https://foo.bar.de/fhir</code></p> +</li> +<li> +<p>For additional environment variables, see the BPE server <a href="bpe/configuration">Configuration Parameters</a> page.</p> +</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Start the DSF BPE Server (without process plugins)<br> +Start using: <code v-pre>docker compose up -d && docker compose logs -f</code> (Ctrl-C will close log, but not stop container)</p> +</li> +<li> +<p>Verify DSF BPE Startup</p> +<ul> +<li>Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.</li> +<li>Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.</li> +</ul> +<p>If you need to debug the TLS connection to your DSF FHIR server use for example:<br> +<code v-pre>docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443</code><br> +The command above should print the server certificate of your DSF FHIR server (certificate <em>A</em>) and end with a message like <code v-pre>[...]tlsv13 alert certificate required[...]</code></p> +</li> +</ol> +<h3 id="logs" tabindex="-1"><a class="header-anchor" href="#logs"><span>Logs</span></a></h3> +<p>By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use <code v-pre>docker compose logs -f</code> in <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from <code v-pre>/opt/fhir/log</code> and <code v-pre>/opt/bpe/log</code> in your support request.</p> +<p>On a successful BPE start, you should see the following entries in your BPE log:</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID1</span></span> +<span class="line"><span>INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID2</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="on-boarding" tabindex="-1"><a class="header-anchor" href="#on-boarding"><span>On-Boarding</span></a></h3> +<p>Please visit the on boarding website of your network for more information.</p> +<div class="hint-container tip"> +<p class="hint-container-title">Ideas for improvement?</p> +<p>Have you found an error or is something unclear to you? Then please feel free to write to us at <a href="mailto:dsf-gecko@hs-heilbronn.de">gth-gecko@hs-heilbronn.de</a>. Thank you very much!</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.js new file mode 100644 index 000000000..f887feed5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/upgrade-from-0.html\",\"title\":\"Upgrade from DSF 0.9.x\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 0.9.x\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":1.12,\"words\":337},\"filePathRelative\":\"release/archive/v1.5.2/maintain/upgrade-from-0.md\",\"excerpt\":\"<p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p>\\n<div class=\\\"hint-container caution\\\">\\n<p class=\\\"hint-container-title\\\">Do not use your 0.9.x configuration as starting point</p>\\n<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p>\\n<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.vue new file mode 100644 index 000000000..3723656b6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-0.html.vue @@ -0,0 +1,27 @@ +<template><div><p>A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.</p> +<div class="hint-container caution"> +<p class="hint-container-title">Do not use your 0.9.x configuration as starting point</p> +<p>There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.</p> +<p><strong>Please</strong> use the new installation manual to perform a new installation and use the old setup only for reference.</p> +</div> +<p>Instead, please perform the following steps:</p> +<ol> +<li>Shut down your DSF instances (DSF FHIR Server and DSF BPE).</li> +<li>Backup your DSF instances (e.g. by moving the folders <code v-pre>/opt/bpe</code> and <code v-pre>/opt/fhir</code> to <code v-pre>/opt/bpe_0.9</code> and <code v-pre>/opt/fhir_0.9</code>)</li> +<li>Install the new DSF according to the <a href="install">instructions</a>.</li> +<li>You can copy <strong>your</strong> certificates (server- and client certificates) to your new installation. Please do <strong>not</strong> copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).</li> +<li>Configure your processes according to the <strong>new</strong> process plugin <a href="./install-plugins">documentation</a>. You can use your <strong>test</strong> environment configuration and your old production setup configuration for reference. Please ensure to use the <strong>new</strong> configuration parameter names, as many of them will have new prefixes (like <code v-pre>DEV_DSF</code> instead of <code v-pre>ORG_HIGHMED</code>).</li> +<li>If you perform the installation before the change of the according environment, you can start the old instances again (out of the <code v-pre>/opt/fhir_0.9</code> and <code v-pre>/opt/bpe_0.9</code> directories).</li> +<li>If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.</li> +</ol> +<div class="hint-container tip"> +<p class="hint-container-title">New process plugins</p> +<p>Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.</p> +</div> +<div class="hint-container tip"> +<p class="hint-container-title">Use your old virtual machine</p> +<p>We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.</p> +</div> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.js new file mode 100644 index 000000000..2d4fef252 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/maintain/upgrade-from-1.html\",\"title\":\"Upgrade from DSF 1.5.1\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Upgrade from DSF 1.5.1\",\"icon\":\"update\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Modify DSF FHIR Server Setup\",\"slug\":\"modify-dsf-fhir-server-setup\",\"link\":\"#modify-dsf-fhir-server-setup\",\"children\":[]},{\"level\":2,\"title\":\"Modify DSF BPE Server Setup\",\"slug\":\"modify-dsf-bpe-server-setup\",\"link\":\"#modify-dsf-bpe-server-setup\",\"children\":[]}],\"readingTime\":{\"minutes\":1.07,\"words\":322},\"filePathRelative\":\"release/archive/v1.5.2/maintain/upgrade-from-1.md\",\"excerpt\":\"<p>Upgrading the DSF from 1.5.1 to 1.5.2 involves modifying the docker-compose.yml files and recreating the containers.</p>\\n<div class=\\\"hint-container warning\\\">\\n<p class=\\\"hint-container-title\\\">Update to DSF 1.2.0 first</p>\\n<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href=\\\"/v1.2.0/maintain/upgrade-from-1\\\">DSF 1.2.0 first</a>.</p>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.vue new file mode 100644 index 000000000..69949bdca --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/maintain/upgrade-from-1.html.vue @@ -0,0 +1,78 @@ +<template><div><p>Upgrading the DSF from 1.5.1 to 1.5.2 involves modifying the docker-compose.yml files and recreating the containers.</p> +<div class="hint-container warning"> +<p class="hint-container-title">Update to DSF 1.2.0 first</p> +<p>When upgrading from 1.0.0 or 1.1.0 it is important to migrate to <a href="/v1.2.0/maintain/upgrade-from-1">DSF 1.2.0 first</a>.</p> +</div> +<h2 id="modify-dsf-fhir-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-fhir-server-setup"><span>Modify DSF FHIR Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/fhir</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.2_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.2.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> proxy:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir_proxy:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir_proxy:1.5.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/fhir:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/fhir:1.5.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li>Upgrade the DSF FHIR containers<br> +From <code v-pre>/opt/fhir</code> execute<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +</ol> +<h2 id="modify-dsf-bpe-server-setup" tabindex="-1"><a class="header-anchor" href="#modify-dsf-bpe-server-setup"><span>Modify DSF BPE Server Setup</span></a></h2> +<ol> +<li> +<p>Preparation / Backup</p> +<ul> +<li>We recommend to create a backup of the <code v-pre>/opt/bpe</code> directory before proceeding with the upgrade.<br> +For example using: <code v-pre>sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.2_upgrade</code></li> +</ul> +</li> +<li> +<p>Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.2.</p> +</li> +</ol> +<div class="language-diff line-numbers-mode" data-highlighter="shiki" data-ext="diff" data-title="diff" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">version: '3.8'</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">services:</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> app:</span></span> +<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">- image: ghcr.io/datasharingframework/bpe:1.5.1</span></span> +<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">+ image: ghcr.io/datasharingframework/bpe:1.5.2</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> restart: on-failure</span></span> +<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"> +<li> +<p>Upgrade the DSF BPE containers<br> +From <code v-pre>/opt/bpe</code> execute</p> +<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre v-pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>docker compose up -d && docker compose logs -f</span></span></code></pre> +<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li> +<li> +<p>Verify your upgrade:</p> +<ul> +<li>Verify the DSF FHIR server is running in version 1.5.2. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.2, [...]</code></li> +<li>Verify the DSF FHIR server started without errors</li> +<li>Verify the DSF FHIR server is accessible via https, for example by browsing to <a href="https://your-dsf-endpoint.de/fhir/" target="_blank" rel="noopener noreferrer">https://your-dsf-endpoint.de/fhir/</a> (authentication with your client-certificate)</li> +<li>Verify the DSF BPE server is running in version 1.5.2. The log should contain a message:<br> +<code v-pre>INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.2, [...]</code></li> +<li>Verify the DSF BPE server started without errors</li> +<li>Verify your install with a ping/pong test</li> +</ul> +</li> +</ol> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.js b/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.js new file mode 100644 index 000000000..4406d4888 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.vue" +const data = JSON.parse("{\"path\":\"/release/archive/v1.5.2/process-plugins-advanced.html\",\"title\":\"Process Plugins Advanced\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Process Plugins Advanced\",\"icon\":\"info\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.02,\"words\":6},\"filePathRelative\":\"release/archive/v1.5.2/process-plugins-advanced.md\",\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.vue b/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.vue new file mode 100644 index 000000000..162ab33a5 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/archive/v1.5.2/process-plugins-advanced.html.vue @@ -0,0 +1,3 @@ +<template><div></div></template> + + diff --git a/src/.vuepress/.temp/pages/release/index.html.js b/src/.vuepress/.temp/pages/release/index.html.js new file mode 100644 index 000000000..b26b26dbf --- /dev/null +++ b/src/.vuepress/.temp/pages/release/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/release/index.html.vue" +const data = JSON.parse("{\"path\":\"/release/\",\"title\":\"Release\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Release\",\"article\":false,\"feed\":false,\"sitemap\":false,\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":null,\"excerpt\":\"\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/release/index.html.vue b/src/.vuepress/.temp/pages/release/index.html.vue new file mode 100644 index 000000000..33da939f6 --- /dev/null +++ b/src/.vuepress/.temp/pages/release/index.html.vue @@ -0,0 +1,3 @@ +<template><div><Catalog/></div></template> + + diff --git a/src/.vuepress/.temp/pages/research/index.html.js b/src/.vuepress/.temp/pages/research/index.html.js new file mode 100644 index 000000000..1fe8c97a7 --- /dev/null +++ b/src/.vuepress/.temp/pages/research/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/research/index.html.vue" +const data = JSON.parse("{\"path\":\"/research/\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0,\"words\":1},\"filePathRelative\":\"research/readme.md\",\"excerpt\":\"<p>Research</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/research/index.html.vue b/src/.vuepress/.temp/pages/research/index.html.vue new file mode 100644 index 000000000..1470a9607 --- /dev/null +++ b/src/.vuepress/.temp/pages/research/index.html.vue @@ -0,0 +1,4 @@ +<template><div><p>Research</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/security/index.html.js b/src/.vuepress/.temp/pages/security/index.html.js new file mode 100644 index 000000000..c1f89fd2d --- /dev/null +++ b/src/.vuepress/.temp/pages/security/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/security/index.html.vue" +const data = JSON.parse("{\"path\":\"/security/\",\"title\":\"Security\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Security\",\"icon\":\"safe\",\"gitInclude\":[]},\"headers\":[{\"level\":2,\"title\":\"Security vulnerability disclosure policy\",\"slug\":\"security-vulnerability-disclosure-policy\",\"link\":\"#security-vulnerability-disclosure-policy\",\"children\":[{\"level\":3,\"title\":\"Our commitment to security\",\"slug\":\"our-commitment-to-security\",\"link\":\"#our-commitment-to-security\",\"children\":[]},{\"level\":3,\"title\":\"Responsible disclosure\",\"slug\":\"responsible-disclosure\",\"link\":\"#responsible-disclosure\",\"children\":[]},{\"level\":3,\"title\":\"How to Report a Vulnerability\",\"slug\":\"how-to-report-a-vulnerability\",\"link\":\"#how-to-report-a-vulnerability\",\"children\":[]},{\"level\":3,\"title\":\"Our promise\",\"slug\":\"our-promise\",\"link\":\"#our-promise\",\"children\":[]},{\"level\":3,\"title\":\"Legal Protection\",\"slug\":\"legal-protection\",\"link\":\"#legal-protection\",\"children\":[]},{\"level\":3,\"title\":\"Questions?\",\"slug\":\"questions\",\"link\":\"#questions\",\"children\":[]}]}],\"readingTime\":{\"minutes\":1.97,\"words\":590},\"filePathRelative\":\"security/readme.md\",\"excerpt\":\"<p>We take security of the DSF, its process plugins, services and tools we operate very seriously.</p>\\n<p>We describe the security mechanisms used by the DSF to implement secure communication on the pages <a href=\\\"https://dsf.dev/intro/info/architecture.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Architecture</a>, <a href=\\\"https://dsf.dev/intro/info/security.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Security</a> and <a href=\\\"https://dsf.dev/intro/info/allowList.html\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">Allow List</a>.</p>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/security/index.html.vue b/src/.vuepress/.temp/pages/security/index.html.vue new file mode 100644 index 000000000..c16480c5f --- /dev/null +++ b/src/.vuepress/.temp/pages/security/index.html.vue @@ -0,0 +1,33 @@ +<template><div><p>We take security of the DSF, its process plugins, services and tools we operate very seriously.</p> +<p>We describe the security mechanisms used by the DSF to implement secure communication on the pages <a href="https://dsf.dev/intro/info/architecture.html" target="_blank" rel="noopener noreferrer">Architecture</a>, <a href="https://dsf.dev/intro/info/security.html" target="_blank" rel="noopener noreferrer">Security</a> and <a href="https://dsf.dev/intro/info/allowList.html" target="_blank" rel="noopener noreferrer">Allow List</a>.</p> +<p>To ensure a high level of security, you should always install the latest DSF version and use the latest versions of the process plugins. Use the <a href="https://dsf.dev/stable/maintain/install.html" target="_blank" rel="noopener noreferrer">instructions to install</a> the latest version of the DSF or <a href="https://dsf.dev/stable/maintain/upgrade-from-1.html" target="_blank" rel="noopener noreferrer">to upgrade</a> on the latest version. The instructions described there implement the security configuration recommended by us.</p> +<p>It is also important that you ensure a secure operating environment in which you verify firewall configurations, keep the operating systems on which the DSF is running up to date and harden it according to the latest state of the art.</p> +<h2 id="security-vulnerability-disclosure-policy" tabindex="-1"><a class="header-anchor" href="#security-vulnerability-disclosure-policy"><span>Security vulnerability disclosure policy</span></a></h2> +<h3 id="our-commitment-to-security" tabindex="-1"><a class="header-anchor" href="#our-commitment-to-security"><span>Our commitment to security</span></a></h3> +<p>We as the DSF development team take security of our software, services and data very seriously. We understand that despite our best efforts, vulnerabilities can exist. To address this, we encourage responsible reporting of any security vulnerabilities discovered in our software and systems.</p> +<h3 id="responsible-disclosure" tabindex="-1"><a class="header-anchor" href="#responsible-disclosure"><span>Responsible disclosure</span></a></h3> +<p>We kindly ask security researchers and the general public to follow the principles of <em>Coordinated Vulnerability Disclosure (CVD)</em> or <em>Responsible Disclosure</em> when reporting vulnerabilities to us. This approach helps us to mitigate potential risks and protect our users' data effectively.</p> +<h3 id="how-to-report-a-vulnerability" tabindex="-1"><a class="header-anchor" href="#how-to-report-a-vulnerability"><span>How to Report a Vulnerability</span></a></h3> +<p>If you believe you have found a security vulnerability in our system, please email us at <strong><a href="mailto:dsf-security@hs-heilbronn.de" target="_blank" rel="noopener noreferrer">dsf-security@hs-heilbronn.de</a></strong>. If you want to use end-to-end-encryption, you can send us mails using s-mime with the certificate chain provided <a href="https://github.com/datasharingframework/dsf/blob/main/SECURITY_CERTIFICATE.pem" target="_blank" rel="noopener noreferrer">here</a>. We kindly request the following:</p> +<ul> +<li>Provide a detailed description of the vulnerability, including if possible the potential impact and how it can be exploited.</li> +<li>Include steps to reproduce the vulnerability or proof-of-concept code, if possible.</li> +<li>Avoid accessing or modifying user data without permission, and do not exploit a security issue for any reason other than testing.</li> +<li>Maintain confidentiality and do not publicly disclose the vulnerability, until we have had the opportunity to investigate and address it.</li> +</ul> +<p>Please do not file an issue on a security-related topic and use the e-mail address provided. You can verify the address both in the <a href="https://github.com/datasharingframework/dsf/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer">application repository</a> and at the homepage (this page).</p> +<h3 id="our-promise" tabindex="-1"><a class="header-anchor" href="#our-promise"><span>Our promise</span></a></h3> +<ul> +<li><strong>Acknowledgement</strong>: We usually will acknowledge receipt of your vulnerability report within 48 hours.</li> +<li><strong>Investigation</strong>: Our security team will investigate the issue and work diligently to verify and reproduce the vulnerability.</li> +<li><strong>Communication</strong>: We will keep you informed of our progress as we work to resolve the issue.</li> +<li><strong>Resolution</strong>: We will strive to resolve security issues in a timely manner and release updates, patches, or remediations as needed.</li> +<li><strong>Recognition</strong>: We value your effort in making our systems more secure and will recognize your contribution, if desired, once the vulnerability is resolved.</li> +</ul> +<h3 id="legal-protection" tabindex="-1"><a class="header-anchor" href="#legal-protection"><span>Legal Protection</span></a></h3> +<p>We promise not to initiate legal action against individuals who report vulnerabilities responsibly in accordance with this policy. This includes not suing for accidental access to data or reporting in good faith.</p> +<h3 id="questions" tabindex="-1"><a class="header-anchor" href="#questions"><span>Questions?</span></a></h3> +<p>If you have any questions about this policy or security of the Data Sharing Framework, the services and tools we provide, please contact us at <strong><a href="mailto:dsf-security@hs-heilbronn.de" target="_blank" rel="noopener noreferrer">dsf-security@hs-heilbronn.de</a></strong>. You can send us encrypted e-mails using s-mime. You can find the certificate chain <a href="https://github.com/datasharingframework/dsf/blob/main/SECURITY_CERTIFICATE.pem" target="_blank" rel="noopener noreferrer">here</a>.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/sprechstunde/index.html.js b/src/.vuepress/.temp/pages/sprechstunde/index.html.js new file mode 100644 index 000000000..859f9daa7 --- /dev/null +++ b/src/.vuepress/.temp/pages/sprechstunde/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/sprechstunde/index.html.vue" +const data = JSON.parse("{\"path\":\"/sprechstunde/\",\"title\":\"Sprechstunde\",\"lang\":\"en-US\",\"frontmatter\":{\"title\":\"Sprechstunde\",\"icon\":\"guide\",\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.12,\"words\":35},\"filePathRelative\":\"sprechstunde/index.md\",\"excerpt\":\"<div class=\\\"hint-container tip\\\">\\n<p class=\\\"hint-container-title\\\">Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+</p>\\n<ul>\\n<li>Montags, 13:00-14:00 Uhr</li>\\n<li>Ort: <a href=\\\"https://dsf.dev/sprechstunde\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">https://dsf.dev/sprechstunde</a></li>\\n</ul>\\n</div>\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/sprechstunde/index.html.vue b/src/.vuepress/.temp/pages/sprechstunde/index.html.vue new file mode 100644 index 000000000..2d4f7607b --- /dev/null +++ b/src/.vuepress/.temp/pages/sprechstunde/index.html.vue @@ -0,0 +1,11 @@ +<template><div><div class="hint-container tip"> +<p class="hint-container-title">Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+</p> +<ul> +<li>Montags, 13:00-14:00 Uhr</li> +<li>Ort: <a href="https://dsf.dev/sprechstunde" target="_blank" rel="noopener noreferrer">https://dsf.dev/sprechstunde</a></li> +</ul> +</div> +<p>Klicken Sie <a href="https://lecture.senfcall.de/sim-ock-1vk-l8o" target="_blank" rel="noopener noreferrer">hier</a>, um der Sprechstunde beizutreten.</p> +</div></template> + + diff --git a/src/.vuepress/.temp/pages/use-cases/index.html.js b/src/.vuepress/.temp/pages/use-cases/index.html.js new file mode 100644 index 000000000..a484db70d --- /dev/null +++ b/src/.vuepress/.temp/pages/use-cases/index.html.js @@ -0,0 +1,16 @@ +import comp from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/.temp/pages/use-cases/index.html.vue" +const data = JSON.parse("{\"path\":\"/use-cases/\",\"title\":\"\",\"lang\":\"en-US\",\"frontmatter\":{\"gitInclude\":[]},\"headers\":[],\"readingTime\":{\"minutes\":0.01,\"words\":2},\"filePathRelative\":\"use-cases/readme.md\",\"excerpt\":\"<p>Use-Cases</p>\\n\"}") +export { comp, data } + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updatePageData) { + __VUE_HMR_RUNTIME__.updatePageData(data) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ data }) => { + __VUE_HMR_RUNTIME__.updatePageData(data) + }) +} diff --git a/src/.vuepress/.temp/pages/use-cases/index.html.vue b/src/.vuepress/.temp/pages/use-cases/index.html.vue new file mode 100644 index 000000000..4964592a2 --- /dev/null +++ b/src/.vuepress/.temp/pages/use-cases/index.html.vue @@ -0,0 +1,4 @@ +<template><div><p>Use-Cases</p> +</div></template> + + diff --git a/src/.vuepress/.temp/sass-palette/hope-config.scss b/src/.vuepress/.temp/sass-palette/hope-config.scss new file mode 100644 index 000000000..e389df5a6 --- /dev/null +++ b/src/.vuepress/.temp/sass-palette/hope-config.scss @@ -0,0 +1,5 @@ +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/templates/palette/palette.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/templates/palette/config.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/styles/palette.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/styles/config.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/templates/palette/generator.scss"; diff --git a/src/.vuepress/.temp/sass-palette/hope-inject.scss b/src/.vuepress/.temp/sass-palette/hope-inject.scss new file mode 100644 index 000000000..845943844 --- /dev/null +++ b/src/.vuepress/.temp/sass-palette/hope-inject.scss @@ -0,0 +1,13 @@ +@use "sass:meta"; + +@use "@sass-palette/helper"; +@use "@sass-palette/hope-palette"; + +$palette-variables: meta.module-variables("hope-palette"); + + +@if meta.global-variable-exists("dark-selector", $module: "hope-config") { + @include helper.inject($palette-variables, hope-config.$dark-selector); +} @else { + @include helper.inject($palette-variables); +} diff --git a/src/.vuepress/.temp/sass-palette/hope-palette.scss b/src/.vuepress/.temp/sass-palette/hope-palette.scss new file mode 100644 index 000000000..885ba3263 --- /dev/null +++ b/src/.vuepress/.temp/sass-palette/hope-palette.scss @@ -0,0 +1,3 @@ +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/templates/palette/palette.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/styles/palette.scss"; +@import "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/templates/palette/generator.scss"; diff --git a/src/.vuepress/.temp/sass-palette/hope-style.scss b/src/.vuepress/.temp/sass-palette/hope-style.scss new file mode 100644 index 000000000..ead867879 --- /dev/null +++ b/src/.vuepress/.temp/sass-palette/hope-style.scss @@ -0,0 +1 @@ +@forward "file:///D:/Studium AI/DSF/Repo/datasharingframework.github.io/src/.vuepress/styles/index.scss"; diff --git a/src/.vuepress/.temp/sass-palette/load-hope.js b/src/.vuepress/.temp/sass-palette/load-hope.js new file mode 100644 index 000000000..3310b8034 --- /dev/null +++ b/src/.vuepress/.temp/sass-palette/load-hope.js @@ -0,0 +1 @@ +import "@sass-palette/hope-inject"; diff --git a/src/.vuepress/.temp/search-pro/index.js b/src/.vuepress/.temp/search-pro/index.js new file mode 100644 index 000000000..04fae0f50 --- /dev/null +++ b/src/.vuepress/.temp/search-pro/index.js @@ -0,0 +1 @@ +export default {"/": () => import('./root.js')} \ No newline at end of file diff --git a/src/.vuepress/.temp/search-pro/root.js b/src/.vuepress/.temp/search-pro/root.js new file mode 100644 index 000000000..6121c4f05 --- /dev/null +++ b/src/.vuepress/.temp/search-pro/root.js @@ -0,0 +1 @@ +export default "{\"documentCount\":2319,\"nextId\":2319,\"documentIds\":{\"0\":\"0\",\"1\":\"0#rolf-hansen-memorial-award-2023-goes-to-hauke-hund\",\"2\":\"0#feel-free-to-contact-us-via-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible\",\"3\":\"1\",\"4\":\"1#e-mail\",\"5\":\"1#community\",\"6\":\"1#stay-up-to-date\",\"7\":\"1#contribute-code\",\"8\":\"1#share-your-experience-get-support\",\"9\":\"2\",\"10\":\"2#dsf-medical-informatics-structure-data-sharing-framework-community-2023-2026\",\"11\":\"2#development-of-the-dsf-in-the-highmed-consortium-contribution-heilbronn-university-and-heidelberg-university-2018-2022\",\"12\":\"3\",\"13\":\"3#heilbronn-university-of-applied-sciences-gecko-institute\",\"14\":\"3#university-of-heidelberg-institute-of-medical-informatics\",\"15\":\"3#university-of-leipzig-life-institute\",\"16\":\"4\",\"17\":\"4#overview\",\"18\":\"5\",\"19\":\"6\",\"20\":\"7\",\"21\":\"7#overview-of-dsf\",\"22\":\"7#key-features-and-benefits\",\"23\":\"7#distributed-data-sharing-processes\",\"24\":\"7#flexibility-with-data-standards\",\"25\":\"7#security-and-access-control\",\"26\":\"7#deployment-in-clinical-environments\",\"27\":\"7#getting-started-with-the-dsf\",\"28\":\"8\",\"29\":\"9\",\"30\":\"9#vorbereitung\",\"31\":\"9#netzwerkfreigaben\",\"32\":\"9#fhir-store\",\"33\":\"9#installationshinweise\",\"34\":\"9#dsf\",\"35\":\"9#prozessplugins\",\"36\":\"9#weitere-anwendungen\",\"37\":\"9#data-sharing-demodaten\",\"38\":\"10\",\"39\":\"10#publications\",\"40\":\"10#recorded-talks\",\"41\":\"10#gmds-conference-2022\",\"42\":\"10#gmds-conference-2020\",\"43\":\"11\",\"44\":\"11#overview\",\"45\":\"12\",\"46\":\"13\",\"47\":\"14\",\"48\":\"15\",\"49\":\"15#goal\",\"50\":\"15#allow-list-managment\",\"51\":\"15#feel-free-to-contact-us-via-e-mail-dsf-gecko-hs-heilbronn-de-and-we-will-take-care-of-your-request-as-soon-as-possible\",\"52\":\"16\",\"53\":\"16#dsf-fhir-server\",\"54\":\"16#business-process-engine-bpe\",\"55\":\"16#flexible-deployment\",\"56\":\"16#network-setup-additional-reverse-proxy-in-external-dmz\",\"57\":\"17\",\"58\":\"17#interoperability\",\"59\":\"17#hl7-fhir\",\"60\":\"17#bpmn\",\"61\":\"17#why-are-we-using-fhir-and-bpmn\",\"62\":\"18\",\"63\":\"19\",\"64\":\"19#additional-reverse-proxy-in-external-dmz\",\"65\":\"20\",\"66\":\"20#overview\",\"67\":\"20#bpmn-example\",\"68\":\"20#ping-pong-process\",\"69\":\"20#autostart-ping-process\",\"70\":\"20#ping-process\",\"71\":\"20#pong-process\",\"72\":\"21\",\"73\":\"21#basics-security\",\"74\":\"21#authentication\",\"75\":\"21#certificate-requests\",\"76\":\"21#fhir-endpoint\",\"77\":\"21#business-process-engine-server\",\"78\":\"22\",\"79\":\"23\",\"80\":\"23#abstract\",\"81\":\"23#topic\",\"82\":\"23#target-group\",\"83\":\"23#what-you-need\",\"84\":\"23#what-you-will-learn\",\"85\":\"24\",\"86\":\"25\",\"87\":\"26\",\"88\":\"26#overview\",\"89\":\"26#the-feasibility-process\",\"90\":\"26#technical-information\",\"91\":\"27\",\"92\":\"27#the-data-transfer-process\",\"93\":\"28\",\"94\":\"28#overview\",\"95\":\"29\",\"96\":\"29#security-vulnerability-disclosure-policy\",\"97\":\"29#our-commitment-to-security\",\"98\":\"29#responsible-disclosure\",\"99\":\"29#how-to-report-a-vulnerability\",\"100\":\"29#our-promise\",\"101\":\"29#legal-protection\",\"102\":\"29#questions\",\"103\":\"30\",\"104\":\"31\",\"105\":\"33\",\"106\":\"33#new-features\",\"107\":\"36\",\"108\":\"36#new-features\",\"109\":\"39\",\"110\":\"39#new-features\",\"111\":\"42\",\"112\":\"42#new-features\",\"113\":\"45\",\"114\":\"45#new-features\",\"115\":\"48\",\"116\":\"48#new-features\",\"117\":\"51\",\"118\":\"51#new-features\",\"119\":\"53\",\"120\":\"54\",\"121\":\"54#overview\",\"122\":\"55\",\"123\":\"57\",\"124\":\"57#new-features\",\"125\":\"59\",\"126\":\"59#overview\",\"127\":\"59#prerequisites\",\"128\":\"59#start-here\",\"129\":\"60\",\"130\":\"60#prerequisites\",\"131\":\"60#virtual-machines\",\"132\":\"60#docker-docker-compose\",\"133\":\"60#client-server-certificates\",\"134\":\"60#network-setup-network-access\",\"135\":\"60#setup\",\"136\":\"60#prepare-certificates\",\"137\":\"60#dsf-fhir-server\",\"138\":\"60#dsf-bpe-server\",\"139\":\"60#logs\",\"140\":\"60#on-boarding\",\"141\":\"61\",\"142\":\"61#overview\",\"143\":\"62\",\"144\":\"63\",\"145\":\"64\",\"146\":\"64#overview\",\"147\":\"65\",\"148\":\"66\",\"149\":\"66#overview\",\"150\":\"66#prerequisites\",\"151\":\"66#start-here\",\"152\":\"67\",\"153\":\"67#prerequisites\",\"154\":\"67#virtual-machines\",\"155\":\"67#docker-docker-compose\",\"156\":\"67#client-server-certificates\",\"157\":\"67#network-setup-network-access\",\"158\":\"67#setup\",\"159\":\"67#prepare-certificates\",\"160\":\"67#dsf-fhir-server\",\"161\":\"67#dsf-bpe-server\",\"162\":\"67#logs\",\"163\":\"67#on-boarding\",\"164\":\"68\",\"165\":\"68#overview\",\"166\":\"69\",\"167\":\"70\",\"168\":\"70#modify-dsf-fhir-server-setup\",\"169\":\"70#modify-dsf-bpe-server-setup\",\"170\":\"72\",\"171\":\"72#new-features\",\"172\":\"74\",\"173\":\"74#overview\",\"174\":\"74#prerequisites\",\"175\":\"74#start-here\",\"176\":\"75\",\"177\":\"75#prerequisites\",\"178\":\"75#virtual-machines\",\"179\":\"75#docker-docker-compose\",\"180\":\"75#client-server-certificates\",\"181\":\"75#network-setup-network-access\",\"182\":\"75#setup\",\"183\":\"75#prepare-certificates\",\"184\":\"75#dsf-fhir-server\",\"185\":\"75#dsf-bpe-server\",\"186\":\"75#logs\",\"187\":\"75#on-boarding\",\"188\":\"76\",\"189\":\"76#overview\",\"190\":\"77\",\"191\":\"78\",\"192\":\"78#modify-dsf-fhir-server-setup\",\"193\":\"78#modify-dsf-bpe-server-setup\",\"194\":\"79\",\"195\":\"80\",\"196\":\"80#overview\",\"197\":\"81\",\"198\":\"82\",\"199\":\"83\",\"200\":\"83#overview\",\"201\":\"84\",\"202\":\"86\",\"203\":\"86#new-features\",\"204\":\"88\",\"205\":\"88#overview\",\"206\":\"88#prerequisites\",\"207\":\"88#start-here\",\"208\":\"89\",\"209\":\"89#common-processes\",\"210\":\"89#mii-processes\",\"211\":\"89#num-processes\",\"212\":\"90\",\"213\":\"90#prerequisites\",\"214\":\"90#virtual-machines\",\"215\":\"90#docker-docker-compose\",\"216\":\"90#client-server-certificates\",\"217\":\"90#network-setup-network-access\",\"218\":\"90#setup\",\"219\":\"90#prepare-certificates\",\"220\":\"90#dsf-fhir-server\",\"221\":\"90#dsf-bpe-server\",\"222\":\"90#logs\",\"223\":\"90#on-boarding\",\"224\":\"91\",\"225\":\"91#overview\",\"226\":\"92\",\"227\":\"93\",\"228\":\"93#modify-dsf-fhir-server-setup\",\"229\":\"93#modify-dsf-bpe-server-setup\",\"230\":\"94\",\"231\":\"95\",\"232\":\"95#overview\",\"233\":\"96\",\"234\":\"97\",\"235\":\"97#overview\",\"236\":\"97#prerequisites\",\"237\":\"97#start-here\",\"238\":\"98\",\"239\":\"98#common-processes\",\"240\":\"98#mii-processes\",\"241\":\"98#num-processes\",\"242\":\"99\",\"243\":\"99#prerequisites\",\"244\":\"99#virtual-machines\",\"245\":\"99#docker-docker-compose\",\"246\":\"99#client-server-certificates\",\"247\":\"99#network-setup-network-access\",\"248\":\"99#setup\",\"249\":\"99#prepare-certificates\",\"250\":\"99#dsf-fhir-server\",\"251\":\"99#dsf-bpe-server\",\"252\":\"99#logs\",\"253\":\"99#on-boarding\",\"254\":\"100\",\"255\":\"100#overview\",\"256\":\"101\",\"257\":\"102\",\"258\":\"102#modify-dsf-fhir-server-setup\",\"259\":\"102#modify-dsf-bpe-server-setup\",\"260\":\"103\",\"261\":\"104\",\"262\":\"104#overview\",\"263\":\"105\",\"264\":\"106\",\"265\":\"106#overview\",\"266\":\"106#prerequisites\",\"267\":\"106#start-here\",\"268\":\"107\",\"269\":\"107#common-processes\",\"270\":\"107#mii-processes\",\"271\":\"107#num-processes\",\"272\":\"108\",\"273\":\"108#prerequisites\",\"274\":\"108#virtual-machines\",\"275\":\"108#docker-docker-compose\",\"276\":\"108#client-server-certificates\",\"277\":\"108#network-setup-network-access\",\"278\":\"108#setup\",\"279\":\"108#prepare-certificates\",\"280\":\"108#dsf-fhir-server\",\"281\":\"108#dsf-bpe-server\",\"282\":\"108#logs\",\"283\":\"108#on-boarding\",\"284\":\"109\",\"285\":\"109#overview\",\"286\":\"110\",\"287\":\"111\",\"288\":\"111#modify-dsf-fhir-server-setup\",\"289\":\"111#modify-dsf-bpe-server-setup\",\"290\":\"112\",\"291\":\"112#benefits-of-contributing\",\"292\":\"112#general\",\"293\":\"112#code-style\",\"294\":\"112#branching-strategy\",\"295\":\"112#branch-naming\",\"296\":\"112#setting-up-the-project\",\"297\":\"112#java\",\"298\":\"112#docker\",\"299\":\"112#maven\",\"300\":\"112#workflow\",\"301\":\"112#pull-request-process\",\"302\":\"112#data-security-in-dsf-development\",\"303\":\"113\",\"304\":\"114\",\"305\":\"114#ways-you-can-contribute\",\"306\":\"115\",\"307\":\"116\",\"308\":\"116#overview\",\"309\":\"117\",\"310\":\"118\",\"311\":\"118#overview\",\"312\":\"118#prerequisites\",\"313\":\"118#start-here\",\"314\":\"119\",\"315\":\"119#common-processes\",\"316\":\"119#mii-processes\",\"317\":\"119#num-processes\",\"318\":\"120\",\"319\":\"120#prerequisites\",\"320\":\"120#virtual-machines\",\"321\":\"120#docker-docker-compose\",\"322\":\"120#client-server-certificates\",\"323\":\"120#network-setup-network-access\",\"324\":\"120#setup\",\"325\":\"120#prepare-certificates\",\"326\":\"120#dsf-fhir-server\",\"327\":\"120#dsf-bpe-server\",\"328\":\"120#logs\",\"329\":\"120#on-boarding\",\"330\":\"121\",\"331\":\"121#overview\",\"332\":\"122\",\"333\":\"123\",\"334\":\"123#modify-dsf-fhir-server-setup\",\"335\":\"123#modify-dsf-bpe-server-setup\",\"336\":\"124\",\"337\":\"125\",\"338\":\"125#overview\",\"339\":\"126\",\"340\":\"127\",\"341\":\"127#benefits-of-contributing\",\"342\":\"127#general\",\"343\":\"127#code-style\",\"344\":\"127#branching-strategy\",\"345\":\"127#branch-naming\",\"346\":\"127#setting-up-the-project\",\"347\":\"127#java\",\"348\":\"127#docker\",\"349\":\"127#maven\",\"350\":\"127#workflow\",\"351\":\"127#pull-request-process\",\"352\":\"127#data-security-in-dsf-development\",\"353\":\"128\",\"354\":\"129\",\"355\":\"129#ways-you-can-contribute\",\"356\":\"130\",\"357\":\"130#overview\",\"358\":\"130#prerequisites\",\"359\":\"130#start-here\",\"360\":\"131\",\"361\":\"131#common-processes\",\"362\":\"131#mii-processes\",\"363\":\"131#num-processes\",\"364\":\"132\",\"365\":\"132#prerequisites\",\"366\":\"132#virtual-machines\",\"367\":\"132#docker-docker-compose\",\"368\":\"132#client-server-certificates\",\"369\":\"132#network-setup-network-access\",\"370\":\"132#setup\",\"371\":\"132#prepare-certificates\",\"372\":\"132#dsf-fhir-server\",\"373\":\"132#dsf-bpe-server\",\"374\":\"132#logs\",\"375\":\"132#on-boarding\",\"376\":\"133\",\"377\":\"133#overview\",\"378\":\"134\",\"379\":\"135\",\"380\":\"135#modify-dsf-fhir-server-setup\",\"381\":\"135#modify-dsf-bpe-server-setup\",\"382\":\"136\",\"383\":\"136#dev-dsf-bpe-db-liquibase-forceunlock\",\"384\":\"136#dev-dsf-bpe-db-liquibase-lockwaittime\",\"385\":\"136#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"386\":\"136#dev-dsf-bpe-db-liquibase-username\",\"387\":\"136#dev-dsf-bpe-db-url\",\"388\":\"136#dev-dsf-bpe-db-user-camunda-group\",\"389\":\"136#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"390\":\"136#dev-dsf-bpe-db-user-camunda-username\",\"391\":\"136#dev-dsf-bpe-db-user-group\",\"392\":\"136#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"393\":\"136#dev-dsf-bpe-db-user-username\",\"394\":\"136#dev-dsf-bpe-debug-log-message-onactivityend\",\"395\":\"136#dev-dsf-bpe-debug-log-message-onactivitystart\",\"396\":\"136#dev-dsf-bpe-debug-log-message-variables\",\"397\":\"136#dev-dsf-bpe-fhir-client-certificate\",\"398\":\"136#dev-dsf-bpe-fhir-client-certificate-private-key\",\"399\":\"136#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"400\":\"136#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"401\":\"136#dev-dsf-bpe-fhir-client-local-timeout-read\",\"402\":\"136#dev-dsf-bpe-fhir-client-local-verbose\",\"403\":\"136#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"404\":\"136#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"405\":\"136#dev-dsf-bpe-fhir-client-remote-verbose\",\"406\":\"136#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"407\":\"136#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"408\":\"136#dev-dsf-bpe-fhir-server-base-url\",\"409\":\"136#dev-dsf-bpe-fhir-server-organization-identifier-value\",\"410\":\"136#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"411\":\"136#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"412\":\"136#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"413\":\"136#dev-dsf-bpe-mail-client-certificate\",\"414\":\"136#dev-dsf-bpe-mail-client-certificate-private-key\",\"415\":\"136#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"416\":\"136#dev-dsf-bpe-mail-fromaddress\",\"417\":\"136#dev-dsf-bpe-mail-host\",\"418\":\"136#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"419\":\"136#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"420\":\"136#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"421\":\"136#dev-dsf-bpe-mail-port\",\"422\":\"136#dev-dsf-bpe-mail-replytoaddresses\",\"423\":\"136#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"424\":\"136#dev-dsf-bpe-mail-sendtestmailonstartup\",\"425\":\"136#dev-dsf-bpe-mail-smime-p12keystore\",\"426\":\"136#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"427\":\"136#dev-dsf-bpe-mail-toaddresses\",\"428\":\"136#dev-dsf-bpe-mail-toaddressescc\",\"429\":\"136#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"430\":\"136#dev-dsf-bpe-mail-username\",\"431\":\"136#dev-dsf-bpe-mail-usesmtps\",\"432\":\"136#dev-dsf-bpe-process-excluded\",\"433\":\"136#dev-dsf-bpe-process-fhir-server-retry-max\",\"434\":\"136#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"435\":\"136#dev-dsf-bpe-process-plugin-directroy\",\"436\":\"136#dev-dsf-bpe-process-retired\",\"437\":\"136#dev-dsf-proxy-noproxy\",\"438\":\"136#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"439\":\"136#dev-dsf-proxy-url\",\"440\":\"136#dev-dsf-proxy-username\",\"441\":\"137\",\"442\":\"137#dev-dsf-server-api-host\",\"443\":\"137#dev-dsf-server-api-port\",\"444\":\"137#dev-dsf-server-auth-client-certificate-header\",\"445\":\"137#dev-dsf-server-auth-oidc-authorization-code-flow\",\"446\":\"137#dev-dsf-server-auth-oidc-back-channel-logout\",\"447\":\"137#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"448\":\"137#dev-dsf-server-auth-oidc-bearer-token\",\"449\":\"137#dev-dsf-server-auth-oidc-client-id\",\"450\":\"137#dev-dsf-server-auth-oidc-client-secret\",\"451\":\"137#dev-dsf-server-auth-oidc-provider-client-certificate\",\"452\":\"137#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"453\":\"137#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"454\":\"137#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"455\":\"137#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"456\":\"137#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"457\":\"137#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"458\":\"137#dev-dsf-server-auth-trust-client-certificate-cas\",\"459\":\"137#dev-dsf-server-certificate\",\"460\":\"137#dev-dsf-server-certificate-chain\",\"461\":\"137#dev-dsf-server-certificate-key\",\"462\":\"137#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"463\":\"137#dev-dsf-server-context-path\",\"464\":\"137#dev-dsf-server-status-host\",\"465\":\"137#dev-dsf-server-status-port\",\"466\":\"138\",\"467\":\"138#dev-dsf-fhir-client-certificate\",\"468\":\"138#dev-dsf-fhir-client-certificate-private-key\",\"469\":\"138#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"470\":\"138#dev-dsf-fhir-client-timeout-connect\",\"471\":\"138#dev-dsf-fhir-client-timeout-read\",\"472\":\"138#dev-dsf-fhir-client-trust-server-certificate-cas\",\"473\":\"138#dev-dsf-fhir-client-verbose\",\"474\":\"138#dev-dsf-fhir-db-liquibase-forceunlock\",\"475\":\"138#dev-dsf-fhir-db-liquibase-lockwaittime\",\"476\":\"138#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"477\":\"138#dev-dsf-fhir-db-liquibase-username\",\"478\":\"138#dev-dsf-fhir-db-url\",\"479\":\"138#dev-dsf-fhir-db-user-group\",\"480\":\"138#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"481\":\"138#dev-dsf-fhir-db-user-permanent-delete-group\",\"482\":\"138#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"483\":\"138#dev-dsf-fhir-db-user-permanent-delete-username\",\"484\":\"138#dev-dsf-fhir-db-user-username\",\"485\":\"138#dev-dsf-fhir-server-base-url\",\"486\":\"138#dev-dsf-fhir-server-init-bundle\",\"487\":\"138#dev-dsf-fhir-server-organization-identifier-value\",\"488\":\"138#dev-dsf-fhir-server-page-count\",\"489\":\"138#dev-dsf-fhir-server-roleconfig\",\"490\":\"138#dev-dsf-fhir-server-static-resource-cache\",\"491\":\"138#dev-dsf-proxy-noproxy\",\"492\":\"138#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"493\":\"138#dev-dsf-proxy-url\",\"494\":\"138#dev-dsf-proxy-username\",\"495\":\"139\",\"496\":\"139#overview\",\"497\":\"140\",\"498\":\"140#app-server-ip\",\"499\":\"140#https-server-name-port\",\"500\":\"140#proxy-pass-connection-timeout-http\",\"501\":\"140#proxy-pass-connection-timeout-ws\",\"502\":\"140#proxy-pass-timeout-http\",\"503\":\"140#proxy-pass-timeout-ws\",\"504\":\"140#ssl-ca-certificate-file\",\"505\":\"140#ssl-ca-dn-request-file\",\"506\":\"140#ssl-certificate-chain-file\",\"507\":\"140#ssl-certificate-file\",\"508\":\"140#ssl-certificate-key-file\",\"509\":\"141\",\"510\":\"141#dev-dsf-server-api-host\",\"511\":\"141#dev-dsf-server-api-port\",\"512\":\"141#dev-dsf-server-auth-client-certificate-header\",\"513\":\"141#dev-dsf-server-auth-oidc-authorization-code-flow\",\"514\":\"141#dev-dsf-server-auth-oidc-back-channel-logout\",\"515\":\"141#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"516\":\"141#dev-dsf-server-auth-oidc-bearer-token\",\"517\":\"141#dev-dsf-server-auth-oidc-client-id\",\"518\":\"141#dev-dsf-server-auth-oidc-client-secret\",\"519\":\"141#dev-dsf-server-auth-oidc-provider-client-certificate\",\"520\":\"141#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"521\":\"141#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"522\":\"141#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"523\":\"141#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"524\":\"141#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"525\":\"141#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"526\":\"141#dev-dsf-server-auth-trust-client-certificate-cas\",\"527\":\"141#dev-dsf-server-certificate\",\"528\":\"141#dev-dsf-server-certificate-chain\",\"529\":\"141#dev-dsf-server-certificate-key\",\"530\":\"141#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"531\":\"141#dev-dsf-server-context-path\",\"532\":\"141#dev-dsf-server-status-host\",\"533\":\"141#dev-dsf-server-status-port\",\"534\":\"141#dev-dsf-bpe-db-liquibase-forceunlock\",\"535\":\"141#dev-dsf-bpe-db-liquibase-lockwaittime\",\"536\":\"141#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"537\":\"141#dev-dsf-bpe-db-liquibase-username\",\"538\":\"141#dev-dsf-bpe-db-url\",\"539\":\"141#dev-dsf-bpe-db-user-camunda-group\",\"540\":\"141#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"541\":\"141#dev-dsf-bpe-db-user-camunda-username\",\"542\":\"141#dev-dsf-bpe-db-user-group\",\"543\":\"141#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"544\":\"141#dev-dsf-bpe-db-user-username\",\"545\":\"141#dev-dsf-bpe-debug-log-message-onactivityend\",\"546\":\"141#dev-dsf-bpe-debug-log-message-onactivitystart\",\"547\":\"141#dev-dsf-bpe-debug-log-message-variables\",\"548\":\"141#dev-dsf-bpe-fhir-client-certificate\",\"549\":\"141#dev-dsf-bpe-fhir-client-certificate-private-key\",\"550\":\"141#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"551\":\"141#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"552\":\"141#dev-dsf-bpe-fhir-client-local-timeout-read\",\"553\":\"141#dev-dsf-bpe-fhir-client-local-verbose\",\"554\":\"141#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"555\":\"141#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"556\":\"141#dev-dsf-bpe-fhir-client-remote-verbose\",\"557\":\"141#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"558\":\"141#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"559\":\"141#dev-dsf-bpe-fhir-server-base-url\",\"560\":\"141#dev-dsf-bpe-fhir-server-organization-identifier-value\",\"561\":\"141#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"562\":\"141#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"563\":\"141#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"564\":\"141#dev-dsf-bpe-mail-client-certificate\",\"565\":\"141#dev-dsf-bpe-mail-client-certificate-private-key\",\"566\":\"141#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"567\":\"141#dev-dsf-bpe-mail-fromaddress\",\"568\":\"141#dev-dsf-bpe-mail-host\",\"569\":\"141#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"570\":\"141#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"571\":\"141#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"572\":\"141#dev-dsf-bpe-mail-port\",\"573\":\"141#dev-dsf-bpe-mail-replytoaddresses\",\"574\":\"141#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"575\":\"141#dev-dsf-bpe-mail-sendtestmailonstartup\",\"576\":\"141#dev-dsf-bpe-mail-smime-p12keystore\",\"577\":\"141#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"578\":\"141#dev-dsf-bpe-mail-toaddresses\",\"579\":\"141#dev-dsf-bpe-mail-toaddressescc\",\"580\":\"141#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"581\":\"141#dev-dsf-bpe-mail-username\",\"582\":\"141#dev-dsf-bpe-mail-usesmtps\",\"583\":\"141#dev-dsf-bpe-process-excluded\",\"584\":\"141#dev-dsf-bpe-process-fhir-server-retry-max\",\"585\":\"141#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"586\":\"141#dev-dsf-bpe-process-plugin-directroy\",\"587\":\"141#dev-dsf-bpe-process-retired\",\"588\":\"141#dev-dsf-proxy-noproxy\",\"589\":\"141#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"590\":\"141#dev-dsf-proxy-url\",\"591\":\"141#dev-dsf-proxy-username\",\"592\":\"142\",\"593\":\"142#overview\",\"594\":\"143\",\"595\":\"143#app-server-ip\",\"596\":\"143#https-server-name-port\",\"597\":\"143#proxy-pass-connection-timeout-http\",\"598\":\"143#proxy-pass-connection-timeout-ws\",\"599\":\"143#proxy-pass-timeout-http\",\"600\":\"143#proxy-pass-timeout-ws\",\"601\":\"143#ssl-ca-certificate-file\",\"602\":\"143#ssl-ca-dn-request-file\",\"603\":\"143#ssl-certificate-chain-file\",\"604\":\"143#ssl-certificate-file\",\"605\":\"143#ssl-certificate-key-file\",\"606\":\"143#ssl-verify-client\",\"607\":\"144\",\"608\":\"144#overview\",\"609\":\"145\",\"610\":\"145#overview\",\"611\":\"145#matching-users\",\"612\":\"145#thumbprint\",\"613\":\"145#email\",\"614\":\"145#token-role-and-token-group\",\"615\":\"145#dsf-and-practitioner-roles\",\"616\":\"145#dsf-role\",\"617\":\"145#practitioner-role\",\"618\":\"145#examples\",\"619\":\"146\",\"620\":\"146#dev-dsf-fhir-client-certificate\",\"621\":\"146#dev-dsf-fhir-client-certificate-private-key\",\"622\":\"146#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"623\":\"146#dev-dsf-fhir-client-timeout-connect\",\"624\":\"146#dev-dsf-fhir-client-timeout-read\",\"625\":\"146#dev-dsf-fhir-client-trust-server-certificate-cas\",\"626\":\"146#dev-dsf-fhir-client-verbose\",\"627\":\"146#dev-dsf-fhir-db-liquibase-forceunlock\",\"628\":\"146#dev-dsf-fhir-db-liquibase-lockwaittime\",\"629\":\"146#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"630\":\"146#dev-dsf-fhir-db-liquibase-username\",\"631\":\"146#dev-dsf-fhir-db-url\",\"632\":\"146#dev-dsf-fhir-db-user-group\",\"633\":\"146#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"634\":\"146#dev-dsf-fhir-db-user-permanent-delete-group\",\"635\":\"146#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"636\":\"146#dev-dsf-fhir-db-user-permanent-delete-username\",\"637\":\"146#dev-dsf-fhir-db-user-username\",\"638\":\"146#dev-dsf-fhir-server-base-url\",\"639\":\"146#dev-dsf-fhir-server-init-bundle\",\"640\":\"146#dev-dsf-fhir-server-organization-identifier-value\",\"641\":\"146#dev-dsf-fhir-server-organization-thumbprint\",\"642\":\"146#dev-dsf-fhir-server-page-count\",\"643\":\"146#dev-dsf-fhir-server-roleconfig\",\"644\":\"146#dev-dsf-fhir-server-static-resource-cache\",\"645\":\"146#dev-dsf-proxy-noproxy\",\"646\":\"146#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"647\":\"146#dev-dsf-proxy-url\",\"648\":\"146#dev-dsf-proxy-username\",\"649\":\"146#dev-dsf-server-api-host\",\"650\":\"146#dev-dsf-server-api-port\",\"651\":\"146#dev-dsf-server-auth-client-certificate-header\",\"652\":\"146#dev-dsf-server-auth-oidc-authorization-code-flow\",\"653\":\"146#dev-dsf-server-auth-oidc-back-channel-logout\",\"654\":\"146#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"655\":\"146#dev-dsf-server-auth-oidc-bearer-token\",\"656\":\"146#dev-dsf-server-auth-oidc-client-id\",\"657\":\"146#dev-dsf-server-auth-oidc-client-secret\",\"658\":\"146#dev-dsf-server-auth-oidc-provider-client-certificate\",\"659\":\"146#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"660\":\"146#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"661\":\"146#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"662\":\"146#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"663\":\"146#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"664\":\"146#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"665\":\"146#dev-dsf-server-auth-trust-client-certificate-cas\",\"666\":\"146#dev-dsf-server-certificate\",\"667\":\"146#dev-dsf-server-certificate-chain\",\"668\":\"146#dev-dsf-server-certificate-key\",\"669\":\"146#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"670\":\"146#dev-dsf-server-context-path\",\"671\":\"146#dev-dsf-server-status-host\",\"672\":\"146#dev-dsf-server-status-port\",\"673\":\"147\",\"674\":\"147#overview\",\"675\":\"147#authorization-code-flow\",\"676\":\"147#bearer-token-authentication\",\"677\":\"147#additional-odic-configuration-parameter\",\"678\":\"147#example\",\"679\":\"148\",\"680\":\"148#overview\",\"681\":\"149\",\"682\":\"149#benefits-of-contributing\",\"683\":\"149#general\",\"684\":\"149#code-style\",\"685\":\"149#branching-strategy\",\"686\":\"149#branch-naming\",\"687\":\"149#setting-up-the-project\",\"688\":\"149#java\",\"689\":\"149#docker\",\"690\":\"149#maven\",\"691\":\"149#workflow\",\"692\":\"149#pull-request-process\",\"693\":\"149#data-security-in-dsf-development\",\"694\":\"150\",\"695\":\"151\",\"696\":\"151#ways-you-can-contribute\",\"697\":\"152\",\"698\":\"153\",\"699\":\"153#overview\",\"700\":\"154\",\"701\":\"155\",\"702\":\"155#overview\",\"703\":\"155#prerequisites\",\"704\":\"155#start-here\",\"705\":\"156\",\"706\":\"156#common-processes\",\"707\":\"156#mii-processes\",\"708\":\"156#num-processes\",\"709\":\"157\",\"710\":\"157#prerequisites\",\"711\":\"157#virtual-machines\",\"712\":\"157#docker-docker-compose\",\"713\":\"157#client-server-certificates\",\"714\":\"157#network-setup-network-access\",\"715\":\"157#setup\",\"716\":\"157#prepare-certificates\",\"717\":\"157#dsf-fhir-server\",\"718\":\"157#dsf-bpe-server\",\"719\":\"157#logs\",\"720\":\"157#on-boarding\",\"721\":\"158\",\"722\":\"158#overview\",\"723\":\"159\",\"724\":\"160\",\"725\":\"160#modify-dsf-fhir-server-setup\",\"726\":\"160#modify-dsf-bpe-server-setup\",\"727\":\"161\",\"728\":\"161#dev-dsf-server-api-host\",\"729\":\"161#dev-dsf-server-api-port\",\"730\":\"161#dev-dsf-server-auth-client-certificate-header\",\"731\":\"161#dev-dsf-server-auth-oidc-authorization-code-flow\",\"732\":\"161#dev-dsf-server-auth-oidc-back-channel-logout\",\"733\":\"161#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"734\":\"161#dev-dsf-server-auth-oidc-bearer-token\",\"735\":\"161#dev-dsf-server-auth-oidc-client-id\",\"736\":\"161#dev-dsf-server-auth-oidc-client-secret\",\"737\":\"161#dev-dsf-server-auth-oidc-provider-client-certificate\",\"738\":\"161#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"739\":\"161#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"740\":\"161#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"741\":\"161#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"742\":\"161#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"743\":\"161#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"744\":\"161#dev-dsf-server-auth-trust-client-certificate-cas\",\"745\":\"161#dev-dsf-server-certificate\",\"746\":\"161#dev-dsf-server-certificate-chain\",\"747\":\"161#dev-dsf-server-certificate-key\",\"748\":\"161#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"749\":\"161#dev-dsf-server-context-path\",\"750\":\"161#dev-dsf-server-status-host\",\"751\":\"161#dev-dsf-server-status-port\",\"752\":\"161#dev-dsf-bpe-db-liquibase-forceunlock\",\"753\":\"161#dev-dsf-bpe-db-liquibase-lockwaittime\",\"754\":\"161#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"755\":\"161#dev-dsf-bpe-db-liquibase-username\",\"756\":\"161#dev-dsf-bpe-db-url\",\"757\":\"161#dev-dsf-bpe-db-user-camunda-group\",\"758\":\"161#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"759\":\"161#dev-dsf-bpe-db-user-camunda-username\",\"760\":\"161#dev-dsf-bpe-db-user-group\",\"761\":\"161#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"762\":\"161#dev-dsf-bpe-db-user-username\",\"763\":\"161#dev-dsf-bpe-debug-log-message-onactivityend\",\"764\":\"161#dev-dsf-bpe-debug-log-message-onactivitystart\",\"765\":\"161#dev-dsf-bpe-debug-log-message-variables\",\"766\":\"161#dev-dsf-bpe-debug-log-message-variableslocal\",\"767\":\"161#dev-dsf-bpe-fhir-client-certificate\",\"768\":\"161#dev-dsf-bpe-fhir-client-certificate-private-key\",\"769\":\"161#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"770\":\"161#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"771\":\"161#dev-dsf-bpe-fhir-client-local-timeout-read\",\"772\":\"161#dev-dsf-bpe-fhir-client-local-verbose\",\"773\":\"161#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"774\":\"161#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"775\":\"161#dev-dsf-bpe-fhir-client-remote-verbose\",\"776\":\"161#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"777\":\"161#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"778\":\"161#dev-dsf-bpe-fhir-server-base-url\",\"779\":\"161#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"780\":\"161#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"781\":\"161#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"782\":\"161#dev-dsf-bpe-mail-client-certificate\",\"783\":\"161#dev-dsf-bpe-mail-client-certificate-private-key\",\"784\":\"161#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"785\":\"161#dev-dsf-bpe-mail-fromaddress\",\"786\":\"161#dev-dsf-bpe-mail-host\",\"787\":\"161#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"788\":\"161#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"789\":\"161#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"790\":\"161#dev-dsf-bpe-mail-port\",\"791\":\"161#dev-dsf-bpe-mail-replytoaddresses\",\"792\":\"161#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"793\":\"161#dev-dsf-bpe-mail-sendtestmailonstartup\",\"794\":\"161#dev-dsf-bpe-mail-smime-p12keystore\",\"795\":\"161#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"796\":\"161#dev-dsf-bpe-mail-toaddresses\",\"797\":\"161#dev-dsf-bpe-mail-toaddressescc\",\"798\":\"161#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"799\":\"161#dev-dsf-bpe-mail-username\",\"800\":\"161#dev-dsf-bpe-mail-usesmtps\",\"801\":\"161#dev-dsf-bpe-process-engine-corepoolsize\",\"802\":\"161#dev-dsf-bpe-process-engine-maxpoolsize\",\"803\":\"161#dev-dsf-bpe-process-engine-queuesize\",\"804\":\"161#dev-dsf-bpe-process-excluded\",\"805\":\"161#dev-dsf-bpe-process-fhir-server-retry-max\",\"806\":\"161#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"807\":\"161#dev-dsf-bpe-process-plugin-directroy\",\"808\":\"161#dev-dsf-bpe-process-retired\",\"809\":\"161#dev-dsf-bpe-process-threads\",\"810\":\"161#dev-dsf-proxy-noproxy\",\"811\":\"161#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"812\":\"161#dev-dsf-proxy-url\",\"813\":\"161#dev-dsf-proxy-username\",\"814\":\"162\",\"815\":\"162#overview\",\"816\":\"163\",\"817\":\"163#overview\",\"818\":\"163#matching-users\",\"819\":\"163#thumbprint\",\"820\":\"163#email\",\"821\":\"163#token-role-and-token-group\",\"822\":\"163#dsf-and-practitioner-roles\",\"823\":\"163#dsf-role\",\"824\":\"163#practitioner-role\",\"825\":\"163#examples\",\"826\":\"164\",\"827\":\"164#dev-dsf-fhir-client-certificate\",\"828\":\"164#dev-dsf-fhir-client-certificate-private-key\",\"829\":\"164#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"830\":\"164#dev-dsf-fhir-client-timeout-connect\",\"831\":\"164#dev-dsf-fhir-client-timeout-read\",\"832\":\"164#dev-dsf-fhir-client-trust-server-certificate-cas\",\"833\":\"164#dev-dsf-fhir-client-verbose\",\"834\":\"164#dev-dsf-fhir-db-liquibase-forceunlock\",\"835\":\"164#dev-dsf-fhir-db-liquibase-lockwaittime\",\"836\":\"164#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"837\":\"164#dev-dsf-fhir-db-liquibase-username\",\"838\":\"164#dev-dsf-fhir-db-url\",\"839\":\"164#dev-dsf-fhir-db-user-group\",\"840\":\"164#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"841\":\"164#dev-dsf-fhir-db-user-permanent-delete-group\",\"842\":\"164#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"843\":\"164#dev-dsf-fhir-db-user-permanent-delete-username\",\"844\":\"164#dev-dsf-fhir-db-user-username\",\"845\":\"164#dev-dsf-fhir-server-base-url\",\"846\":\"164#dev-dsf-fhir-server-init-bundle\",\"847\":\"164#dev-dsf-fhir-server-organization-identifier-value\",\"848\":\"164#dev-dsf-fhir-server-organization-thumbprint\",\"849\":\"164#dev-dsf-fhir-server-page-count\",\"850\":\"164#dev-dsf-fhir-server-roleconfig\",\"851\":\"164#dev-dsf-fhir-server-static-resource-cache\",\"852\":\"164#dev-dsf-proxy-noproxy\",\"853\":\"164#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"854\":\"164#dev-dsf-proxy-url\",\"855\":\"164#dev-dsf-proxy-username\",\"856\":\"164#dev-dsf-server-api-host\",\"857\":\"164#dev-dsf-server-api-port\",\"858\":\"164#dev-dsf-server-auth-client-certificate-header\",\"859\":\"164#dev-dsf-server-auth-oidc-authorization-code-flow\",\"860\":\"164#dev-dsf-server-auth-oidc-back-channel-logout\",\"861\":\"164#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"862\":\"164#dev-dsf-server-auth-oidc-bearer-token\",\"863\":\"164#dev-dsf-server-auth-oidc-client-id\",\"864\":\"164#dev-dsf-server-auth-oidc-client-secret\",\"865\":\"164#dev-dsf-server-auth-oidc-provider-client-certificate\",\"866\":\"164#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"867\":\"164#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"868\":\"164#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"869\":\"164#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"870\":\"164#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"871\":\"164#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"872\":\"164#dev-dsf-server-auth-trust-client-certificate-cas\",\"873\":\"164#dev-dsf-server-certificate\",\"874\":\"164#dev-dsf-server-certificate-chain\",\"875\":\"164#dev-dsf-server-certificate-key\",\"876\":\"164#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"877\":\"164#dev-dsf-server-context-path\",\"878\":\"164#dev-dsf-server-status-host\",\"879\":\"164#dev-dsf-server-status-port\",\"880\":\"165\",\"881\":\"165#overview\",\"882\":\"165#authorization-code-flow\",\"883\":\"165#bearer-token-authentication\",\"884\":\"165#additional-odic-configuration-parameter\",\"885\":\"165#example\",\"886\":\"166\",\"887\":\"166#overview\",\"888\":\"167\",\"889\":\"167#benefits-of-contributing\",\"890\":\"167#general\",\"891\":\"167#code-style\",\"892\":\"167#branching-strategy\",\"893\":\"167#branch-naming\",\"894\":\"167#setting-up-the-project\",\"895\":\"167#java\",\"896\":\"167#docker\",\"897\":\"167#maven\",\"898\":\"167#workflow\",\"899\":\"167#pull-request-process\",\"900\":\"167#data-security-in-dsf-development\",\"901\":\"168\",\"902\":\"169\",\"903\":\"169#ways-you-can-contribute\",\"904\":\"170\",\"905\":\"171\",\"906\":\"171#overview\",\"907\":\"172\",\"908\":\"173\",\"909\":\"173#app-server-ip\",\"910\":\"173#https-server-name-port\",\"911\":\"173#proxy-pass-connection-timeout-http\",\"912\":\"173#proxy-pass-connection-timeout-ws\",\"913\":\"173#proxy-pass-timeout-http\",\"914\":\"173#proxy-pass-timeout-ws\",\"915\":\"173#server-context-path\",\"916\":\"173#ssl-ca-certificate-file\",\"917\":\"173#ssl-ca-dn-request-file\",\"918\":\"173#ssl-certificate-chain-file\",\"919\":\"173#ssl-certificate-file\",\"920\":\"173#ssl-certificate-key-file\",\"921\":\"173#ssl-verify-client\",\"922\":\"174\",\"923\":\"174#overview\",\"924\":\"175\",\"925\":\"175#overview\",\"926\":\"175#prerequisites\",\"927\":\"175#start-here\",\"928\":\"176\",\"929\":\"176#overview\",\"930\":\"176#prerequisites\",\"931\":\"176#deployment\",\"932\":\"177\",\"933\":\"177#prerequisites\",\"934\":\"177#virtual-machines\",\"935\":\"177#docker-docker-compose\",\"936\":\"177#client-server-certificates\",\"937\":\"177#network-setup-network-access\",\"938\":\"177#setup\",\"939\":\"177#prepare-certificates\",\"940\":\"177#dsf-fhir-server\",\"941\":\"177#dsf-bpe-server\",\"942\":\"177#logs\",\"943\":\"177#on-boarding\",\"944\":\"178\",\"945\":\"178#overview\",\"946\":\"179\",\"947\":\"180\",\"948\":\"180#modify-dsf-fhir-server-setup\",\"949\":\"180#modify-dsf-bpe-server-setup\",\"950\":\"181\",\"951\":\"181#dev-dsf-server-api-host\",\"952\":\"181#dev-dsf-server-api-port\",\"953\":\"181#dev-dsf-server-auth-client-certificate-header\",\"954\":\"181#dev-dsf-server-auth-oidc-authorization-code-flow\",\"955\":\"181#dev-dsf-server-auth-oidc-back-channel-logout\",\"956\":\"181#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"957\":\"181#dev-dsf-server-auth-oidc-bearer-token\",\"958\":\"181#dev-dsf-server-auth-oidc-client-id\",\"959\":\"181#dev-dsf-server-auth-oidc-client-secret\",\"960\":\"181#dev-dsf-server-auth-oidc-provider-client-certificate\",\"961\":\"181#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"962\":\"181#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"963\":\"181#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"964\":\"181#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"965\":\"181#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"966\":\"181#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"967\":\"181#dev-dsf-server-auth-trust-client-certificate-cas\",\"968\":\"181#dev-dsf-server-certificate\",\"969\":\"181#dev-dsf-server-certificate-chain\",\"970\":\"181#dev-dsf-server-certificate-key\",\"971\":\"181#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"972\":\"181#dev-dsf-server-context-path\",\"973\":\"181#dev-dsf-server-status-host\",\"974\":\"181#dev-dsf-server-status-port\",\"975\":\"181#dev-dsf-bpe-db-liquibase-forceunlock\",\"976\":\"181#dev-dsf-bpe-db-liquibase-lockwaittime\",\"977\":\"181#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"978\":\"181#dev-dsf-bpe-db-liquibase-username\",\"979\":\"181#dev-dsf-bpe-db-url\",\"980\":\"181#dev-dsf-bpe-db-user-camunda-group\",\"981\":\"181#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"982\":\"181#dev-dsf-bpe-db-user-camunda-username\",\"983\":\"181#dev-dsf-bpe-db-user-group\",\"984\":\"181#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"985\":\"181#dev-dsf-bpe-db-user-username\",\"986\":\"181#dev-dsf-bpe-debug-log-message-onactivityend\",\"987\":\"181#dev-dsf-bpe-debug-log-message-onactivitystart\",\"988\":\"181#dev-dsf-bpe-debug-log-message-variables\",\"989\":\"181#dev-dsf-bpe-debug-log-message-variableslocal\",\"990\":\"181#dev-dsf-bpe-fhir-client-certificate\",\"991\":\"181#dev-dsf-bpe-fhir-client-certificate-private-key\",\"992\":\"181#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"993\":\"181#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"994\":\"181#dev-dsf-bpe-fhir-client-local-timeout-read\",\"995\":\"181#dev-dsf-bpe-fhir-client-local-verbose\",\"996\":\"181#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"997\":\"181#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"998\":\"181#dev-dsf-bpe-fhir-client-remote-verbose\",\"999\":\"181#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1000\":\"181#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1001\":\"181#dev-dsf-bpe-fhir-server-base-url\",\"1002\":\"181#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1003\":\"181#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1004\":\"181#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1005\":\"181#dev-dsf-bpe-mail-client-certificate\",\"1006\":\"181#dev-dsf-bpe-mail-client-certificate-private-key\",\"1007\":\"181#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1008\":\"181#dev-dsf-bpe-mail-fromaddress\",\"1009\":\"181#dev-dsf-bpe-mail-host\",\"1010\":\"181#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1011\":\"181#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1012\":\"181#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1013\":\"181#dev-dsf-bpe-mail-port\",\"1014\":\"181#dev-dsf-bpe-mail-replytoaddresses\",\"1015\":\"181#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1016\":\"181#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1017\":\"181#dev-dsf-bpe-mail-smime-p12keystore\",\"1018\":\"181#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1019\":\"181#dev-dsf-bpe-mail-toaddresses\",\"1020\":\"181#dev-dsf-bpe-mail-toaddressescc\",\"1021\":\"181#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1022\":\"181#dev-dsf-bpe-mail-username\",\"1023\":\"181#dev-dsf-bpe-mail-usesmtps\",\"1024\":\"181#dev-dsf-bpe-process-engine-corepoolsize\",\"1025\":\"181#dev-dsf-bpe-process-engine-maxpoolsize\",\"1026\":\"181#dev-dsf-bpe-process-engine-queuesize\",\"1027\":\"181#dev-dsf-bpe-process-excluded\",\"1028\":\"181#dev-dsf-bpe-process-fhir-server-retry-max\",\"1029\":\"181#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1030\":\"181#dev-dsf-bpe-process-plugin-directroy\",\"1031\":\"181#dev-dsf-bpe-process-retired\",\"1032\":\"181#dev-dsf-bpe-process-threads\",\"1033\":\"181#dev-dsf-proxy-noproxy\",\"1034\":\"181#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1035\":\"181#dev-dsf-proxy-url\",\"1036\":\"181#dev-dsf-proxy-username\",\"1037\":\"182\",\"1038\":\"182#overview\",\"1039\":\"183\",\"1040\":\"183#overview\",\"1041\":\"183#matching-users\",\"1042\":\"183#thumbprint\",\"1043\":\"183#email\",\"1044\":\"183#token-role-and-token-group\",\"1045\":\"183#dsf-and-practitioner-roles\",\"1046\":\"183#dsf-role\",\"1047\":\"183#practitioner-role\",\"1048\":\"183#examples\",\"1049\":\"184\",\"1050\":\"184#dev-dsf-fhir-client-certificate\",\"1051\":\"184#dev-dsf-fhir-client-certificate-private-key\",\"1052\":\"184#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"1053\":\"184#dev-dsf-fhir-client-timeout-connect\",\"1054\":\"184#dev-dsf-fhir-client-timeout-read\",\"1055\":\"184#dev-dsf-fhir-client-trust-server-certificate-cas\",\"1056\":\"184#dev-dsf-fhir-client-verbose\",\"1057\":\"184#dev-dsf-fhir-db-liquibase-forceunlock\",\"1058\":\"184#dev-dsf-fhir-db-liquibase-lockwaittime\",\"1059\":\"184#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"1060\":\"184#dev-dsf-fhir-db-liquibase-username\",\"1061\":\"184#dev-dsf-fhir-db-url\",\"1062\":\"184#dev-dsf-fhir-db-user-group\",\"1063\":\"184#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"1064\":\"184#dev-dsf-fhir-db-user-permanent-delete-group\",\"1065\":\"184#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"1066\":\"184#dev-dsf-fhir-db-user-permanent-delete-username\",\"1067\":\"184#dev-dsf-fhir-db-user-username\",\"1068\":\"184#dev-dsf-fhir-server-base-url\",\"1069\":\"184#dev-dsf-fhir-server-init-bundle\",\"1070\":\"184#dev-dsf-fhir-server-organization-identifier-value\",\"1071\":\"184#dev-dsf-fhir-server-organization-thumbprint\",\"1072\":\"184#dev-dsf-fhir-server-page-count\",\"1073\":\"184#dev-dsf-fhir-server-roleconfig\",\"1074\":\"184#dev-dsf-fhir-server-static-resource-cache\",\"1075\":\"184#dev-dsf-proxy-noproxy\",\"1076\":\"184#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1077\":\"184#dev-dsf-proxy-url\",\"1078\":\"184#dev-dsf-proxy-username\",\"1079\":\"184#dev-dsf-server-api-host\",\"1080\":\"184#dev-dsf-server-api-port\",\"1081\":\"184#dev-dsf-server-auth-client-certificate-header\",\"1082\":\"184#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1083\":\"184#dev-dsf-server-auth-oidc-back-channel-logout\",\"1084\":\"184#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1085\":\"184#dev-dsf-server-auth-oidc-bearer-token\",\"1086\":\"184#dev-dsf-server-auth-oidc-client-id\",\"1087\":\"184#dev-dsf-server-auth-oidc-client-secret\",\"1088\":\"184#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1089\":\"184#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1090\":\"184#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1091\":\"184#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1092\":\"184#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1093\":\"184#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1094\":\"184#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1095\":\"184#dev-dsf-server-auth-trust-client-certificate-cas\",\"1096\":\"184#dev-dsf-server-certificate\",\"1097\":\"184#dev-dsf-server-certificate-chain\",\"1098\":\"184#dev-dsf-server-certificate-key\",\"1099\":\"184#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1100\":\"184#dev-dsf-server-context-path\",\"1101\":\"184#dev-dsf-server-status-host\",\"1102\":\"184#dev-dsf-server-status-port\",\"1103\":\"185\",\"1104\":\"185#overview\",\"1105\":\"185#authorization-code-flow\",\"1106\":\"185#bearer-token-authentication\",\"1107\":\"185#additional-odic-configuration-parameter\",\"1108\":\"185#example\",\"1109\":\"186\",\"1110\":\"186#overview\",\"1111\":\"187\",\"1112\":\"187#dev-dsf-server-api-host\",\"1113\":\"187#dev-dsf-server-api-port\",\"1114\":\"187#dev-dsf-server-auth-client-certificate-header\",\"1115\":\"187#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1116\":\"187#dev-dsf-server-auth-oidc-back-channel-logout\",\"1117\":\"187#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1118\":\"187#dev-dsf-server-auth-oidc-bearer-token\",\"1119\":\"187#dev-dsf-server-auth-oidc-client-id\",\"1120\":\"187#dev-dsf-server-auth-oidc-client-secret\",\"1121\":\"187#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1122\":\"187#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1123\":\"187#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1124\":\"187#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1125\":\"187#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1126\":\"187#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1127\":\"187#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1128\":\"187#dev-dsf-server-auth-trust-client-certificate-cas\",\"1129\":\"187#dev-dsf-server-certificate\",\"1130\":\"187#dev-dsf-server-certificate-chain\",\"1131\":\"187#dev-dsf-server-certificate-key\",\"1132\":\"187#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1133\":\"187#dev-dsf-server-context-path\",\"1134\":\"187#dev-dsf-server-status-host\",\"1135\":\"187#dev-dsf-server-status-port\",\"1136\":\"187#dev-dsf-bpe-db-liquibase-forceunlock\",\"1137\":\"187#dev-dsf-bpe-db-liquibase-lockwaittime\",\"1138\":\"187#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"1139\":\"187#dev-dsf-bpe-db-liquibase-username\",\"1140\":\"187#dev-dsf-bpe-db-url\",\"1141\":\"187#dev-dsf-bpe-db-user-camunda-group\",\"1142\":\"187#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"1143\":\"187#dev-dsf-bpe-db-user-camunda-username\",\"1144\":\"187#dev-dsf-bpe-db-user-group\",\"1145\":\"187#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"1146\":\"187#dev-dsf-bpe-db-user-username\",\"1147\":\"187#dev-dsf-bpe-debug-log-message-onactivityend\",\"1148\":\"187#dev-dsf-bpe-debug-log-message-onactivitystart\",\"1149\":\"187#dev-dsf-bpe-debug-log-message-variables\",\"1150\":\"187#dev-dsf-bpe-debug-log-message-variableslocal\",\"1151\":\"187#dev-dsf-bpe-fhir-client-certificate\",\"1152\":\"187#dev-dsf-bpe-fhir-client-certificate-private-key\",\"1153\":\"187#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"1154\":\"187#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"1155\":\"187#dev-dsf-bpe-fhir-client-local-timeout-read\",\"1156\":\"187#dev-dsf-bpe-fhir-client-local-verbose\",\"1157\":\"187#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"1158\":\"187#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"1159\":\"187#dev-dsf-bpe-fhir-client-remote-verbose\",\"1160\":\"187#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1161\":\"187#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1162\":\"187#dev-dsf-bpe-fhir-server-base-url\",\"1163\":\"187#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1164\":\"187#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1165\":\"187#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1166\":\"187#dev-dsf-bpe-mail-client-certificate\",\"1167\":\"187#dev-dsf-bpe-mail-client-certificate-private-key\",\"1168\":\"187#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1169\":\"187#dev-dsf-bpe-mail-fromaddress\",\"1170\":\"187#dev-dsf-bpe-mail-host\",\"1171\":\"187#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1172\":\"187#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1173\":\"187#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1174\":\"187#dev-dsf-bpe-mail-port\",\"1175\":\"187#dev-dsf-bpe-mail-replytoaddresses\",\"1176\":\"187#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1177\":\"187#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1178\":\"187#dev-dsf-bpe-mail-smime-p12keystore\",\"1179\":\"187#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1180\":\"187#dev-dsf-bpe-mail-toaddresses\",\"1181\":\"187#dev-dsf-bpe-mail-toaddressescc\",\"1182\":\"187#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1183\":\"187#dev-dsf-bpe-mail-username\",\"1184\":\"187#dev-dsf-bpe-mail-usesmtps\",\"1185\":\"187#dev-dsf-bpe-process-engine-corepoolsize\",\"1186\":\"187#dev-dsf-bpe-process-engine-maxpoolsize\",\"1187\":\"187#dev-dsf-bpe-process-engine-queuesize\",\"1188\":\"187#dev-dsf-bpe-process-excluded\",\"1189\":\"187#dev-dsf-bpe-process-fhir-server-retry-max\",\"1190\":\"187#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1191\":\"187#dev-dsf-bpe-process-plugin-directroy\",\"1192\":\"187#dev-dsf-bpe-process-retired\",\"1193\":\"187#dev-dsf-bpe-process-threads\",\"1194\":\"187#dev-dsf-proxy-noproxy\",\"1195\":\"187#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1196\":\"187#dev-dsf-proxy-url\",\"1197\":\"187#dev-dsf-proxy-username\",\"1198\":\"188\",\"1199\":\"188#overview\",\"1200\":\"189\",\"1201\":\"189#app-server-ip\",\"1202\":\"189#https-server-name-port\",\"1203\":\"189#proxy-pass-connection-timeout-http\",\"1204\":\"189#proxy-pass-connection-timeout-ws\",\"1205\":\"189#proxy-pass-timeout-http\",\"1206\":\"189#proxy-pass-timeout-ws\",\"1207\":\"189#server-context-path\",\"1208\":\"189#ssl-ca-certificate-file\",\"1209\":\"189#ssl-ca-dn-request-file\",\"1210\":\"189#ssl-certificate-chain-file\",\"1211\":\"189#ssl-certificate-file\",\"1212\":\"189#ssl-certificate-key-file\",\"1213\":\"189#ssl-verify-client\",\"1214\":\"190\",\"1215\":\"190#overview\",\"1216\":\"191\",\"1217\":\"191#overview\",\"1218\":\"191#matching-users\",\"1219\":\"191#thumbprint\",\"1220\":\"191#email\",\"1221\":\"191#token-role-and-token-group\",\"1222\":\"191#dsf-and-practitioner-roles\",\"1223\":\"191#dsf-role\",\"1224\":\"191#practitioner-role\",\"1225\":\"191#examples\",\"1226\":\"192\",\"1227\":\"192#dev-dsf-fhir-client-certificate\",\"1228\":\"192#dev-dsf-fhir-client-certificate-private-key\",\"1229\":\"192#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"1230\":\"192#dev-dsf-fhir-client-timeout-connect\",\"1231\":\"192#dev-dsf-fhir-client-timeout-read\",\"1232\":\"192#dev-dsf-fhir-client-trust-server-certificate-cas\",\"1233\":\"192#dev-dsf-fhir-client-verbose\",\"1234\":\"192#dev-dsf-fhir-db-liquibase-forceunlock\",\"1235\":\"192#dev-dsf-fhir-db-liquibase-lockwaittime\",\"1236\":\"192#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"1237\":\"192#dev-dsf-fhir-db-liquibase-username\",\"1238\":\"192#dev-dsf-fhir-db-url\",\"1239\":\"192#dev-dsf-fhir-db-user-group\",\"1240\":\"192#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"1241\":\"192#dev-dsf-fhir-db-user-permanent-delete-group\",\"1242\":\"192#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"1243\":\"192#dev-dsf-fhir-db-user-permanent-delete-username\",\"1244\":\"192#dev-dsf-fhir-db-user-username\",\"1245\":\"192#dev-dsf-fhir-server-base-url\",\"1246\":\"192#dev-dsf-fhir-server-init-bundle\",\"1247\":\"192#dev-dsf-fhir-server-organization-identifier-value\",\"1248\":\"192#dev-dsf-fhir-server-organization-thumbprint\",\"1249\":\"192#dev-dsf-fhir-server-page-count\",\"1250\":\"192#dev-dsf-fhir-server-roleconfig\",\"1251\":\"192#dev-dsf-fhir-server-static-resource-cache\",\"1252\":\"192#dev-dsf-proxy-noproxy\",\"1253\":\"192#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1254\":\"192#dev-dsf-proxy-url\",\"1255\":\"192#dev-dsf-proxy-username\",\"1256\":\"192#dev-dsf-server-api-host\",\"1257\":\"192#dev-dsf-server-api-port\",\"1258\":\"192#dev-dsf-server-auth-client-certificate-header\",\"1259\":\"192#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1260\":\"192#dev-dsf-server-auth-oidc-back-channel-logout\",\"1261\":\"192#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1262\":\"192#dev-dsf-server-auth-oidc-bearer-token\",\"1263\":\"192#dev-dsf-server-auth-oidc-client-id\",\"1264\":\"192#dev-dsf-server-auth-oidc-client-secret\",\"1265\":\"192#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1266\":\"192#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1267\":\"192#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1268\":\"192#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1269\":\"192#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1270\":\"192#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1271\":\"192#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1272\":\"192#dev-dsf-server-auth-trust-client-certificate-cas\",\"1273\":\"192#dev-dsf-server-certificate\",\"1274\":\"192#dev-dsf-server-certificate-chain\",\"1275\":\"192#dev-dsf-server-certificate-key\",\"1276\":\"192#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1277\":\"192#dev-dsf-server-context-path\",\"1278\":\"192#dev-dsf-server-status-host\",\"1279\":\"192#dev-dsf-server-status-port\",\"1280\":\"193\",\"1281\":\"193#overview\",\"1282\":\"193#authorization-code-flow\",\"1283\":\"193#bearer-token-authentication\",\"1284\":\"193#additional-odic-configuration-parameter\",\"1285\":\"193#example\",\"1286\":\"194\",\"1287\":\"194#overview\",\"1288\":\"195\",\"1289\":\"195#app-server-ip\",\"1290\":\"195#https-server-name-port\",\"1291\":\"195#proxy-pass-connection-timeout-http\",\"1292\":\"195#proxy-pass-connection-timeout-ws\",\"1293\":\"195#proxy-pass-timeout-http\",\"1294\":\"195#proxy-pass-timeout-ws\",\"1295\":\"195#server-context-path\",\"1296\":\"195#ssl-ca-certificate-file\",\"1297\":\"195#ssl-ca-dn-request-file\",\"1298\":\"195#ssl-certificate-chain-file\",\"1299\":\"195#ssl-certificate-file\",\"1300\":\"195#ssl-certificate-key-file\",\"1301\":\"195#ssl-verify-client\",\"1302\":\"196\",\"1303\":\"196#overview\",\"1304\":\"197\",\"1305\":\"197#dev-dsf-server-api-host\",\"1306\":\"197#dev-dsf-server-api-port\",\"1307\":\"197#dev-dsf-server-auth-client-certificate-header\",\"1308\":\"197#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1309\":\"197#dev-dsf-server-auth-oidc-back-channel-logout\",\"1310\":\"197#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1311\":\"197#dev-dsf-server-auth-oidc-bearer-token\",\"1312\":\"197#dev-dsf-server-auth-oidc-client-id\",\"1313\":\"197#dev-dsf-server-auth-oidc-client-secret\",\"1314\":\"197#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1315\":\"197#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1316\":\"197#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1317\":\"197#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1318\":\"197#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1319\":\"197#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1320\":\"197#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1321\":\"197#dev-dsf-server-auth-trust-client-certificate-cas\",\"1322\":\"197#dev-dsf-server-certificate\",\"1323\":\"197#dev-dsf-server-certificate-chain\",\"1324\":\"197#dev-dsf-server-certificate-key\",\"1325\":\"197#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1326\":\"197#dev-dsf-server-context-path\",\"1327\":\"197#dev-dsf-server-status-host\",\"1328\":\"197#dev-dsf-server-status-port\",\"1329\":\"197#dev-dsf-bpe-db-liquibase-forceunlock\",\"1330\":\"197#dev-dsf-bpe-db-liquibase-lockwaittime\",\"1331\":\"197#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"1332\":\"197#dev-dsf-bpe-db-liquibase-username\",\"1333\":\"197#dev-dsf-bpe-db-url\",\"1334\":\"197#dev-dsf-bpe-db-user-camunda-group\",\"1335\":\"197#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"1336\":\"197#dev-dsf-bpe-db-user-camunda-username\",\"1337\":\"197#dev-dsf-bpe-db-user-group\",\"1338\":\"197#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"1339\":\"197#dev-dsf-bpe-db-user-username\",\"1340\":\"197#dev-dsf-bpe-debug-log-message-onactivityend\",\"1341\":\"197#dev-dsf-bpe-debug-log-message-onactivitystart\",\"1342\":\"197#dev-dsf-bpe-debug-log-message-variables\",\"1343\":\"197#dev-dsf-bpe-debug-log-message-variableslocal\",\"1344\":\"197#dev-dsf-bpe-fhir-client-certificate\",\"1345\":\"197#dev-dsf-bpe-fhir-client-certificate-private-key\",\"1346\":\"197#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"1347\":\"197#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"1348\":\"197#dev-dsf-bpe-fhir-client-local-timeout-read\",\"1349\":\"197#dev-dsf-bpe-fhir-client-local-verbose\",\"1350\":\"197#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"1351\":\"197#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"1352\":\"197#dev-dsf-bpe-fhir-client-remote-verbose\",\"1353\":\"197#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1354\":\"197#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1355\":\"197#dev-dsf-bpe-fhir-server-base-url\",\"1356\":\"197#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1357\":\"197#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1358\":\"197#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1359\":\"197#dev-dsf-bpe-mail-client-certificate\",\"1360\":\"197#dev-dsf-bpe-mail-client-certificate-private-key\",\"1361\":\"197#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1362\":\"197#dev-dsf-bpe-mail-fromaddress\",\"1363\":\"197#dev-dsf-bpe-mail-host\",\"1364\":\"197#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1365\":\"197#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1366\":\"197#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1367\":\"197#dev-dsf-bpe-mail-port\",\"1368\":\"197#dev-dsf-bpe-mail-replytoaddresses\",\"1369\":\"197#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1370\":\"197#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1371\":\"197#dev-dsf-bpe-mail-smime-p12keystore\",\"1372\":\"197#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1373\":\"197#dev-dsf-bpe-mail-toaddresses\",\"1374\":\"197#dev-dsf-bpe-mail-toaddressescc\",\"1375\":\"197#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1376\":\"197#dev-dsf-bpe-mail-username\",\"1377\":\"197#dev-dsf-bpe-mail-usesmtps\",\"1378\":\"197#dev-dsf-bpe-process-engine-corepoolsize\",\"1379\":\"197#dev-dsf-bpe-process-engine-maxpoolsize\",\"1380\":\"197#dev-dsf-bpe-process-engine-queuesize\",\"1381\":\"197#dev-dsf-bpe-process-excluded\",\"1382\":\"197#dev-dsf-bpe-process-fhir-server-retry-max\",\"1383\":\"197#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1384\":\"197#dev-dsf-bpe-process-plugin-directroy\",\"1385\":\"197#dev-dsf-bpe-process-retired\",\"1386\":\"197#dev-dsf-bpe-process-threads\",\"1387\":\"197#dev-dsf-proxy-noproxy\",\"1388\":\"197#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1389\":\"197#dev-dsf-proxy-url\",\"1390\":\"197#dev-dsf-proxy-username\",\"1391\":\"198\",\"1392\":\"198#overview\",\"1393\":\"199\",\"1394\":\"199#app-server-ip\",\"1395\":\"199#https-server-name-port\",\"1396\":\"199#proxy-pass-connection-timeout-http\",\"1397\":\"199#proxy-pass-connection-timeout-ws\",\"1398\":\"199#proxy-pass-timeout-http\",\"1399\":\"199#proxy-pass-timeout-ws\",\"1400\":\"199#server-context-path\",\"1401\":\"199#ssl-ca-certificate-file\",\"1402\":\"199#ssl-ca-dn-request-file\",\"1403\":\"199#ssl-certificate-chain-file\",\"1404\":\"199#ssl-certificate-file\",\"1405\":\"199#ssl-certificate-key-file\",\"1406\":\"199#ssl-verify-client\",\"1407\":\"200\",\"1408\":\"200#overview\",\"1409\":\"201\",\"1410\":\"201#overview\",\"1411\":\"201#matching-users\",\"1412\":\"201#thumbprint\",\"1413\":\"201#email\",\"1414\":\"201#token-role-and-token-group\",\"1415\":\"201#dsf-and-practitioner-roles\",\"1416\":\"201#dsf-role\",\"1417\":\"201#practitioner-role\",\"1418\":\"201#examples\",\"1419\":\"202\",\"1420\":\"202#dev-dsf-fhir-client-certificate\",\"1421\":\"202#dev-dsf-fhir-client-certificate-private-key\",\"1422\":\"202#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"1423\":\"202#dev-dsf-fhir-client-timeout-connect\",\"1424\":\"202#dev-dsf-fhir-client-timeout-read\",\"1425\":\"202#dev-dsf-fhir-client-trust-server-certificate-cas\",\"1426\":\"202#dev-dsf-fhir-client-verbose\",\"1427\":\"202#dev-dsf-fhir-db-liquibase-forceunlock\",\"1428\":\"202#dev-dsf-fhir-db-liquibase-lockwaittime\",\"1429\":\"202#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"1430\":\"202#dev-dsf-fhir-db-liquibase-username\",\"1431\":\"202#dev-dsf-fhir-db-url\",\"1432\":\"202#dev-dsf-fhir-db-user-group\",\"1433\":\"202#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"1434\":\"202#dev-dsf-fhir-db-user-permanent-delete-group\",\"1435\":\"202#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"1436\":\"202#dev-dsf-fhir-db-user-permanent-delete-username\",\"1437\":\"202#dev-dsf-fhir-db-user-username\",\"1438\":\"202#dev-dsf-fhir-server-base-url\",\"1439\":\"202#dev-dsf-fhir-server-init-bundle\",\"1440\":\"202#dev-dsf-fhir-server-organization-identifier-value\",\"1441\":\"202#dev-dsf-fhir-server-organization-thumbprint\",\"1442\":\"202#dev-dsf-fhir-server-page-count\",\"1443\":\"202#dev-dsf-fhir-server-roleconfig\",\"1444\":\"202#dev-dsf-fhir-server-static-resource-cache\",\"1445\":\"202#dev-dsf-proxy-noproxy\",\"1446\":\"202#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1447\":\"202#dev-dsf-proxy-url\",\"1448\":\"202#dev-dsf-proxy-username\",\"1449\":\"202#dev-dsf-server-api-host\",\"1450\":\"202#dev-dsf-server-api-port\",\"1451\":\"202#dev-dsf-server-auth-client-certificate-header\",\"1452\":\"202#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1453\":\"202#dev-dsf-server-auth-oidc-back-channel-logout\",\"1454\":\"202#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1455\":\"202#dev-dsf-server-auth-oidc-bearer-token\",\"1456\":\"202#dev-dsf-server-auth-oidc-client-id\",\"1457\":\"202#dev-dsf-server-auth-oidc-client-secret\",\"1458\":\"202#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1459\":\"202#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1460\":\"202#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1461\":\"202#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1462\":\"202#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1463\":\"202#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1464\":\"202#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1465\":\"202#dev-dsf-server-auth-trust-client-certificate-cas\",\"1466\":\"202#dev-dsf-server-certificate\",\"1467\":\"202#dev-dsf-server-certificate-chain\",\"1468\":\"202#dev-dsf-server-certificate-key\",\"1469\":\"202#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1470\":\"202#dev-dsf-server-context-path\",\"1471\":\"202#dev-dsf-server-status-host\",\"1472\":\"202#dev-dsf-server-status-port\",\"1473\":\"203\",\"1474\":\"203#overview\",\"1475\":\"203#authorization-code-flow\",\"1476\":\"203#bearer-token-authentication\",\"1477\":\"203#additional-odic-configuration-parameter\",\"1478\":\"203#example\",\"1479\":\"204\",\"1480\":\"204#overview\",\"1481\":\"205\",\"1482\":\"205#overview\",\"1483\":\"205#matching-users\",\"1484\":\"205#thumbprint\",\"1485\":\"205#email\",\"1486\":\"205#token-role-and-token-group\",\"1487\":\"205#dsf-and-practitioner-roles\",\"1488\":\"205#dsf-role\",\"1489\":\"205#practitioner-role\",\"1490\":\"205#examples\",\"1491\":\"206\",\"1492\":\"206#dev-dsf-server-api-host\",\"1493\":\"206#dev-dsf-server-api-port\",\"1494\":\"206#dev-dsf-server-auth-client-certificate-header\",\"1495\":\"206#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1496\":\"206#dev-dsf-server-auth-oidc-back-channel-logout\",\"1497\":\"206#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1498\":\"206#dev-dsf-server-auth-oidc-bearer-token\",\"1499\":\"206#dev-dsf-server-auth-oidc-client-id\",\"1500\":\"206#dev-dsf-server-auth-oidc-client-secret\",\"1501\":\"206#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1502\":\"206#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1503\":\"206#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1504\":\"206#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1505\":\"206#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1506\":\"206#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1507\":\"206#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1508\":\"206#dev-dsf-server-auth-trust-client-certificate-cas\",\"1509\":\"206#dev-dsf-server-certificate\",\"1510\":\"206#dev-dsf-server-certificate-chain\",\"1511\":\"206#dev-dsf-server-certificate-key\",\"1512\":\"206#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1513\":\"206#dev-dsf-server-context-path\",\"1514\":\"206#dev-dsf-server-status-host\",\"1515\":\"206#dev-dsf-server-status-port\",\"1516\":\"206#dev-dsf-bpe-db-liquibase-forceunlock\",\"1517\":\"206#dev-dsf-bpe-db-liquibase-lockwaittime\",\"1518\":\"206#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"1519\":\"206#dev-dsf-bpe-db-liquibase-username\",\"1520\":\"206#dev-dsf-bpe-db-url\",\"1521\":\"206#dev-dsf-bpe-db-user-camunda-group\",\"1522\":\"206#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"1523\":\"206#dev-dsf-bpe-db-user-camunda-username\",\"1524\":\"206#dev-dsf-bpe-db-user-group\",\"1525\":\"206#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"1526\":\"206#dev-dsf-bpe-db-user-username\",\"1527\":\"206#dev-dsf-bpe-debug-log-message-currentuser\",\"1528\":\"206#dev-dsf-bpe-debug-log-message-dbstatement\",\"1529\":\"206#dev-dsf-bpe-debug-log-message-onactivityend\",\"1530\":\"206#dev-dsf-bpe-debug-log-message-onactivitystart\",\"1531\":\"206#dev-dsf-bpe-debug-log-message-variables\",\"1532\":\"206#dev-dsf-bpe-debug-log-message-variableslocal\",\"1533\":\"206#dev-dsf-bpe-debug-log-message-webservicerequest\",\"1534\":\"206#dev-dsf-bpe-fhir-client-certificate\",\"1535\":\"206#dev-dsf-bpe-fhir-client-certificate-private-key\",\"1536\":\"206#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"1537\":\"206#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"1538\":\"206#dev-dsf-bpe-fhir-client-local-timeout-read\",\"1539\":\"206#dev-dsf-bpe-fhir-client-local-verbose\",\"1540\":\"206#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"1541\":\"206#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"1542\":\"206#dev-dsf-bpe-fhir-client-remote-verbose\",\"1543\":\"206#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1544\":\"206#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1545\":\"206#dev-dsf-bpe-fhir-server-base-url\",\"1546\":\"206#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1547\":\"206#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1548\":\"206#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1549\":\"206#dev-dsf-bpe-mail-client-certificate\",\"1550\":\"206#dev-dsf-bpe-mail-client-certificate-private-key\",\"1551\":\"206#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1552\":\"206#dev-dsf-bpe-mail-fromaddress\",\"1553\":\"206#dev-dsf-bpe-mail-host\",\"1554\":\"206#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1555\":\"206#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1556\":\"206#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1557\":\"206#dev-dsf-bpe-mail-port\",\"1558\":\"206#dev-dsf-bpe-mail-replytoaddresses\",\"1559\":\"206#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1560\":\"206#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1561\":\"206#dev-dsf-bpe-mail-smime-p12keystore\",\"1562\":\"206#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1563\":\"206#dev-dsf-bpe-mail-toaddresses\",\"1564\":\"206#dev-dsf-bpe-mail-toaddressescc\",\"1565\":\"206#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1566\":\"206#dev-dsf-bpe-mail-username\",\"1567\":\"206#dev-dsf-bpe-mail-usesmtps\",\"1568\":\"206#dev-dsf-bpe-process-engine-corepoolsize\",\"1569\":\"206#dev-dsf-bpe-process-engine-maxpoolsize\",\"1570\":\"206#dev-dsf-bpe-process-engine-queuesize\",\"1571\":\"206#dev-dsf-bpe-process-excluded\",\"1572\":\"206#dev-dsf-bpe-process-fhir-server-retry-max\",\"1573\":\"206#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1574\":\"206#dev-dsf-bpe-process-plugin-directroy\",\"1575\":\"206#dev-dsf-bpe-process-retired\",\"1576\":\"206#dev-dsf-bpe-process-threads\",\"1577\":\"206#dev-dsf-bpe-server-base-url\",\"1578\":\"206#dev-dsf-bpe-server-roleconfig\",\"1579\":\"206#dev-dsf-bpe-server-static-resource-cache\",\"1580\":\"206#dev-dsf-bpe-server-ui-theme\",\"1581\":\"206#dev-dsf-proxy-noproxy\",\"1582\":\"206#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1583\":\"206#dev-dsf-proxy-url\",\"1584\":\"206#dev-dsf-proxy-username\",\"1585\":\"207\",\"1586\":\"207#overview\",\"1587\":\"207#authorization-code-flow\",\"1588\":\"207#additional-odic-configuration-parameter\",\"1589\":\"207#example\",\"1590\":\"208\",\"1591\":\"208#overview\",\"1592\":\"209\",\"1593\":\"209#app-server-ip\",\"1594\":\"209#https-server-name-port\",\"1595\":\"209#proxy-pass-connection-timeout-http\",\"1596\":\"209#proxy-pass-connection-timeout-ws\",\"1597\":\"209#proxy-pass-timeout-http\",\"1598\":\"209#proxy-pass-timeout-ws\",\"1599\":\"209#server-context-path\",\"1600\":\"209#ssl-ca-certificate-file\",\"1601\":\"209#ssl-ca-dn-request-file\",\"1602\":\"209#ssl-certificate-chain-file\",\"1603\":\"209#ssl-certificate-file\",\"1604\":\"209#ssl-certificate-key-file\",\"1605\":\"209#ssl-verify-client\",\"1606\":\"210\",\"1607\":\"210#overview\",\"1608\":\"211\",\"1609\":\"211#overview\",\"1610\":\"211#matching-users\",\"1611\":\"211#thumbprint\",\"1612\":\"211#email\",\"1613\":\"211#token-role-and-token-group\",\"1614\":\"211#dsf-and-practitioner-roles\",\"1615\":\"211#dsf-role\",\"1616\":\"211#practitioner-role\",\"1617\":\"211#examples\",\"1618\":\"212\",\"1619\":\"212#dev-dsf-fhir-client-certificate\",\"1620\":\"212#dev-dsf-fhir-client-certificate-private-key\",\"1621\":\"212#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"1622\":\"212#dev-dsf-fhir-client-timeout-connect\",\"1623\":\"212#dev-dsf-fhir-client-timeout-read\",\"1624\":\"212#dev-dsf-fhir-client-trust-server-certificate-cas\",\"1625\":\"212#dev-dsf-fhir-client-verbose\",\"1626\":\"212#dev-dsf-fhir-db-liquibase-forceunlock\",\"1627\":\"212#dev-dsf-fhir-db-liquibase-lockwaittime\",\"1628\":\"212#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"1629\":\"212#dev-dsf-fhir-db-liquibase-username\",\"1630\":\"212#dev-dsf-fhir-db-url\",\"1631\":\"212#dev-dsf-fhir-db-user-group\",\"1632\":\"212#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"1633\":\"212#dev-dsf-fhir-db-user-permanent-delete-group\",\"1634\":\"212#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"1635\":\"212#dev-dsf-fhir-db-user-permanent-delete-username\",\"1636\":\"212#dev-dsf-fhir-db-user-username\",\"1637\":\"212#dev-dsf-fhir-debug-log-message-currentuser\",\"1638\":\"212#dev-dsf-fhir-debug-log-message-dbstatement\",\"1639\":\"212#dev-dsf-fhir-debug-log-message-webservicerequest\",\"1640\":\"212#dev-dsf-fhir-server-base-url\",\"1641\":\"212#dev-dsf-fhir-server-init-bundle\",\"1642\":\"212#dev-dsf-fhir-server-organization-identifier-value\",\"1643\":\"212#dev-dsf-fhir-server-organization-thumbprint\",\"1644\":\"212#dev-dsf-fhir-server-page-count\",\"1645\":\"212#dev-dsf-fhir-server-roleconfig\",\"1646\":\"212#dev-dsf-fhir-server-static-resource-cache\",\"1647\":\"212#dev-dsf-fhir-server-ui-theme\",\"1648\":\"212#dev-dsf-proxy-noproxy\",\"1649\":\"212#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1650\":\"212#dev-dsf-proxy-url\",\"1651\":\"212#dev-dsf-proxy-username\",\"1652\":\"212#dev-dsf-server-api-host\",\"1653\":\"212#dev-dsf-server-api-port\",\"1654\":\"212#dev-dsf-server-auth-client-certificate-header\",\"1655\":\"212#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1656\":\"212#dev-dsf-server-auth-oidc-back-channel-logout\",\"1657\":\"212#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1658\":\"212#dev-dsf-server-auth-oidc-bearer-token\",\"1659\":\"212#dev-dsf-server-auth-oidc-client-id\",\"1660\":\"212#dev-dsf-server-auth-oidc-client-secret\",\"1661\":\"212#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1662\":\"212#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1663\":\"212#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1664\":\"212#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1665\":\"212#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1666\":\"212#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1667\":\"212#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1668\":\"212#dev-dsf-server-auth-trust-client-certificate-cas\",\"1669\":\"212#dev-dsf-server-certificate\",\"1670\":\"212#dev-dsf-server-certificate-chain\",\"1671\":\"212#dev-dsf-server-certificate-key\",\"1672\":\"212#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1673\":\"212#dev-dsf-server-context-path\",\"1674\":\"212#dev-dsf-server-status-host\",\"1675\":\"212#dev-dsf-server-status-port\",\"1676\":\"213\",\"1677\":\"213#overview\",\"1678\":\"213#authorization-code-flow\",\"1679\":\"213#bearer-token-authentication\",\"1680\":\"213#additional-odic-configuration-parameter\",\"1681\":\"213#example\",\"1682\":\"214\",\"1683\":\"214#overview\",\"1684\":\"215\",\"1685\":\"215#app-server-ip\",\"1686\":\"215#https-server-name-port\",\"1687\":\"215#proxy-pass-connection-timeout-http\",\"1688\":\"215#proxy-pass-connection-timeout-ws\",\"1689\":\"215#proxy-pass-timeout-http\",\"1690\":\"215#proxy-pass-timeout-ws\",\"1691\":\"215#server-context-path\",\"1692\":\"215#ssl-ca-certificate-file\",\"1693\":\"215#ssl-ca-dn-request-file\",\"1694\":\"215#ssl-certificate-chain-file\",\"1695\":\"215#ssl-certificate-file\",\"1696\":\"215#ssl-certificate-key-file\",\"1697\":\"215#ssl-verify-client\",\"1698\":\"216\",\"1699\":\"216#overview\",\"1700\":\"217\",\"1701\":\"217#dev-dsf-server-api-host\",\"1702\":\"217#dev-dsf-server-api-port\",\"1703\":\"217#dev-dsf-server-auth-client-certificate-header\",\"1704\":\"217#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1705\":\"217#dev-dsf-server-auth-oidc-back-channel-logout\",\"1706\":\"217#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1707\":\"217#dev-dsf-server-auth-oidc-bearer-token\",\"1708\":\"217#dev-dsf-server-auth-oidc-client-id\",\"1709\":\"217#dev-dsf-server-auth-oidc-client-secret\",\"1710\":\"217#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1711\":\"217#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1712\":\"217#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1713\":\"217#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1714\":\"217#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1715\":\"217#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1716\":\"217#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1717\":\"217#dev-dsf-server-auth-trust-client-certificate-cas\",\"1718\":\"217#dev-dsf-server-certificate\",\"1719\":\"217#dev-dsf-server-certificate-chain\",\"1720\":\"217#dev-dsf-server-certificate-key\",\"1721\":\"217#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1722\":\"217#dev-dsf-server-context-path\",\"1723\":\"217#dev-dsf-server-status-host\",\"1724\":\"217#dev-dsf-server-status-port\",\"1725\":\"217#dev-dsf-bpe-db-liquibase-forceunlock\",\"1726\":\"217#dev-dsf-bpe-db-liquibase-lockwaittime\",\"1727\":\"217#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"1728\":\"217#dev-dsf-bpe-db-liquibase-username\",\"1729\":\"217#dev-dsf-bpe-db-url\",\"1730\":\"217#dev-dsf-bpe-db-user-camunda-group\",\"1731\":\"217#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"1732\":\"217#dev-dsf-bpe-db-user-camunda-username\",\"1733\":\"217#dev-dsf-bpe-db-user-group\",\"1734\":\"217#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"1735\":\"217#dev-dsf-bpe-db-user-username\",\"1736\":\"217#dev-dsf-bpe-debug-log-message-onactivityend\",\"1737\":\"217#dev-dsf-bpe-debug-log-message-onactivitystart\",\"1738\":\"217#dev-dsf-bpe-debug-log-message-variables\",\"1739\":\"217#dev-dsf-bpe-debug-log-message-variableslocal\",\"1740\":\"217#dev-dsf-bpe-fhir-client-certificate\",\"1741\":\"217#dev-dsf-bpe-fhir-client-certificate-private-key\",\"1742\":\"217#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"1743\":\"217#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"1744\":\"217#dev-dsf-bpe-fhir-client-local-timeout-read\",\"1745\":\"217#dev-dsf-bpe-fhir-client-local-verbose\",\"1746\":\"217#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"1747\":\"217#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"1748\":\"217#dev-dsf-bpe-fhir-client-remote-verbose\",\"1749\":\"217#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1750\":\"217#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1751\":\"217#dev-dsf-bpe-fhir-server-base-url\",\"1752\":\"217#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1753\":\"217#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1754\":\"217#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1755\":\"217#dev-dsf-bpe-mail-client-certificate\",\"1756\":\"217#dev-dsf-bpe-mail-client-certificate-private-key\",\"1757\":\"217#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1758\":\"217#dev-dsf-bpe-mail-fromaddress\",\"1759\":\"217#dev-dsf-bpe-mail-host\",\"1760\":\"217#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1761\":\"217#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1762\":\"217#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1763\":\"217#dev-dsf-bpe-mail-port\",\"1764\":\"217#dev-dsf-bpe-mail-replytoaddresses\",\"1765\":\"217#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1766\":\"217#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1767\":\"217#dev-dsf-bpe-mail-smime-p12keystore\",\"1768\":\"217#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1769\":\"217#dev-dsf-bpe-mail-toaddresses\",\"1770\":\"217#dev-dsf-bpe-mail-toaddressescc\",\"1771\":\"217#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1772\":\"217#dev-dsf-bpe-mail-username\",\"1773\":\"217#dev-dsf-bpe-mail-usesmtps\",\"1774\":\"217#dev-dsf-bpe-process-engine-corepoolsize\",\"1775\":\"217#dev-dsf-bpe-process-engine-maxpoolsize\",\"1776\":\"217#dev-dsf-bpe-process-engine-queuesize\",\"1777\":\"217#dev-dsf-bpe-process-excluded\",\"1778\":\"217#dev-dsf-bpe-process-fhir-server-retry-max\",\"1779\":\"217#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1780\":\"217#dev-dsf-bpe-process-plugin-directroy\",\"1781\":\"217#dev-dsf-bpe-process-retired\",\"1782\":\"217#dev-dsf-bpe-process-threads\",\"1783\":\"217#dev-dsf-proxy-noproxy\",\"1784\":\"217#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1785\":\"217#dev-dsf-proxy-url\",\"1786\":\"217#dev-dsf-proxy-username\",\"1787\":\"218\",\"1788\":\"218#overview\",\"1789\":\"219\",\"1790\":\"219#overview\",\"1791\":\"219#matching-users\",\"1792\":\"219#thumbprint\",\"1793\":\"219#email\",\"1794\":\"219#token-role-and-token-group\",\"1795\":\"219#dsf-and-practitioner-roles\",\"1796\":\"219#dsf-role\",\"1797\":\"219#practitioner-role\",\"1798\":\"219#examples\",\"1799\":\"220\",\"1800\":\"220#dev-dsf-fhir-client-certificate\",\"1801\":\"220#dev-dsf-fhir-client-certificate-private-key\",\"1802\":\"220#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"1803\":\"220#dev-dsf-fhir-client-timeout-connect\",\"1804\":\"220#dev-dsf-fhir-client-timeout-read\",\"1805\":\"220#dev-dsf-fhir-client-trust-server-certificate-cas\",\"1806\":\"220#dev-dsf-fhir-client-verbose\",\"1807\":\"220#dev-dsf-fhir-db-liquibase-forceunlock\",\"1808\":\"220#dev-dsf-fhir-db-liquibase-lockwaittime\",\"1809\":\"220#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"1810\":\"220#dev-dsf-fhir-db-liquibase-username\",\"1811\":\"220#dev-dsf-fhir-db-url\",\"1812\":\"220#dev-dsf-fhir-db-user-group\",\"1813\":\"220#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"1814\":\"220#dev-dsf-fhir-db-user-permanent-delete-group\",\"1815\":\"220#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"1816\":\"220#dev-dsf-fhir-db-user-permanent-delete-username\",\"1817\":\"220#dev-dsf-fhir-db-user-username\",\"1818\":\"220#dev-dsf-fhir-server-base-url\",\"1819\":\"220#dev-dsf-fhir-server-init-bundle\",\"1820\":\"220#dev-dsf-fhir-server-organization-identifier-value\",\"1821\":\"220#dev-dsf-fhir-server-organization-thumbprint\",\"1822\":\"220#dev-dsf-fhir-server-page-count\",\"1823\":\"220#dev-dsf-fhir-server-roleconfig\",\"1824\":\"220#dev-dsf-fhir-server-static-resource-cache\",\"1825\":\"220#dev-dsf-proxy-noproxy\",\"1826\":\"220#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1827\":\"220#dev-dsf-proxy-url\",\"1828\":\"220#dev-dsf-proxy-username\",\"1829\":\"220#dev-dsf-server-api-host\",\"1830\":\"220#dev-dsf-server-api-port\",\"1831\":\"220#dev-dsf-server-auth-client-certificate-header\",\"1832\":\"220#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1833\":\"220#dev-dsf-server-auth-oidc-back-channel-logout\",\"1834\":\"220#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1835\":\"220#dev-dsf-server-auth-oidc-bearer-token\",\"1836\":\"220#dev-dsf-server-auth-oidc-client-id\",\"1837\":\"220#dev-dsf-server-auth-oidc-client-secret\",\"1838\":\"220#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1839\":\"220#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1840\":\"220#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1841\":\"220#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1842\":\"220#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1843\":\"220#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1844\":\"220#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1845\":\"220#dev-dsf-server-auth-trust-client-certificate-cas\",\"1846\":\"220#dev-dsf-server-certificate\",\"1847\":\"220#dev-dsf-server-certificate-chain\",\"1848\":\"220#dev-dsf-server-certificate-key\",\"1849\":\"220#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1850\":\"220#dev-dsf-server-context-path\",\"1851\":\"220#dev-dsf-server-status-host\",\"1852\":\"220#dev-dsf-server-status-port\",\"1853\":\"221\",\"1854\":\"221#overview\",\"1855\":\"221#authorization-code-flow\",\"1856\":\"221#bearer-token-authentication\",\"1857\":\"221#additional-odic-configuration-parameter\",\"1858\":\"221#example\",\"1859\":\"222\",\"1860\":\"222#overview\",\"1861\":\"223\",\"1862\":\"223#app-server-ip\",\"1863\":\"223#https-server-name-port\",\"1864\":\"223#proxy-pass-connection-timeout-http\",\"1865\":\"223#proxy-pass-connection-timeout-ws\",\"1866\":\"223#proxy-pass-timeout-http\",\"1867\":\"223#proxy-pass-timeout-ws\",\"1868\":\"223#server-context-path\",\"1869\":\"223#ssl-ca-certificate-file\",\"1870\":\"223#ssl-ca-dn-request-file\",\"1871\":\"223#ssl-certificate-chain-file\",\"1872\":\"223#ssl-certificate-file\",\"1873\":\"223#ssl-certificate-key-file\",\"1874\":\"223#ssl-verify-client\",\"1875\":\"224\",\"1876\":\"224#overview\",\"1877\":\"225\",\"1878\":\"225#overview\",\"1879\":\"225#matching-users\",\"1880\":\"225#thumbprint\",\"1881\":\"225#email\",\"1882\":\"225#token-role-and-token-group\",\"1883\":\"225#dsf-and-practitioner-roles\",\"1884\":\"225#dsf-role\",\"1885\":\"225#practitioner-role\",\"1886\":\"225#examples\",\"1887\":\"226\",\"1888\":\"226#dev-dsf-server-api-host\",\"1889\":\"226#dev-dsf-server-api-port\",\"1890\":\"226#dev-dsf-server-auth-client-certificate-header\",\"1891\":\"226#dev-dsf-server-auth-oidc-authorization-code-flow\",\"1892\":\"226#dev-dsf-server-auth-oidc-back-channel-logout\",\"1893\":\"226#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"1894\":\"226#dev-dsf-server-auth-oidc-bearer-token\",\"1895\":\"226#dev-dsf-server-auth-oidc-client-id\",\"1896\":\"226#dev-dsf-server-auth-oidc-client-secret\",\"1897\":\"226#dev-dsf-server-auth-oidc-provider-client-certificate\",\"1898\":\"226#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"1899\":\"226#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"1900\":\"226#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"1901\":\"226#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"1902\":\"226#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"1903\":\"226#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"1904\":\"226#dev-dsf-server-auth-trust-client-certificate-cas\",\"1905\":\"226#dev-dsf-server-certificate\",\"1906\":\"226#dev-dsf-server-certificate-chain\",\"1907\":\"226#dev-dsf-server-certificate-key\",\"1908\":\"226#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"1909\":\"226#dev-dsf-server-context-path\",\"1910\":\"226#dev-dsf-server-status-host\",\"1911\":\"226#dev-dsf-server-status-port\",\"1912\":\"226#dev-dsf-bpe-db-liquibase-forceunlock\",\"1913\":\"226#dev-dsf-bpe-db-liquibase-lockwaittime\",\"1914\":\"226#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"1915\":\"226#dev-dsf-bpe-db-liquibase-username\",\"1916\":\"226#dev-dsf-bpe-db-url\",\"1917\":\"226#dev-dsf-bpe-db-user-camunda-group\",\"1918\":\"226#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"1919\":\"226#dev-dsf-bpe-db-user-camunda-username\",\"1920\":\"226#dev-dsf-bpe-db-user-group\",\"1921\":\"226#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"1922\":\"226#dev-dsf-bpe-db-user-username\",\"1923\":\"226#dev-dsf-bpe-debug-log-message-currentuser\",\"1924\":\"226#dev-dsf-bpe-debug-log-message-dbstatement\",\"1925\":\"226#dev-dsf-bpe-debug-log-message-onactivityend\",\"1926\":\"226#dev-dsf-bpe-debug-log-message-onactivitystart\",\"1927\":\"226#dev-dsf-bpe-debug-log-message-variables\",\"1928\":\"226#dev-dsf-bpe-debug-log-message-variableslocal\",\"1929\":\"226#dev-dsf-bpe-debug-log-message-webservicerequest\",\"1930\":\"226#dev-dsf-bpe-fhir-client-certificate\",\"1931\":\"226#dev-dsf-bpe-fhir-client-certificate-private-key\",\"1932\":\"226#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"1933\":\"226#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"1934\":\"226#dev-dsf-bpe-fhir-client-local-timeout-read\",\"1935\":\"226#dev-dsf-bpe-fhir-client-local-verbose\",\"1936\":\"226#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"1937\":\"226#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"1938\":\"226#dev-dsf-bpe-fhir-client-remote-verbose\",\"1939\":\"226#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"1940\":\"226#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"1941\":\"226#dev-dsf-bpe-fhir-server-base-url\",\"1942\":\"226#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"1943\":\"226#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"1944\":\"226#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"1945\":\"226#dev-dsf-bpe-mail-client-certificate\",\"1946\":\"226#dev-dsf-bpe-mail-client-certificate-private-key\",\"1947\":\"226#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"1948\":\"226#dev-dsf-bpe-mail-fromaddress\",\"1949\":\"226#dev-dsf-bpe-mail-host\",\"1950\":\"226#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"1951\":\"226#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"1952\":\"226#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"1953\":\"226#dev-dsf-bpe-mail-port\",\"1954\":\"226#dev-dsf-bpe-mail-replytoaddresses\",\"1955\":\"226#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"1956\":\"226#dev-dsf-bpe-mail-sendtestmailonstartup\",\"1957\":\"226#dev-dsf-bpe-mail-smime-p12keystore\",\"1958\":\"226#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"1959\":\"226#dev-dsf-bpe-mail-toaddresses\",\"1960\":\"226#dev-dsf-bpe-mail-toaddressescc\",\"1961\":\"226#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"1962\":\"226#dev-dsf-bpe-mail-username\",\"1963\":\"226#dev-dsf-bpe-mail-usesmtps\",\"1964\":\"226#dev-dsf-bpe-process-engine-corepoolsize\",\"1965\":\"226#dev-dsf-bpe-process-engine-maxpoolsize\",\"1966\":\"226#dev-dsf-bpe-process-engine-queuesize\",\"1967\":\"226#dev-dsf-bpe-process-excluded\",\"1968\":\"226#dev-dsf-bpe-process-fhir-server-retry-max\",\"1969\":\"226#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"1970\":\"226#dev-dsf-bpe-process-plugin-directroy\",\"1971\":\"226#dev-dsf-bpe-process-retired\",\"1972\":\"226#dev-dsf-bpe-process-threads\",\"1973\":\"226#dev-dsf-bpe-server-base-url\",\"1974\":\"226#dev-dsf-bpe-server-roleconfig\",\"1975\":\"226#dev-dsf-bpe-server-static-resource-cache\",\"1976\":\"226#dev-dsf-bpe-server-ui-theme\",\"1977\":\"226#dev-dsf-proxy-noproxy\",\"1978\":\"226#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"1979\":\"226#dev-dsf-proxy-url\",\"1980\":\"226#dev-dsf-proxy-username\",\"1981\":\"227\",\"1982\":\"227#overview\",\"1983\":\"227#authorization-code-flow\",\"1984\":\"227#additional-odic-configuration-parameter\",\"1985\":\"227#example\",\"1986\":\"228\",\"1987\":\"228#overview\",\"1988\":\"229\",\"1989\":\"229#app-server-ip\",\"1990\":\"229#https-server-name-port\",\"1991\":\"229#proxy-pass-connection-timeout-http\",\"1992\":\"229#proxy-pass-connection-timeout-ws\",\"1993\":\"229#proxy-pass-timeout-http\",\"1994\":\"229#proxy-pass-timeout-ws\",\"1995\":\"229#server-context-path\",\"1996\":\"229#ssl-ca-certificate-file\",\"1997\":\"229#ssl-ca-dn-request-file\",\"1998\":\"229#ssl-certificate-chain-file\",\"1999\":\"229#ssl-certificate-file\",\"2000\":\"229#ssl-certificate-key-file\",\"2001\":\"229#ssl-verify-client\",\"2002\":\"230\",\"2003\":\"230#overview\",\"2004\":\"231\",\"2005\":\"231#overview\",\"2006\":\"231#matching-users\",\"2007\":\"231#thumbprint\",\"2008\":\"231#email\",\"2009\":\"231#token-role-and-token-group\",\"2010\":\"231#dsf-and-practitioner-roles\",\"2011\":\"231#dsf-role\",\"2012\":\"231#practitioner-role\",\"2013\":\"231#examples\",\"2014\":\"232\",\"2015\":\"232#dev-dsf-fhir-client-certificate\",\"2016\":\"232#dev-dsf-fhir-client-certificate-private-key\",\"2017\":\"232#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"2018\":\"232#dev-dsf-fhir-client-timeout-connect\",\"2019\":\"232#dev-dsf-fhir-client-timeout-read\",\"2020\":\"232#dev-dsf-fhir-client-trust-server-certificate-cas\",\"2021\":\"232#dev-dsf-fhir-client-verbose\",\"2022\":\"232#dev-dsf-fhir-db-liquibase-forceunlock\",\"2023\":\"232#dev-dsf-fhir-db-liquibase-lockwaittime\",\"2024\":\"232#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"2025\":\"232#dev-dsf-fhir-db-liquibase-username\",\"2026\":\"232#dev-dsf-fhir-db-url\",\"2027\":\"232#dev-dsf-fhir-db-user-group\",\"2028\":\"232#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"2029\":\"232#dev-dsf-fhir-db-user-permanent-delete-group\",\"2030\":\"232#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"2031\":\"232#dev-dsf-fhir-db-user-permanent-delete-username\",\"2032\":\"232#dev-dsf-fhir-db-user-username\",\"2033\":\"232#dev-dsf-fhir-debug-log-message-currentuser\",\"2034\":\"232#dev-dsf-fhir-debug-log-message-dbstatement\",\"2035\":\"232#dev-dsf-fhir-debug-log-message-webservicerequest\",\"2036\":\"232#dev-dsf-fhir-server-base-url\",\"2037\":\"232#dev-dsf-fhir-server-init-bundle\",\"2038\":\"232#dev-dsf-fhir-server-organization-identifier-value\",\"2039\":\"232#dev-dsf-fhir-server-organization-thumbprint\",\"2040\":\"232#dev-dsf-fhir-server-page-count\",\"2041\":\"232#dev-dsf-fhir-server-roleconfig\",\"2042\":\"232#dev-dsf-fhir-server-static-resource-cache\",\"2043\":\"232#dev-dsf-fhir-server-ui-theme\",\"2044\":\"232#dev-dsf-proxy-noproxy\",\"2045\":\"232#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"2046\":\"232#dev-dsf-proxy-url\",\"2047\":\"232#dev-dsf-proxy-username\",\"2048\":\"232#dev-dsf-server-api-host\",\"2049\":\"232#dev-dsf-server-api-port\",\"2050\":\"232#dev-dsf-server-auth-client-certificate-header\",\"2051\":\"232#dev-dsf-server-auth-oidc-authorization-code-flow\",\"2052\":\"232#dev-dsf-server-auth-oidc-back-channel-logout\",\"2053\":\"232#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"2054\":\"232#dev-dsf-server-auth-oidc-bearer-token\",\"2055\":\"232#dev-dsf-server-auth-oidc-client-id\",\"2056\":\"232#dev-dsf-server-auth-oidc-client-secret\",\"2057\":\"232#dev-dsf-server-auth-oidc-provider-client-certificate\",\"2058\":\"232#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"2059\":\"232#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"2060\":\"232#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"2061\":\"232#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"2062\":\"232#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"2063\":\"232#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"2064\":\"232#dev-dsf-server-auth-trust-client-certificate-cas\",\"2065\":\"232#dev-dsf-server-certificate\",\"2066\":\"232#dev-dsf-server-certificate-chain\",\"2067\":\"232#dev-dsf-server-certificate-key\",\"2068\":\"232#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"2069\":\"232#dev-dsf-server-context-path\",\"2070\":\"232#dev-dsf-server-status-host\",\"2071\":\"232#dev-dsf-server-status-port\",\"2072\":\"233\",\"2073\":\"233#overview\",\"2074\":\"233#authorization-code-flow\",\"2075\":\"233#bearer-token-authentication\",\"2076\":\"233#additional-odic-configuration-parameter\",\"2077\":\"233#example\",\"2078\":\"234\",\"2079\":\"234#overview\",\"2080\":\"235\",\"2081\":\"235#app-server-ip\",\"2082\":\"235#https-server-name-port\",\"2083\":\"235#proxy-pass-connection-timeout-http\",\"2084\":\"235#proxy-pass-connection-timeout-ws\",\"2085\":\"235#proxy-pass-timeout-http\",\"2086\":\"235#proxy-pass-timeout-ws\",\"2087\":\"235#server-context-path\",\"2088\":\"235#ssl-ca-certificate-file\",\"2089\":\"235#ssl-ca-dn-request-file\",\"2090\":\"235#ssl-certificate-chain-file\",\"2091\":\"235#ssl-certificate-file\",\"2092\":\"235#ssl-certificate-key-file\",\"2093\":\"235#ssl-verify-client\",\"2094\":\"236\",\"2095\":\"236#overview\",\"2096\":\"237\",\"2097\":\"237#overview\",\"2098\":\"237#matching-users\",\"2099\":\"237#thumbprint\",\"2100\":\"237#email\",\"2101\":\"237#token-role-and-token-group\",\"2102\":\"237#dsf-and-practitioner-roles\",\"2103\":\"237#dsf-role\",\"2104\":\"237#practitioner-role\",\"2105\":\"237#examples\",\"2106\":\"238\",\"2107\":\"238#dev-dsf-server-api-host\",\"2108\":\"238#dev-dsf-server-api-port\",\"2109\":\"238#dev-dsf-server-auth-client-certificate-header\",\"2110\":\"238#dev-dsf-server-auth-oidc-authorization-code-flow\",\"2111\":\"238#dev-dsf-server-auth-oidc-back-channel-logout\",\"2112\":\"238#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"2113\":\"238#dev-dsf-server-auth-oidc-bearer-token\",\"2114\":\"238#dev-dsf-server-auth-oidc-client-id\",\"2115\":\"238#dev-dsf-server-auth-oidc-client-secret\",\"2116\":\"238#dev-dsf-server-auth-oidc-provider-client-certificate\",\"2117\":\"238#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"2118\":\"238#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"2119\":\"238#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"2120\":\"238#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"2121\":\"238#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"2122\":\"238#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"2123\":\"238#dev-dsf-server-auth-trust-client-certificate-cas\",\"2124\":\"238#dev-dsf-server-certificate\",\"2125\":\"238#dev-dsf-server-certificate-chain\",\"2126\":\"238#dev-dsf-server-certificate-key\",\"2127\":\"238#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"2128\":\"238#dev-dsf-server-context-path\",\"2129\":\"238#dev-dsf-server-status-host\",\"2130\":\"238#dev-dsf-server-status-port\",\"2131\":\"238#dev-dsf-bpe-db-liquibase-forceunlock\",\"2132\":\"238#dev-dsf-bpe-db-liquibase-lockwaittime\",\"2133\":\"238#dev-dsf-bpe-db-liquibase-password-or-dev-dsf-bpe-db-liquibase-password-file\",\"2134\":\"238#dev-dsf-bpe-db-liquibase-username\",\"2135\":\"238#dev-dsf-bpe-db-url\",\"2136\":\"238#dev-dsf-bpe-db-user-camunda-group\",\"2137\":\"238#dev-dsf-bpe-db-user-camunda-password-or-dev-dsf-bpe-db-user-camunda-password-file\",\"2138\":\"238#dev-dsf-bpe-db-user-camunda-username\",\"2139\":\"238#dev-dsf-bpe-db-user-group\",\"2140\":\"238#dev-dsf-bpe-db-user-password-or-dev-dsf-bpe-db-user-password-file\",\"2141\":\"238#dev-dsf-bpe-db-user-username\",\"2142\":\"238#dev-dsf-bpe-debug-log-message-currentuser\",\"2143\":\"238#dev-dsf-bpe-debug-log-message-dbstatement\",\"2144\":\"238#dev-dsf-bpe-debug-log-message-onactivityend\",\"2145\":\"238#dev-dsf-bpe-debug-log-message-onactivitystart\",\"2146\":\"238#dev-dsf-bpe-debug-log-message-variables\",\"2147\":\"238#dev-dsf-bpe-debug-log-message-variableslocal\",\"2148\":\"238#dev-dsf-bpe-debug-log-message-webservicerequest\",\"2149\":\"238#dev-dsf-bpe-fhir-client-certificate\",\"2150\":\"238#dev-dsf-bpe-fhir-client-certificate-private-key\",\"2151\":\"238#dev-dsf-bpe-fhir-client-certificate-private-key-password-or-dev-dsf-bpe-fhir-client-certificate-private-key-password-file\",\"2152\":\"238#dev-dsf-bpe-fhir-client-local-timeout-connect\",\"2153\":\"238#dev-dsf-bpe-fhir-client-local-timeout-read\",\"2154\":\"238#dev-dsf-bpe-fhir-client-local-verbose\",\"2155\":\"238#dev-dsf-bpe-fhir-client-remote-timeout-connect\",\"2156\":\"238#dev-dsf-bpe-fhir-client-remote-timeout-read\",\"2157\":\"238#dev-dsf-bpe-fhir-client-remote-verbose\",\"2158\":\"238#dev-dsf-bpe-fhir-client-trust-server-certificate-cas\",\"2159\":\"238#dev-dsf-bpe-fhir-questionnaire-response-subscription-search-parameter\",\"2160\":\"238#dev-dsf-bpe-fhir-server-base-url\",\"2161\":\"238#dev-dsf-bpe-fhir-task-subscription-retry-max\",\"2162\":\"238#dev-dsf-bpe-fhir-task-subscription-retry-sleep\",\"2163\":\"238#dev-dsf-bpe-fhir-task-subscription-search-parameter\",\"2164\":\"238#dev-dsf-bpe-mail-client-certificate\",\"2165\":\"238#dev-dsf-bpe-mail-client-certificate-private-key\",\"2166\":\"238#dev-dsf-bpe-mail-client-certificate-private-key-password-or-dev-dsf-bpe-mail-client-certificate-private-key-password-file\",\"2167\":\"238#dev-dsf-bpe-mail-fromaddress\",\"2168\":\"238#dev-dsf-bpe-mail-host\",\"2169\":\"238#dev-dsf-bpe-mail-mailonerrorlogeventbuffersize\",\"2170\":\"238#dev-dsf-bpe-mail-mailonerrorlogeventdebugloglocation\",\"2171\":\"238#dev-dsf-bpe-mail-password-or-dev-dsf-bpe-mail-password-file\",\"2172\":\"238#dev-dsf-bpe-mail-port\",\"2173\":\"238#dev-dsf-bpe-mail-replytoaddresses\",\"2174\":\"238#dev-dsf-bpe-mail-sendmailonerrorlogevent\",\"2175\":\"238#dev-dsf-bpe-mail-sendtestmailonstartup\",\"2176\":\"238#dev-dsf-bpe-mail-smime-p12keystore\",\"2177\":\"238#dev-dsf-bpe-mail-smime-p12keystore-password-or-dev-dsf-bpe-mail-smime-p12keystore-password-file\",\"2178\":\"238#dev-dsf-bpe-mail-toaddresses\",\"2179\":\"238#dev-dsf-bpe-mail-toaddressescc\",\"2180\":\"238#dev-dsf-bpe-mail-trust-server-certificate-cas\",\"2181\":\"238#dev-dsf-bpe-mail-username\",\"2182\":\"238#dev-dsf-bpe-mail-usesmtps\",\"2183\":\"238#dev-dsf-bpe-process-engine-corepoolsize\",\"2184\":\"238#dev-dsf-bpe-process-engine-maxpoolsize\",\"2185\":\"238#dev-dsf-bpe-process-engine-queuesize\",\"2186\":\"238#dev-dsf-bpe-process-excluded\",\"2187\":\"238#dev-dsf-bpe-process-fhir-server-retry-max\",\"2188\":\"238#dev-dsf-bpe-process-fhir-server-retry-sleep\",\"2189\":\"238#dev-dsf-bpe-process-plugin-directroy\",\"2190\":\"238#dev-dsf-bpe-process-retired\",\"2191\":\"238#dev-dsf-bpe-process-threads\",\"2192\":\"238#dev-dsf-bpe-server-base-url\",\"2193\":\"238#dev-dsf-bpe-server-roleconfig\",\"2194\":\"238#dev-dsf-bpe-server-static-resource-cache\",\"2195\":\"238#dev-dsf-bpe-server-ui-theme\",\"2196\":\"238#dev-dsf-proxy-noproxy\",\"2197\":\"238#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"2198\":\"238#dev-dsf-proxy-url\",\"2199\":\"238#dev-dsf-proxy-username\",\"2200\":\"239\",\"2201\":\"239#overview\",\"2202\":\"239#authorization-code-flow\",\"2203\":\"239#additional-odic-configuration-parameter\",\"2204\":\"239#example\",\"2205\":\"240\",\"2206\":\"240#overview\",\"2207\":\"241\",\"2208\":\"241#app-server-ip\",\"2209\":\"241#https-server-name-port\",\"2210\":\"241#proxy-pass-connection-timeout-http\",\"2211\":\"241#proxy-pass-connection-timeout-ws\",\"2212\":\"241#proxy-pass-timeout-http\",\"2213\":\"241#proxy-pass-timeout-ws\",\"2214\":\"241#server-context-path\",\"2215\":\"241#ssl-ca-certificate-file\",\"2216\":\"241#ssl-ca-dn-request-file\",\"2217\":\"241#ssl-certificate-chain-file\",\"2218\":\"241#ssl-certificate-file\",\"2219\":\"241#ssl-certificate-key-file\",\"2220\":\"241#ssl-verify-client\",\"2221\":\"242\",\"2222\":\"242#overview\",\"2223\":\"243\",\"2224\":\"243#overview\",\"2225\":\"243#matching-users\",\"2226\":\"243#thumbprint\",\"2227\":\"243#email\",\"2228\":\"243#token-role-and-token-group\",\"2229\":\"243#dsf-and-practitioner-roles\",\"2230\":\"243#dsf-role\",\"2231\":\"243#practitioner-role\",\"2232\":\"243#examples\",\"2233\":\"244\",\"2234\":\"244#dev-dsf-fhir-client-certificate\",\"2235\":\"244#dev-dsf-fhir-client-certificate-private-key\",\"2236\":\"244#dev-dsf-fhir-client-certificate-private-key-password-or-dev-dsf-fhir-client-certificate-private-key-password-file\",\"2237\":\"244#dev-dsf-fhir-client-timeout-connect\",\"2238\":\"244#dev-dsf-fhir-client-timeout-read\",\"2239\":\"244#dev-dsf-fhir-client-trust-server-certificate-cas\",\"2240\":\"244#dev-dsf-fhir-client-verbose\",\"2241\":\"244#dev-dsf-fhir-db-liquibase-forceunlock\",\"2242\":\"244#dev-dsf-fhir-db-liquibase-lockwaittime\",\"2243\":\"244#dev-dsf-fhir-db-liquibase-password-or-dev-dsf-fhir-db-liquibase-password-file\",\"2244\":\"244#dev-dsf-fhir-db-liquibase-username\",\"2245\":\"244#dev-dsf-fhir-db-url\",\"2246\":\"244#dev-dsf-fhir-db-user-group\",\"2247\":\"244#dev-dsf-fhir-db-user-password-or-dev-dsf-fhir-db-user-password-file\",\"2248\":\"244#dev-dsf-fhir-db-user-permanent-delete-group\",\"2249\":\"244#dev-dsf-fhir-db-user-permanent-delete-password-or-dev-dsf-fhir-db-user-permanent-delete-password-file\",\"2250\":\"244#dev-dsf-fhir-db-user-permanent-delete-username\",\"2251\":\"244#dev-dsf-fhir-db-user-username\",\"2252\":\"244#dev-dsf-fhir-debug-log-message-currentuser\",\"2253\":\"244#dev-dsf-fhir-debug-log-message-dbstatement\",\"2254\":\"244#dev-dsf-fhir-debug-log-message-webservicerequest\",\"2255\":\"244#dev-dsf-fhir-server-base-url\",\"2256\":\"244#dev-dsf-fhir-server-init-bundle\",\"2257\":\"244#dev-dsf-fhir-server-organization-identifier-value\",\"2258\":\"244#dev-dsf-fhir-server-organization-thumbprint\",\"2259\":\"244#dev-dsf-fhir-server-page-count\",\"2260\":\"244#dev-dsf-fhir-server-roleconfig\",\"2261\":\"244#dev-dsf-fhir-server-static-resource-cache\",\"2262\":\"244#dev-dsf-fhir-server-ui-theme\",\"2263\":\"244#dev-dsf-proxy-noproxy\",\"2264\":\"244#dev-dsf-proxy-password-or-dev-dsf-proxy-password-file\",\"2265\":\"244#dev-dsf-proxy-url\",\"2266\":\"244#dev-dsf-proxy-username\",\"2267\":\"244#dev-dsf-server-api-host\",\"2268\":\"244#dev-dsf-server-api-port\",\"2269\":\"244#dev-dsf-server-auth-client-certificate-header\",\"2270\":\"244#dev-dsf-server-auth-oidc-authorization-code-flow\",\"2271\":\"244#dev-dsf-server-auth-oidc-back-channel-logout\",\"2272\":\"244#dev-dsf-server-auth-oidc-back-channel-logout-path\",\"2273\":\"244#dev-dsf-server-auth-oidc-bearer-token\",\"2274\":\"244#dev-dsf-server-auth-oidc-client-id\",\"2275\":\"244#dev-dsf-server-auth-oidc-client-secret\",\"2276\":\"244#dev-dsf-server-auth-oidc-provider-client-certificate\",\"2277\":\"244#dev-dsf-server-auth-oidc-provider-client-certificate-private-key\",\"2278\":\"244#dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-or-dev-dsf-server-auth-oidc-provider-client-certificate-private-key-password-file\",\"2279\":\"244#dev-dsf-server-auth-oidc-provider-client-connecttimeout\",\"2280\":\"244#dev-dsf-server-auth-oidc-provider-client-idletimeout\",\"2281\":\"244#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas\",\"2282\":\"244#dev-dsf-server-auth-oidc-provider-realm-base-url\",\"2283\":\"244#dev-dsf-server-auth-trust-client-certificate-cas\",\"2284\":\"244#dev-dsf-server-certificate\",\"2285\":\"244#dev-dsf-server-certificate-chain\",\"2286\":\"244#dev-dsf-server-certificate-key\",\"2287\":\"244#dev-dsf-server-certificate-key-password-or-dev-dsf-server-certificate-key-password-file\",\"2288\":\"244#dev-dsf-server-context-path\",\"2289\":\"244#dev-dsf-server-status-host\",\"2290\":\"244#dev-dsf-server-status-port\",\"2291\":\"245\",\"2292\":\"245#overview\",\"2293\":\"245#authorization-code-flow\",\"2294\":\"245#bearer-token-authentication\",\"2295\":\"245#additional-odic-configuration-parameter\",\"2296\":\"245#example\",\"2297\":\"246\",\"2298\":\"246#overview\",\"2299\":\"247\",\"2300\":\"247#app-server-ip\",\"2301\":\"247#https-server-name-port\",\"2302\":\"247#proxy-pass-connection-timeout-http\",\"2303\":\"247#proxy-pass-connection-timeout-ws\",\"2304\":\"247#proxy-pass-timeout-http\",\"2305\":\"247#proxy-pass-timeout-ws\",\"2306\":\"247#server-context-path\",\"2307\":\"247#ssl-ca-certificate-file\",\"2308\":\"247#ssl-ca-dn-request-file\",\"2309\":\"247#ssl-certificate-chain-file\",\"2310\":\"247#ssl-certificate-file\",\"2311\":\"247#ssl-certificate-key-file\",\"2312\":\"247#ssl-verify-client\",\"2313\":\"248\",\"2314\":\"248#overview\",\"2315\":\"249\",\"2316\":\"250\",\"2317\":\"251\",\"2318\":\"252\"},\"fieldIds\":{\"h\":0,\"t\":1,\"c\":2},\"fieldLength\":{\"0\":[3,106],\"1\":[1,69],\"2\":[12],\"3\":[2],\"4\":[1,25],\"5\":[2,15],\"6\":[4,20],\"7\":[2,31],\"8\":[5,26],\"9\":[2],\"10\":[11,110],\"11\":[15,68],\"12\":[1,11],\"13\":[8,43],\"14\":[7,36],\"15\":[6,22],\"16\":[2],\"17\":[1,7],\"18\":[1,31],\"19\":[1,1],\"20\":[4,72],\"21\":[3,58],\"22\":[4],\"23\":[4,35],\"24\":[4,37],\"25\":[4,30],\"26\":[4,24],\"27\":[5,72],\"28\":[6,32],\"29\":[1,114],\"30\":[1,32],\"31\":[1,87],\"32\":[2,70],\"33\":[1],\"34\":[1,3],\"35\":[1,26],\"36\":[2,6],\"37\":[3,44],\"38\":[3],\"39\":[1,131],\"40\":[2],\"41\":[3,20],\"42\":[3,25],\"43\":[1],\"44\":[1,10],\"45\":[1,1],\"46\":[1,1],\"47\":[1,1],\"48\":[2],\"49\":[1,84],\"50\":[3,17],\"51\":[12],\"52\":[1,91],\"53\":[4,55],\"54\":[5,93],\"55\":[2,78],\"56\":[8,10],\"57\":[3,42],\"58\":[1,106],\"59\":[3,96],\"60\":[1,62],\"61\":[8,147],\"62\":[1,169],\"63\":[5,180],\"64\":[6,47],\"65\":[2],\"66\":[1,82],\"67\":[2,48],\"68\":[3,37],\"69\":[3,32],\"70\":[2,41],\"71\":[2,33],\"72\":[3],\"73\":[2,97],\"74\":[1,76],\"75\":[3],\"76\":[2,58],\"77\":[4,59],\"78\":[3,5],\"79\":[3],\"80\":[1,113],\"81\":[1,167],\"82\":[2,32],\"83\":[3,15],\"84\":[4,62],\"85\":[1,12],\"86\":[2,5],\"87\":[1],\"88\":[1,71],\"89\":[3,101],\"90\":[2,56],\"91\":[3,63],\"92\":[4,55],\"93\":[2],\"94\":[1,4],\"95\":[1,76],\"96\":[4],\"97\":[4,36],\"98\":[2,35],\"99\":[5,105],\"100\":[2,63],\"101\":[2,30],\"102\":[2,42],\"103\":[1,25],\"104\":[1,2],\"105\":[3,47],\"106\":[2,39],\"107\":[3,47],\"108\":[2,45],\"109\":[4,48],\"110\":[2,45],\"111\":[4,48],\"112\":[2,45],\"113\":[3,48],\"114\":[2,45],\"115\":[4,49],\"116\":[2,45],\"117\":[4,49],\"118\":[2,45],\"119\":[5,41],\"120\":[3],\"121\":[1,11],\"122\":[6,40],\"123\":[4,50],\"124\":[2,45],\"125\":[3,28],\"126\":[1,87],\"127\":[1,46],\"128\":[2,63],\"129\":[4,72],\"130\":[1],\"131\":[2,11],\"132\":[2,75],\"133\":[3,59],\"134\":[3,74],\"135\":[1],\"136\":[2,31],\"137\":[3,266],\"138\":[3,229],\"139\":[1,92],\"140\":[2,40],\"141\":[4],\"142\":[1,13],\"143\":[6,69],\"144\":[5,41],\"145\":[3],\"146\":[1,11],\"147\":[6,40],\"148\":[3,28],\"149\":[1,87],\"150\":[1,47],\"151\":[2,63],\"152\":[4,72],\"153\":[1],\"154\":[2,11],\"155\":[2,75],\"156\":[3,59],\"157\":[3,74],\"158\":[1],\"159\":[2,31],\"160\":[3,257],\"161\":[3,231],\"162\":[1,92],\"163\":[2,40],\"164\":[4],\"165\":[1,22],\"166\":[6,69],\"167\":[5,28],\"168\":[5,57],\"169\":[5,96],\"170\":[3,48],\"171\":[2,45],\"172\":[3,28],\"173\":[1,87],\"174\":[1,47],\"175\":[2,63],\"176\":[5,72],\"177\":[1],\"178\":[2,11],\"179\":[2,75],\"180\":[3,59],\"181\":[3,74],\"182\":[1],\"183\":[2,31],\"184\":[3,259],\"185\":[3,232],\"186\":[1,92],\"187\":[2,40],\"188\":[4],\"189\":[1,23],\"190\":[6,69],\"191\":[5,29],\"192\":[5,121],\"193\":[5,142],\"194\":[5,41],\"195\":[3],\"196\":[1,11],\"197\":[6,40],\"198\":[5,41],\"199\":[3],\"200\":[1,11],\"201\":[6,40],\"202\":[4,49],\"203\":[2,45],\"204\":[3,14],\"205\":[1,77],\"206\":[1,52],\"207\":[2,80],\"208\":[2,11],\"209\":[2,15],\"210\":[2,14],\"211\":[2,10],\"212\":[5,58],\"213\":[1],\"214\":[2,11],\"215\":[2,75],\"216\":[3,59],\"217\":[3,74],\"218\":[1],\"219\":[2,31],\"220\":[3,259],\"221\":[3,232],\"222\":[1,92],\"223\":[2,40],\"224\":[4],\"225\":[1,23],\"226\":[6,142],\"227\":[6,38],\"228\":[5,58],\"229\":[5,97],\"230\":[5,41],\"231\":[3],\"232\":[1,11],\"233\":[6,40],\"234\":[3,14],\"235\":[1,71],\"236\":[1,53],\"237\":[2,81],\"238\":[2,11],\"239\":[2,15],\"240\":[2,14],\"241\":[2,10],\"242\":[4,58],\"243\":[1],\"244\":[2,11],\"245\":[2,75],\"246\":[3,59],\"247\":[3,74],\"248\":[1],\"249\":[2,31],\"250\":[3,258],\"251\":[3,219],\"252\":[1,92],\"253\":[2,40],\"254\":[4],\"255\":[1,23],\"256\":[6,142],\"257\":[6,28],\"258\":[5,57],\"259\":[5,96],\"260\":[5,41],\"261\":[3],\"262\":[1,11],\"263\":[6,40],\"264\":[3,14],\"265\":[1,71],\"266\":[1,53],\"267\":[2,81],\"268\":[2,11],\"269\":[2,15],\"270\":[2,19],\"271\":[2,10],\"272\":[5,58],\"273\":[1],\"274\":[2,11],\"275\":[2,75],\"276\":[3,59],\"277\":[3,74],\"278\":[1],\"279\":[2,31],\"280\":[3,259],\"281\":[3,220],\"282\":[1,92],\"283\":[2,40],\"284\":[4],\"285\":[1,23],\"286\":[6,142],\"287\":[5,28],\"288\":[5,57],\"289\":[5,96],\"290\":[2,35],\"291\":[4,39],\"292\":[1],\"293\":[2,55],\"294\":[2,41],\"295\":[2,15],\"296\":[4,15],\"297\":[1,17],\"298\":[1,16],\"299\":[1,46],\"300\":[1,54],\"301\":[3,118],\"302\":[5,66],\"303\":[2,134],\"304\":[1,44],\"305\":[1,210],\"306\":[5,48],\"307\":[3],\"308\":[1,11],\"309\":[6,40],\"310\":[3,14],\"311\":[1,71],\"312\":[1,53],\"313\":[2,81],\"314\":[2,11],\"315\":[2,15],\"316\":[2,18],\"317\":[2,10],\"318\":[5,58],\"319\":[1],\"320\":[2,11],\"321\":[2,75],\"322\":[3,59],\"323\":[3,74],\"324\":[1],\"325\":[2,31],\"326\":[3,259],\"327\":[3,220],\"328\":[1,92],\"329\":[2,40],\"330\":[4],\"331\":[1,23],\"332\":[6,142],\"333\":[6,29],\"334\":[5,59],\"335\":[5,98],\"336\":[5,48],\"337\":[3],\"338\":[1,11],\"339\":[6,40],\"340\":[2,35],\"341\":[4,39],\"342\":[1],\"343\":[2,55],\"344\":[2,41],\"345\":[2,15],\"346\":[4,15],\"347\":[1,17],\"348\":[1,16],\"349\":[1,46],\"350\":[1,54],\"351\":[3,118],\"352\":[5,66],\"353\":[2,134],\"354\":[1,44],\"355\":[1,210],\"356\":[3,14],\"357\":[1,71],\"358\":[1,53],\"359\":[2,81],\"360\":[2,11],\"361\":[2,15],\"362\":[2,18],\"363\":[2,10],\"364\":[5,58],\"365\":[1],\"366\":[2,11],\"367\":[2,75],\"368\":[3,59],\"369\":[3,74],\"370\":[1],\"371\":[2,31],\"372\":[3,259],\"373\":[3,220],\"374\":[1,92],\"375\":[2,40],\"376\":[4],\"377\":[1,23],\"378\":[6,142],\"379\":[6,29],\"380\":[5,59],\"381\":[5,98],\"382\":[3,10],\"383\":[6,31],\"384\":[6,20],\"385\":[8,37],\"386\":[6,24],\"387\":[5,43],\"388\":[7,26],\"389\":[9,38],\"390\":[7,34],\"391\":[6,23],\"392\":[8,34],\"393\":[6,21],\"394\":[7,35],\"395\":[7,35],\"396\":[7,51],\"397\":[6,34],\"398\":[8,45],\"399\":[11,41],\"400\":[8,35],\"401\":[8,36],\"402\":[7,28],\"403\":[8,34],\"404\":[8,35],\"405\":[7,27],\"406\":[9,44],\"407\":[9,32],\"408\":[7,26],\"409\":[8,32],\"410\":[8,32],\"411\":[8,28],\"412\":[8,31],\"413\":[6,42],\"414\":[8,53],\"415\":[11,42],\"416\":[5,15],\"417\":[5,15],\"418\":[5,34],\"419\":[5,40],\"420\":[7,36],\"421\":[5,15],\"422\":[5,25],\"423\":[5,28],\"424\":[5,30],\"425\":[6,36],\"426\":[9,39],\"427\":[5,28],\"428\":[5,26],\"429\":[8,48],\"430\":[5,27],\"431\":[5,20],\"432\":[5,46],\"433\":[8,33],\"434\":[8,29],\"435\":[6,42],\"436\":[5,42],\"437\":[4,42],\"438\":[6,27],\"439\":[4,29],\"440\":[4,14],\"441\":[2],\"442\":[5,19],\"443\":[5,16],\"444\":[7,21],\"445\":[8,35],\"446\":[8,39],\"447\":[9,22],\"448\":[7,31],\"449\":[7,26],\"450\":[7,26],\"451\":[8,31],\"452\":[10,48],\"453\":[13,44],\"454\":[8,19],\"455\":[8,19],\"456\":[10,40],\"457\":[9,23],\"458\":[8,42],\"459\":[4,21],\"460\":[5,22],\"461\":[5,23],\"462\":[8,24],\"463\":[5,22],\"464\":[5,15],\"465\":[5,16],\"466\":[3,10],\"467\":[5,32],\"468\":[7,43],\"469\":[10,39],\"470\":[6,35],\"471\":[6,34],\"472\":[8,41],\"473\":[5,26],\"474\":[6,31],\"475\":[6,20],\"476\":[8,37],\"477\":[6,24],\"478\":[5,43],\"479\":[6,23],\"480\":[8,34],\"481\":[8,27],\"482\":[10,40],\"483\":[8,34],\"484\":[6,21],\"485\":[6,24],\"486\":[6,47],\"487\":[7,31],\"488\":[6,23],\"489\":[5,12],\"490\":[7,23],\"491\":[4,42],\"492\":[6,27],\"493\":[4,29],\"494\":[4,14],\"495\":[2],\"496\":[1,7],\"497\":[4],\"498\":[3,23],\"499\":[4,18],\"500\":[5,22],\"501\":[5,22],\"502\":[4,20],\"503\":[4,20],\"504\":[4,36],\"505\":[5,51],\"506\":[4,53],\"507\":[3,25],\"508\":[4,28],\"509\":[2],\"510\":[5,19],\"511\":[5,16],\"512\":[7,21],\"513\":[8,35],\"514\":[8,39],\"515\":[9,22],\"516\":[7,31],\"517\":[7,26],\"518\":[7,26],\"519\":[8,31],\"520\":[10,48],\"521\":[13,44],\"522\":[8,19],\"523\":[8,19],\"524\":[10,40],\"525\":[9,23],\"526\":[8,42],\"527\":[4,21],\"528\":[5,22],\"529\":[5,23],\"530\":[8,24],\"531\":[5,22],\"532\":[5,15],\"533\":[5,16],\"534\":[6,31],\"535\":[6,20],\"536\":[8,37],\"537\":[6,24],\"538\":[5,43],\"539\":[7,26],\"540\":[9,38],\"541\":[7,34],\"542\":[6,23],\"543\":[8,34],\"544\":[6,21],\"545\":[7,35],\"546\":[7,35],\"547\":[7,51],\"548\":[6,34],\"549\":[8,45],\"550\":[11,41],\"551\":[8,35],\"552\":[8,36],\"553\":[7,28],\"554\":[8,34],\"555\":[8,35],\"556\":[7,27],\"557\":[9,44],\"558\":[9,32],\"559\":[7,26],\"560\":[8,32],\"561\":[8,32],\"562\":[8,28],\"563\":[8,31],\"564\":[6,42],\"565\":[8,53],\"566\":[11,42],\"567\":[5,15],\"568\":[5,15],\"569\":[5,34],\"570\":[5,40],\"571\":[7,36],\"572\":[5,15],\"573\":[5,25],\"574\":[5,28],\"575\":[5,30],\"576\":[6,36],\"577\":[9,39],\"578\":[5,28],\"579\":[5,26],\"580\":[8,48],\"581\":[5,27],\"582\":[5,20],\"583\":[5,46],\"584\":[8,33],\"585\":[8,29],\"586\":[6,42],\"587\":[5,42],\"588\":[4,42],\"589\":[6,27],\"590\":[4,29],\"591\":[4,14],\"592\":[2],\"593\":[1,2],\"594\":[2],\"595\":[3,23],\"596\":[4,18],\"597\":[5,22],\"598\":[5,22],\"599\":[4,20],\"600\":[4,20],\"601\":[4,36],\"602\":[5,51],\"603\":[4,53],\"604\":[3,25],\"605\":[4,28],\"606\":[3,21],\"607\":[3],\"608\":[1,2],\"609\":[2],\"610\":[1,133],\"611\":[2,25],\"612\":[1,28],\"613\":[1,51],\"614\":[4,22],\"615\":[4,11],\"616\":[2,29],\"617\":[2,80],\"618\":[1,73],\"619\":[2],\"620\":[5,32],\"621\":[7,43],\"622\":[10,39],\"623\":[6,35],\"624\":[6,34],\"625\":[8,41],\"626\":[5,26],\"627\":[6,31],\"628\":[6,20],\"629\":[8,37],\"630\":[6,24],\"631\":[5,43],\"632\":[6,23],\"633\":[8,34],\"634\":[8,27],\"635\":[10,40],\"636\":[8,34],\"637\":[6,21],\"638\":[6,24],\"639\":[6,47],\"640\":[7,31],\"641\":[6,28],\"642\":[6,23],\"643\":[5,37],\"644\":[7,23],\"645\":[4,42],\"646\":[6,27],\"647\":[4,29],\"648\":[4,14],\"649\":[5,19],\"650\":[5,16],\"651\":[7,21],\"652\":[8,35],\"653\":[8,39],\"654\":[9,22],\"655\":[7,31],\"656\":[7,26],\"657\":[7,26],\"658\":[8,31],\"659\":[10,48],\"660\":[13,44],\"661\":[8,19],\"662\":[8,19],\"663\":[10,40],\"664\":[9,23],\"665\":[8,42],\"666\":[4,21],\"667\":[5,22],\"668\":[5,23],\"669\":[8,24],\"670\":[5,22],\"671\":[5,15],\"672\":[5,16],\"673\":[2],\"674\":[1,71],\"675\":[3,57],\"676\":[3,25],\"677\":[4,50],\"678\":[1,49],\"679\":[2],\"680\":[1,6],\"681\":[2,35],\"682\":[4,39],\"683\":[1],\"684\":[2,55],\"685\":[2,41],\"686\":[2,15],\"687\":[4,15],\"688\":[1,17],\"689\":[1,16],\"690\":[1,46],\"691\":[1,54],\"692\":[3,118],\"693\":[5,66],\"694\":[2,134],\"695\":[1,44],\"696\":[1,210],\"697\":[5,48],\"698\":[3],\"699\":[1,11],\"700\":[6,40],\"701\":[3,14],\"702\":[1,71],\"703\":[1,53],\"704\":[2,81],\"705\":[2,11],\"706\":[2,15],\"707\":[2,20],\"708\":[2,10],\"709\":[4,58],\"710\":[1],\"711\":[2,11],\"712\":[2,75],\"713\":[3,59],\"714\":[3,74],\"715\":[1],\"716\":[2,31],\"717\":[3,258],\"718\":[3,219],\"719\":[1,84],\"720\":[2,40],\"721\":[4],\"722\":[1,23],\"723\":[6,142],\"724\":[6,28],\"725\":[5,58],\"726\":[5,97],\"727\":[2],\"728\":[5,19],\"729\":[5,16],\"730\":[7,21],\"731\":[8,35],\"732\":[8,39],\"733\":[9,22],\"734\":[7,31],\"735\":[7,26],\"736\":[7,26],\"737\":[8,31],\"738\":[10,48],\"739\":[13,44],\"740\":[8,19],\"741\":[8,19],\"742\":[10,40],\"743\":[9,23],\"744\":[8,42],\"745\":[4,21],\"746\":[5,22],\"747\":[5,23],\"748\":[8,24],\"749\":[5,22],\"750\":[5,15],\"751\":[5,16],\"752\":[6,31],\"753\":[6,20],\"754\":[8,37],\"755\":[6,24],\"756\":[5,43],\"757\":[7,26],\"758\":[9,38],\"759\":[7,34],\"760\":[6,23],\"761\":[8,34],\"762\":[6,21],\"763\":[7,35],\"764\":[7,35],\"765\":[7,50],\"766\":[7,52],\"767\":[6,34],\"768\":[8,45],\"769\":[11,41],\"770\":[8,35],\"771\":[8,36],\"772\":[7,28],\"773\":[8,34],\"774\":[8,35],\"775\":[7,27],\"776\":[9,44],\"777\":[9,32],\"778\":[7,26],\"779\":[8,32],\"780\":[8,28],\"781\":[8,31],\"782\":[6,42],\"783\":[8,53],\"784\":[11,42],\"785\":[5,15],\"786\":[5,15],\"787\":[5,34],\"788\":[5,40],\"789\":[7,36],\"790\":[5,15],\"791\":[5,25],\"792\":[5,28],\"793\":[5,30],\"794\":[6,36],\"795\":[9,39],\"796\":[5,28],\"797\":[5,26],\"798\":[8,48],\"799\":[5,27],\"800\":[5,20],\"801\":[6,18],\"802\":[6,28],\"803\":[6,28],\"804\":[5,53],\"805\":[8,33],\"806\":[8,29],\"807\":[6,42],\"808\":[5,46],\"809\":[5,31],\"810\":[4,42],\"811\":[6,27],\"812\":[4,29],\"813\":[4,14],\"814\":[2],\"815\":[1,2],\"816\":[2],\"817\":[1,133],\"818\":[2,25],\"819\":[1,28],\"820\":[1,51],\"821\":[4,22],\"822\":[4,11],\"823\":[2,29],\"824\":[2,80],\"825\":[1,73],\"826\":[2],\"827\":[5,32],\"828\":[7,43],\"829\":[10,39],\"830\":[6,35],\"831\":[6,34],\"832\":[8,41],\"833\":[5,26],\"834\":[6,31],\"835\":[6,20],\"836\":[8,37],\"837\":[6,24],\"838\":[5,43],\"839\":[6,23],\"840\":[8,34],\"841\":[8,27],\"842\":[10,40],\"843\":[8,34],\"844\":[6,21],\"845\":[6,24],\"846\":[6,47],\"847\":[7,31],\"848\":[6,28],\"849\":[6,23],\"850\":[5,20],\"851\":[7,23],\"852\":[4,42],\"853\":[6,27],\"854\":[4,29],\"855\":[4,14],\"856\":[5,19],\"857\":[5,16],\"858\":[7,21],\"859\":[8,35],\"860\":[8,39],\"861\":[9,22],\"862\":[7,31],\"863\":[7,26],\"864\":[7,26],\"865\":[8,31],\"866\":[10,48],\"867\":[13,44],\"868\":[8,19],\"869\":[8,19],\"870\":[10,40],\"871\":[9,23],\"872\":[8,42],\"873\":[4,21],\"874\":[5,22],\"875\":[5,23],\"876\":[8,24],\"877\":[5,22],\"878\":[5,15],\"879\":[5,16],\"880\":[2],\"881\":[1,71],\"882\":[3,57],\"883\":[3,25],\"884\":[4,50],\"885\":[1,50],\"886\":[2],\"887\":[1,6],\"888\":[2,35],\"889\":[4,39],\"890\":[1],\"891\":[2,55],\"892\":[2,41],\"893\":[2,15],\"894\":[4,15],\"895\":[1,17],\"896\":[1,16],\"897\":[1,46],\"898\":[1,54],\"899\":[3,118],\"900\":[5,66],\"901\":[2,134],\"902\":[1,44],\"903\":[1,210],\"904\":[5,48],\"905\":[3],\"906\":[1,11],\"907\":[6,40],\"908\":[2],\"909\":[3,23],\"910\":[4,18],\"911\":[5,22],\"912\":[5,22],\"913\":[4,20],\"914\":[4,20],\"915\":[3,26],\"916\":[4,36],\"917\":[5,51],\"918\":[4,53],\"919\":[3,25],\"920\":[4,28],\"921\":[3,21],\"922\":[3],\"923\":[1,2],\"924\":[3,14],\"925\":[1,71],\"926\":[1,53],\"927\":[2,81],\"928\":[2,19],\"929\":[1,66],\"930\":[1,17],\"931\":[1,57],\"932\":[5,58],\"933\":[1],\"934\":[2,11],\"935\":[2,75],\"936\":[3,59],\"937\":[3,74],\"938\":[1],\"939\":[2,31],\"940\":[3,259],\"941\":[3,220],\"942\":[1,84],\"943\":[2,40],\"944\":[4],\"945\":[1,24],\"946\":[6,142],\"947\":[5,28],\"948\":[5,58],\"949\":[5,97],\"950\":[2],\"951\":[5,19],\"952\":[5,16],\"953\":[7,21],\"954\":[8,35],\"955\":[8,39],\"956\":[9,22],\"957\":[7,31],\"958\":[7,26],\"959\":[7,26],\"960\":[8,31],\"961\":[10,48],\"962\":[13,44],\"963\":[8,19],\"964\":[8,19],\"965\":[10,40],\"966\":[9,23],\"967\":[8,42],\"968\":[4,21],\"969\":[5,22],\"970\":[5,23],\"971\":[8,24],\"972\":[5,22],\"973\":[5,15],\"974\":[5,16],\"975\":[6,31],\"976\":[6,20],\"977\":[8,37],\"978\":[6,24],\"979\":[5,43],\"980\":[7,26],\"981\":[9,38],\"982\":[7,34],\"983\":[6,23],\"984\":[8,34],\"985\":[6,21],\"986\":[7,35],\"987\":[7,35],\"988\":[7,50],\"989\":[7,52],\"990\":[6,34],\"991\":[8,45],\"992\":[11,41],\"993\":[8,35],\"994\":[8,36],\"995\":[7,28],\"996\":[8,34],\"997\":[8,35],\"998\":[7,27],\"999\":[9,44],\"1000\":[9,32],\"1001\":[7,26],\"1002\":[8,32],\"1003\":[8,28],\"1004\":[8,31],\"1005\":[6,42],\"1006\":[8,53],\"1007\":[11,42],\"1008\":[5,15],\"1009\":[5,15],\"1010\":[5,34],\"1011\":[5,40],\"1012\":[7,36],\"1013\":[5,15],\"1014\":[5,25],\"1015\":[5,28],\"1016\":[5,30],\"1017\":[6,36],\"1018\":[9,39],\"1019\":[5,28],\"1020\":[5,26],\"1021\":[8,48],\"1022\":[5,27],\"1023\":[5,20],\"1024\":[6,18],\"1025\":[6,28],\"1026\":[6,28],\"1027\":[5,53],\"1028\":[8,33],\"1029\":[8,29],\"1030\":[6,42],\"1031\":[5,46],\"1032\":[5,31],\"1033\":[4,42],\"1034\":[6,27],\"1035\":[4,29],\"1036\":[4,14],\"1037\":[2],\"1038\":[1,2],\"1039\":[2],\"1040\":[1,133],\"1041\":[2,25],\"1042\":[1,28],\"1043\":[1,51],\"1044\":[4,22],\"1045\":[4,11],\"1046\":[2,29],\"1047\":[2,80],\"1048\":[1,73],\"1049\":[2],\"1050\":[5,32],\"1051\":[7,43],\"1052\":[10,39],\"1053\":[6,35],\"1054\":[6,34],\"1055\":[8,41],\"1056\":[5,26],\"1057\":[6,31],\"1058\":[6,20],\"1059\":[8,37],\"1060\":[6,24],\"1061\":[5,43],\"1062\":[6,23],\"1063\":[8,34],\"1064\":[8,27],\"1065\":[10,40],\"1066\":[8,34],\"1067\":[6,21],\"1068\":[6,24],\"1069\":[6,47],\"1070\":[7,31],\"1071\":[6,28],\"1072\":[6,23],\"1073\":[5,20],\"1074\":[7,23],\"1075\":[4,42],\"1076\":[6,27],\"1077\":[4,29],\"1078\":[4,14],\"1079\":[5,19],\"1080\":[5,16],\"1081\":[7,21],\"1082\":[8,35],\"1083\":[8,39],\"1084\":[9,22],\"1085\":[7,31],\"1086\":[7,26],\"1087\":[7,26],\"1088\":[8,31],\"1089\":[10,48],\"1090\":[13,44],\"1091\":[8,19],\"1092\":[8,19],\"1093\":[10,40],\"1094\":[9,23],\"1095\":[8,42],\"1096\":[4,21],\"1097\":[5,22],\"1098\":[5,23],\"1099\":[8,24],\"1100\":[5,22],\"1101\":[5,15],\"1102\":[5,16],\"1103\":[2],\"1104\":[1,71],\"1105\":[3,57],\"1106\":[3,25],\"1107\":[4,50],\"1108\":[1,50],\"1109\":[2],\"1110\":[1,6],\"1111\":[2],\"1112\":[5,19],\"1113\":[5,16],\"1114\":[7,21],\"1115\":[8,35],\"1116\":[8,39],\"1117\":[9,22],\"1118\":[7,31],\"1119\":[7,26],\"1120\":[7,26],\"1121\":[8,31],\"1122\":[10,48],\"1123\":[13,44],\"1124\":[8,19],\"1125\":[8,19],\"1126\":[10,40],\"1127\":[9,23],\"1128\":[8,42],\"1129\":[4,21],\"1130\":[5,22],\"1131\":[5,23],\"1132\":[8,24],\"1133\":[5,22],\"1134\":[5,15],\"1135\":[5,16],\"1136\":[6,31],\"1137\":[6,20],\"1138\":[8,37],\"1139\":[6,24],\"1140\":[5,43],\"1141\":[7,26],\"1142\":[9,38],\"1143\":[7,34],\"1144\":[6,23],\"1145\":[8,34],\"1146\":[6,21],\"1147\":[7,35],\"1148\":[7,35],\"1149\":[7,50],\"1150\":[7,52],\"1151\":[6,34],\"1152\":[8,45],\"1153\":[11,41],\"1154\":[8,35],\"1155\":[8,36],\"1156\":[7,28],\"1157\":[8,34],\"1158\":[8,35],\"1159\":[7,27],\"1160\":[9,44],\"1161\":[9,32],\"1162\":[7,26],\"1163\":[8,32],\"1164\":[8,28],\"1165\":[8,31],\"1166\":[6,42],\"1167\":[8,53],\"1168\":[11,42],\"1169\":[5,15],\"1170\":[5,15],\"1171\":[5,34],\"1172\":[5,40],\"1173\":[7,36],\"1174\":[5,15],\"1175\":[5,25],\"1176\":[5,28],\"1177\":[5,30],\"1178\":[6,36],\"1179\":[9,39],\"1180\":[5,28],\"1181\":[5,26],\"1182\":[8,48],\"1183\":[5,27],\"1184\":[5,20],\"1185\":[6,18],\"1186\":[6,28],\"1187\":[6,28],\"1188\":[5,53],\"1189\":[8,33],\"1190\":[8,29],\"1191\":[6,42],\"1192\":[5,46],\"1193\":[5,31],\"1194\":[4,42],\"1195\":[6,27],\"1196\":[4,29],\"1197\":[4,14],\"1198\":[2],\"1199\":[1,2],\"1200\":[2],\"1201\":[3,23],\"1202\":[4,18],\"1203\":[5,22],\"1204\":[5,22],\"1205\":[4,20],\"1206\":[4,20],\"1207\":[3,26],\"1208\":[4,36],\"1209\":[5,51],\"1210\":[4,53],\"1211\":[3,25],\"1212\":[4,28],\"1213\":[3,21],\"1214\":[3],\"1215\":[1,2],\"1216\":[2],\"1217\":[1,133],\"1218\":[2,25],\"1219\":[1,28],\"1220\":[1,51],\"1221\":[4,22],\"1222\":[4,11],\"1223\":[2,29],\"1224\":[2,80],\"1225\":[1,73],\"1226\":[2],\"1227\":[5,32],\"1228\":[7,43],\"1229\":[10,39],\"1230\":[6,35],\"1231\":[6,34],\"1232\":[8,41],\"1233\":[5,26],\"1234\":[6,31],\"1235\":[6,20],\"1236\":[8,37],\"1237\":[6,24],\"1238\":[5,43],\"1239\":[6,23],\"1240\":[8,34],\"1241\":[8,27],\"1242\":[10,40],\"1243\":[8,34],\"1244\":[6,21],\"1245\":[6,24],\"1246\":[6,47],\"1247\":[7,31],\"1248\":[6,28],\"1249\":[6,23],\"1250\":[5,20],\"1251\":[7,23],\"1252\":[4,42],\"1253\":[6,27],\"1254\":[4,29],\"1255\":[4,14],\"1256\":[5,19],\"1257\":[5,16],\"1258\":[7,21],\"1259\":[8,35],\"1260\":[8,39],\"1261\":[9,22],\"1262\":[7,31],\"1263\":[7,26],\"1264\":[7,26],\"1265\":[8,31],\"1266\":[10,48],\"1267\":[13,44],\"1268\":[8,19],\"1269\":[8,19],\"1270\":[10,40],\"1271\":[9,23],\"1272\":[8,42],\"1273\":[4,21],\"1274\":[5,22],\"1275\":[5,23],\"1276\":[8,24],\"1277\":[5,22],\"1278\":[5,15],\"1279\":[5,16],\"1280\":[2],\"1281\":[1,71],\"1282\":[3,57],\"1283\":[3,25],\"1284\":[4,50],\"1285\":[1,49],\"1286\":[2],\"1287\":[1,6],\"1288\":[2],\"1289\":[3,23],\"1290\":[4,18],\"1291\":[5,22],\"1292\":[5,22],\"1293\":[4,20],\"1294\":[4,20],\"1295\":[3,26],\"1296\":[4,36],\"1297\":[5,51],\"1298\":[4,53],\"1299\":[3,25],\"1300\":[4,28],\"1301\":[3,21],\"1302\":[3],\"1303\":[1,2],\"1304\":[2],\"1305\":[5,19],\"1306\":[5,16],\"1307\":[7,21],\"1308\":[8,35],\"1309\":[8,39],\"1310\":[9,22],\"1311\":[7,31],\"1312\":[7,26],\"1313\":[7,26],\"1314\":[8,31],\"1315\":[10,48],\"1316\":[13,44],\"1317\":[8,19],\"1318\":[8,19],\"1319\":[10,40],\"1320\":[9,23],\"1321\":[8,42],\"1322\":[4,21],\"1323\":[5,22],\"1324\":[5,23],\"1325\":[8,24],\"1326\":[5,22],\"1327\":[5,15],\"1328\":[5,16],\"1329\":[6,31],\"1330\":[6,20],\"1331\":[8,37],\"1332\":[6,24],\"1333\":[5,43],\"1334\":[7,26],\"1335\":[9,38],\"1336\":[7,34],\"1337\":[6,23],\"1338\":[8,34],\"1339\":[6,21],\"1340\":[7,35],\"1341\":[7,35],\"1342\":[7,50],\"1343\":[7,52],\"1344\":[6,34],\"1345\":[8,45],\"1346\":[11,41],\"1347\":[8,35],\"1348\":[8,36],\"1349\":[7,28],\"1350\":[8,34],\"1351\":[8,35],\"1352\":[7,27],\"1353\":[9,44],\"1354\":[9,32],\"1355\":[7,26],\"1356\":[8,32],\"1357\":[8,28],\"1358\":[8,31],\"1359\":[6,42],\"1360\":[8,53],\"1361\":[11,42],\"1362\":[5,15],\"1363\":[5,15],\"1364\":[5,34],\"1365\":[5,40],\"1366\":[7,36],\"1367\":[5,15],\"1368\":[5,25],\"1369\":[5,28],\"1370\":[5,30],\"1371\":[6,36],\"1372\":[9,39],\"1373\":[5,28],\"1374\":[5,26],\"1375\":[8,48],\"1376\":[5,27],\"1377\":[5,20],\"1378\":[6,18],\"1379\":[6,28],\"1380\":[6,28],\"1381\":[5,53],\"1382\":[8,33],\"1383\":[8,29],\"1384\":[6,42],\"1385\":[5,46],\"1386\":[5,31],\"1387\":[4,42],\"1388\":[6,27],\"1389\":[4,29],\"1390\":[4,14],\"1391\":[2],\"1392\":[1,2],\"1393\":[2],\"1394\":[3,23],\"1395\":[4,18],\"1396\":[5,22],\"1397\":[5,22],\"1398\":[4,20],\"1399\":[4,20],\"1400\":[3,26],\"1401\":[4,36],\"1402\":[5,51],\"1403\":[4,53],\"1404\":[3,25],\"1405\":[4,28],\"1406\":[3,21],\"1407\":[3],\"1408\":[1,2],\"1409\":[2],\"1410\":[1,133],\"1411\":[2,25],\"1412\":[1,28],\"1413\":[1,51],\"1414\":[4,22],\"1415\":[4,11],\"1416\":[2,29],\"1417\":[2,80],\"1418\":[1,73],\"1419\":[2],\"1420\":[5,32],\"1421\":[7,43],\"1422\":[10,39],\"1423\":[6,35],\"1424\":[6,34],\"1425\":[8,41],\"1426\":[5,26],\"1427\":[6,31],\"1428\":[6,20],\"1429\":[8,37],\"1430\":[6,24],\"1431\":[5,43],\"1432\":[6,23],\"1433\":[8,34],\"1434\":[8,27],\"1435\":[10,40],\"1436\":[8,34],\"1437\":[6,21],\"1438\":[6,24],\"1439\":[6,47],\"1440\":[7,31],\"1441\":[6,28],\"1442\":[6,23],\"1443\":[5,20],\"1444\":[7,23],\"1445\":[4,42],\"1446\":[6,27],\"1447\":[4,29],\"1448\":[4,14],\"1449\":[5,19],\"1450\":[5,16],\"1451\":[7,21],\"1452\":[8,35],\"1453\":[8,39],\"1454\":[9,22],\"1455\":[7,31],\"1456\":[7,26],\"1457\":[7,26],\"1458\":[8,31],\"1459\":[10,48],\"1460\":[13,44],\"1461\":[8,19],\"1462\":[8,19],\"1463\":[10,40],\"1464\":[9,23],\"1465\":[8,42],\"1466\":[4,21],\"1467\":[5,22],\"1468\":[5,23],\"1469\":[8,24],\"1470\":[5,22],\"1471\":[5,15],\"1472\":[5,16],\"1473\":[2],\"1474\":[1,71],\"1475\":[3,57],\"1476\":[3,25],\"1477\":[4,50],\"1478\":[1,50],\"1479\":[2],\"1480\":[1,6],\"1481\":[2],\"1482\":[1,126],\"1483\":[2,25],\"1484\":[1,28],\"1485\":[1,51],\"1486\":[4,22],\"1487\":[4,11],\"1488\":[2,19],\"1489\":[2,11],\"1490\":[1,60],\"1491\":[2],\"1492\":[5,19],\"1493\":[5,16],\"1494\":[7,21],\"1495\":[8,35],\"1496\":[8,39],\"1497\":[9,22],\"1498\":[7,31],\"1499\":[7,26],\"1500\":[7,26],\"1501\":[8,31],\"1502\":[10,48],\"1503\":[13,44],\"1504\":[8,19],\"1505\":[8,19],\"1506\":[10,40],\"1507\":[9,23],\"1508\":[8,42],\"1509\":[4,21],\"1510\":[5,22],\"1511\":[5,23],\"1512\":[8,24],\"1513\":[5,22],\"1514\":[5,15],\"1515\":[5,16],\"1516\":[6,31],\"1517\":[6,20],\"1518\":[8,37],\"1519\":[6,24],\"1520\":[5,42],\"1521\":[7,26],\"1522\":[9,38],\"1523\":[7,33],\"1524\":[6,23],\"1525\":[8,34],\"1526\":[6,20],\"1527\":[7,39],\"1528\":[7,38],\"1529\":[7,35],\"1530\":[7,35],\"1531\":[7,50],\"1532\":[7,52],\"1533\":[7,38],\"1534\":[6,34],\"1535\":[8,45],\"1536\":[11,41],\"1537\":[8,35],\"1538\":[8,36],\"1539\":[7,28],\"1540\":[8,34],\"1541\":[8,35],\"1542\":[7,27],\"1543\":[9,44],\"1544\":[9,32],\"1545\":[7,26],\"1546\":[8,32],\"1547\":[8,28],\"1548\":[8,31],\"1549\":[6,42],\"1550\":[8,53],\"1551\":[11,42],\"1552\":[5,15],\"1553\":[5,15],\"1554\":[5,34],\"1555\":[5,40],\"1556\":[7,36],\"1557\":[5,15],\"1558\":[5,25],\"1559\":[5,28],\"1560\":[5,30],\"1561\":[6,36],\"1562\":[9,39],\"1563\":[5,28],\"1564\":[5,26],\"1565\":[8,48],\"1566\":[5,27],\"1567\":[5,20],\"1568\":[6,18],\"1569\":[6,28],\"1570\":[6,28],\"1571\":[5,53],\"1572\":[8,33],\"1573\":[8,29],\"1574\":[6,42],\"1575\":[5,46],\"1576\":[5,31],\"1577\":[6,25],\"1578\":[5,20],\"1579\":[7,23],\"1580\":[6,27],\"1581\":[4,42],\"1582\":[6,27],\"1583\":[4,29],\"1584\":[4,14],\"1585\":[2],\"1586\":[1,64],\"1587\":[3,57],\"1588\":[4,50],\"1589\":[1,50],\"1590\":[2],\"1591\":[1,6],\"1592\":[2],\"1593\":[3,23],\"1594\":[4,18],\"1595\":[5,22],\"1596\":[5,22],\"1597\":[4,20],\"1598\":[4,20],\"1599\":[3,26],\"1600\":[4,36],\"1601\":[5,51],\"1602\":[4,53],\"1603\":[3,25],\"1604\":[4,28],\"1605\":[3,21],\"1606\":[3],\"1607\":[1,2],\"1608\":[2],\"1609\":[1,138],\"1610\":[2,25],\"1611\":[1,28],\"1612\":[1,51],\"1613\":[4,22],\"1614\":[4,11],\"1615\":[2,29],\"1616\":[2,80],\"1617\":[1,73],\"1618\":[2],\"1619\":[5,32],\"1620\":[7,43],\"1621\":[10,39],\"1622\":[6,35],\"1623\":[6,34],\"1624\":[8,41],\"1625\":[5,26],\"1626\":[6,31],\"1627\":[6,20],\"1628\":[8,37],\"1629\":[6,24],\"1630\":[5,42],\"1631\":[6,23],\"1632\":[8,34],\"1633\":[8,27],\"1634\":[10,40],\"1635\":[8,33],\"1636\":[6,20],\"1637\":[7,39],\"1638\":[7,38],\"1639\":[7,38],\"1640\":[6,24],\"1641\":[6,47],\"1642\":[7,31],\"1643\":[6,28],\"1644\":[6,23],\"1645\":[5,20],\"1646\":[7,23],\"1647\":[6,27],\"1648\":[4,42],\"1649\":[6,27],\"1650\":[4,29],\"1651\":[4,14],\"1652\":[5,19],\"1653\":[5,16],\"1654\":[7,21],\"1655\":[8,35],\"1656\":[8,39],\"1657\":[9,22],\"1658\":[7,31],\"1659\":[7,26],\"1660\":[7,26],\"1661\":[8,31],\"1662\":[10,48],\"1663\":[13,44],\"1664\":[8,19],\"1665\":[8,19],\"1666\":[10,40],\"1667\":[9,23],\"1668\":[8,42],\"1669\":[4,21],\"1670\":[5,22],\"1671\":[5,23],\"1672\":[8,24],\"1673\":[5,22],\"1674\":[5,15],\"1675\":[5,16],\"1676\":[2],\"1677\":[1,72],\"1678\":[3,57],\"1679\":[3,25],\"1680\":[4,50],\"1681\":[1,50],\"1682\":[2],\"1683\":[1,6],\"1684\":[2],\"1685\":[3,23],\"1686\":[4,18],\"1687\":[5,22],\"1688\":[5,22],\"1689\":[4,20],\"1690\":[4,20],\"1691\":[3,26],\"1692\":[4,36],\"1693\":[5,51],\"1694\":[4,53],\"1695\":[3,25],\"1696\":[4,28],\"1697\":[3,21],\"1698\":[3],\"1699\":[1,2],\"1700\":[2],\"1701\":[5,19],\"1702\":[5,16],\"1703\":[7,21],\"1704\":[8,35],\"1705\":[8,39],\"1706\":[9,22],\"1707\":[7,31],\"1708\":[7,26],\"1709\":[7,26],\"1710\":[8,31],\"1711\":[10,48],\"1712\":[13,44],\"1713\":[8,19],\"1714\":[8,19],\"1715\":[10,40],\"1716\":[9,23],\"1717\":[8,42],\"1718\":[4,21],\"1719\":[5,22],\"1720\":[5,23],\"1721\":[8,24],\"1722\":[5,22],\"1723\":[5,15],\"1724\":[5,16],\"1725\":[6,31],\"1726\":[6,20],\"1727\":[8,37],\"1728\":[6,24],\"1729\":[5,43],\"1730\":[7,26],\"1731\":[9,38],\"1732\":[7,34],\"1733\":[6,23],\"1734\":[8,34],\"1735\":[6,21],\"1736\":[7,35],\"1737\":[7,35],\"1738\":[7,50],\"1739\":[7,52],\"1740\":[6,34],\"1741\":[8,45],\"1742\":[11,41],\"1743\":[8,35],\"1744\":[8,36],\"1745\":[7,28],\"1746\":[8,34],\"1747\":[8,35],\"1748\":[7,27],\"1749\":[9,44],\"1750\":[9,32],\"1751\":[7,26],\"1752\":[8,32],\"1753\":[8,28],\"1754\":[8,31],\"1755\":[6,42],\"1756\":[8,53],\"1757\":[11,42],\"1758\":[5,15],\"1759\":[5,15],\"1760\":[5,34],\"1761\":[5,40],\"1762\":[7,36],\"1763\":[5,15],\"1764\":[5,25],\"1765\":[5,28],\"1766\":[5,30],\"1767\":[6,36],\"1768\":[9,39],\"1769\":[5,28],\"1770\":[5,26],\"1771\":[8,48],\"1772\":[5,27],\"1773\":[5,20],\"1774\":[6,18],\"1775\":[6,28],\"1776\":[6,28],\"1777\":[5,53],\"1778\":[8,33],\"1779\":[8,29],\"1780\":[6,42],\"1781\":[5,46],\"1782\":[5,31],\"1783\":[4,42],\"1784\":[6,27],\"1785\":[4,29],\"1786\":[4,14],\"1787\":[2],\"1788\":[1,2],\"1789\":[2],\"1790\":[1,133],\"1791\":[2,25],\"1792\":[1,28],\"1793\":[1,51],\"1794\":[4,22],\"1795\":[4,11],\"1796\":[2,29],\"1797\":[2,80],\"1798\":[1,73],\"1799\":[2],\"1800\":[5,32],\"1801\":[7,43],\"1802\":[10,39],\"1803\":[6,35],\"1804\":[6,34],\"1805\":[8,41],\"1806\":[5,26],\"1807\":[6,31],\"1808\":[6,20],\"1809\":[8,37],\"1810\":[6,24],\"1811\":[5,43],\"1812\":[6,23],\"1813\":[8,34],\"1814\":[8,27],\"1815\":[10,40],\"1816\":[8,34],\"1817\":[6,21],\"1818\":[6,24],\"1819\":[6,47],\"1820\":[7,31],\"1821\":[6,28],\"1822\":[6,23],\"1823\":[5,20],\"1824\":[7,23],\"1825\":[4,42],\"1826\":[6,27],\"1827\":[4,29],\"1828\":[4,14],\"1829\":[5,19],\"1830\":[5,16],\"1831\":[7,21],\"1832\":[8,35],\"1833\":[8,39],\"1834\":[9,22],\"1835\":[7,31],\"1836\":[7,26],\"1837\":[7,26],\"1838\":[8,31],\"1839\":[10,48],\"1840\":[13,44],\"1841\":[8,19],\"1842\":[8,19],\"1843\":[10,40],\"1844\":[9,23],\"1845\":[8,42],\"1846\":[4,21],\"1847\":[5,22],\"1848\":[5,23],\"1849\":[8,24],\"1850\":[5,22],\"1851\":[5,15],\"1852\":[5,16],\"1853\":[2],\"1854\":[1,71],\"1855\":[3,57],\"1856\":[3,25],\"1857\":[4,50],\"1858\":[1,50],\"1859\":[2],\"1860\":[1,6],\"1861\":[2],\"1862\":[3,23],\"1863\":[4,18],\"1864\":[5,22],\"1865\":[5,22],\"1866\":[4,20],\"1867\":[4,20],\"1868\":[3,26],\"1869\":[4,36],\"1870\":[5,51],\"1871\":[4,53],\"1872\":[3,25],\"1873\":[4,28],\"1874\":[3,21],\"1875\":[3],\"1876\":[1,2],\"1877\":[2],\"1878\":[1,126],\"1879\":[2,25],\"1880\":[1,28],\"1881\":[1,51],\"1882\":[4,22],\"1883\":[4,11],\"1884\":[2,19],\"1885\":[2,11],\"1886\":[1,60],\"1887\":[2],\"1888\":[5,19],\"1889\":[5,16],\"1890\":[7,21],\"1891\":[8,35],\"1892\":[8,39],\"1893\":[9,22],\"1894\":[7,31],\"1895\":[7,26],\"1896\":[7,26],\"1897\":[8,31],\"1898\":[10,48],\"1899\":[13,44],\"1900\":[8,19],\"1901\":[8,19],\"1902\":[10,40],\"1903\":[9,23],\"1904\":[8,42],\"1905\":[4,21],\"1906\":[5,22],\"1907\":[5,23],\"1908\":[8,24],\"1909\":[5,22],\"1910\":[5,15],\"1911\":[5,16],\"1912\":[6,31],\"1913\":[6,20],\"1914\":[8,37],\"1915\":[6,24],\"1916\":[5,42],\"1917\":[7,26],\"1918\":[9,38],\"1919\":[7,33],\"1920\":[6,23],\"1921\":[8,34],\"1922\":[6,20],\"1923\":[7,39],\"1924\":[7,38],\"1925\":[7,35],\"1926\":[7,35],\"1927\":[7,50],\"1928\":[7,52],\"1929\":[7,38],\"1930\":[6,34],\"1931\":[8,45],\"1932\":[11,41],\"1933\":[8,35],\"1934\":[8,36],\"1935\":[7,28],\"1936\":[8,34],\"1937\":[8,35],\"1938\":[7,27],\"1939\":[9,44],\"1940\":[9,32],\"1941\":[7,26],\"1942\":[8,32],\"1943\":[8,28],\"1944\":[8,31],\"1945\":[6,42],\"1946\":[8,53],\"1947\":[11,42],\"1948\":[5,15],\"1949\":[5,15],\"1950\":[5,34],\"1951\":[5,40],\"1952\":[7,36],\"1953\":[5,15],\"1954\":[5,25],\"1955\":[5,28],\"1956\":[5,30],\"1957\":[6,36],\"1958\":[9,39],\"1959\":[5,28],\"1960\":[5,26],\"1961\":[8,48],\"1962\":[5,27],\"1963\":[5,20],\"1964\":[6,18],\"1965\":[6,28],\"1966\":[6,28],\"1967\":[5,53],\"1968\":[8,33],\"1969\":[8,29],\"1970\":[6,42],\"1971\":[5,46],\"1972\":[5,31],\"1973\":[6,25],\"1974\":[5,20],\"1975\":[7,23],\"1976\":[6,27],\"1977\":[4,42],\"1978\":[6,27],\"1979\":[4,29],\"1980\":[4,14],\"1981\":[2],\"1982\":[1,64],\"1983\":[3,57],\"1984\":[4,50],\"1985\":[1,49],\"1986\":[2],\"1987\":[1,6],\"1988\":[2],\"1989\":[3,23],\"1990\":[4,18],\"1991\":[5,22],\"1992\":[5,22],\"1993\":[4,20],\"1994\":[4,20],\"1995\":[3,26],\"1996\":[4,36],\"1997\":[5,51],\"1998\":[4,53],\"1999\":[3,25],\"2000\":[4,28],\"2001\":[3,21],\"2002\":[3],\"2003\":[1,2],\"2004\":[2],\"2005\":[1,138],\"2006\":[2,25],\"2007\":[1,28],\"2008\":[1,51],\"2009\":[4,22],\"2010\":[4,11],\"2011\":[2,29],\"2012\":[2,80],\"2013\":[1,73],\"2014\":[2],\"2015\":[5,32],\"2016\":[7,43],\"2017\":[10,39],\"2018\":[6,35],\"2019\":[6,34],\"2020\":[8,41],\"2021\":[5,26],\"2022\":[6,31],\"2023\":[6,20],\"2024\":[8,37],\"2025\":[6,24],\"2026\":[5,42],\"2027\":[6,23],\"2028\":[8,34],\"2029\":[8,27],\"2030\":[10,40],\"2031\":[8,33],\"2032\":[6,20],\"2033\":[7,39],\"2034\":[7,38],\"2035\":[7,38],\"2036\":[6,24],\"2037\":[6,47],\"2038\":[7,31],\"2039\":[6,28],\"2040\":[6,23],\"2041\":[5,20],\"2042\":[7,23],\"2043\":[6,27],\"2044\":[4,42],\"2045\":[6,27],\"2046\":[4,29],\"2047\":[4,14],\"2048\":[5,19],\"2049\":[5,16],\"2050\":[7,21],\"2051\":[8,35],\"2052\":[8,39],\"2053\":[9,22],\"2054\":[7,31],\"2055\":[7,26],\"2056\":[7,26],\"2057\":[8,31],\"2058\":[10,48],\"2059\":[13,44],\"2060\":[8,19],\"2061\":[8,19],\"2062\":[10,40],\"2063\":[9,23],\"2064\":[8,42],\"2065\":[4,21],\"2066\":[5,22],\"2067\":[5,23],\"2068\":[8,24],\"2069\":[5,22],\"2070\":[5,15],\"2071\":[5,16],\"2072\":[2],\"2073\":[1,72],\"2074\":[3,57],\"2075\":[3,25],\"2076\":[4,50],\"2077\":[1,49],\"2078\":[2],\"2079\":[1,6],\"2080\":[2],\"2081\":[3,23],\"2082\":[4,18],\"2083\":[5,22],\"2084\":[5,22],\"2085\":[4,20],\"2086\":[4,20],\"2087\":[3,26],\"2088\":[4,36],\"2089\":[5,51],\"2090\":[4,53],\"2091\":[3,25],\"2092\":[4,28],\"2093\":[3,21],\"2094\":[3],\"2095\":[1,2],\"2096\":[2],\"2097\":[1,126],\"2098\":[2,25],\"2099\":[1,28],\"2100\":[1,51],\"2101\":[4,22],\"2102\":[4,11],\"2103\":[2,19],\"2104\":[2,11],\"2105\":[1,60],\"2106\":[2],\"2107\":[5,19],\"2108\":[5,16],\"2109\":[7,21],\"2110\":[8,35],\"2111\":[8,39],\"2112\":[9,22],\"2113\":[7,31],\"2114\":[7,26],\"2115\":[7,26],\"2116\":[8,31],\"2117\":[10,48],\"2118\":[13,44],\"2119\":[8,19],\"2120\":[8,19],\"2121\":[10,40],\"2122\":[9,23],\"2123\":[8,42],\"2124\":[4,21],\"2125\":[5,22],\"2126\":[5,23],\"2127\":[8,24],\"2128\":[5,22],\"2129\":[5,15],\"2130\":[5,16],\"2131\":[6,31],\"2132\":[6,20],\"2133\":[8,37],\"2134\":[6,24],\"2135\":[5,42],\"2136\":[7,26],\"2137\":[9,38],\"2138\":[7,33],\"2139\":[6,23],\"2140\":[8,34],\"2141\":[6,20],\"2142\":[7,39],\"2143\":[7,38],\"2144\":[7,35],\"2145\":[7,35],\"2146\":[7,50],\"2147\":[7,52],\"2148\":[7,38],\"2149\":[6,34],\"2150\":[8,45],\"2151\":[11,41],\"2152\":[8,35],\"2153\":[8,36],\"2154\":[7,28],\"2155\":[8,34],\"2156\":[8,35],\"2157\":[7,27],\"2158\":[9,44],\"2159\":[9,32],\"2160\":[7,26],\"2161\":[8,32],\"2162\":[8,28],\"2163\":[8,31],\"2164\":[6,42],\"2165\":[8,53],\"2166\":[11,42],\"2167\":[5,15],\"2168\":[5,15],\"2169\":[5,34],\"2170\":[5,40],\"2171\":[7,36],\"2172\":[5,15],\"2173\":[5,25],\"2174\":[5,28],\"2175\":[5,30],\"2176\":[6,36],\"2177\":[9,39],\"2178\":[5,28],\"2179\":[5,26],\"2180\":[8,48],\"2181\":[5,27],\"2182\":[5,20],\"2183\":[6,18],\"2184\":[6,28],\"2185\":[6,28],\"2186\":[5,53],\"2187\":[8,33],\"2188\":[8,29],\"2189\":[6,42],\"2190\":[5,46],\"2191\":[5,31],\"2192\":[6,25],\"2193\":[5,20],\"2194\":[7,23],\"2195\":[6,27],\"2196\":[4,42],\"2197\":[6,27],\"2198\":[4,29],\"2199\":[4,14],\"2200\":[2],\"2201\":[1,64],\"2202\":[3,57],\"2203\":[4,50],\"2204\":[1,50],\"2205\":[2],\"2206\":[1,6],\"2207\":[2],\"2208\":[3,23],\"2209\":[4,18],\"2210\":[5,22],\"2211\":[5,22],\"2212\":[4,20],\"2213\":[4,20],\"2214\":[3,26],\"2215\":[4,36],\"2216\":[5,51],\"2217\":[4,53],\"2218\":[3,25],\"2219\":[4,28],\"2220\":[3,21],\"2221\":[3],\"2222\":[1,2],\"2223\":[2],\"2224\":[1,138],\"2225\":[2,25],\"2226\":[1,28],\"2227\":[1,51],\"2228\":[4,22],\"2229\":[4,11],\"2230\":[2,29],\"2231\":[2,80],\"2232\":[1,73],\"2233\":[2],\"2234\":[5,32],\"2235\":[7,43],\"2236\":[10,39],\"2237\":[6,35],\"2238\":[6,34],\"2239\":[8,41],\"2240\":[5,26],\"2241\":[6,31],\"2242\":[6,20],\"2243\":[8,37],\"2244\":[6,24],\"2245\":[5,42],\"2246\":[6,23],\"2247\":[8,34],\"2248\":[8,27],\"2249\":[10,40],\"2250\":[8,33],\"2251\":[6,20],\"2252\":[7,39],\"2253\":[7,38],\"2254\":[7,38],\"2255\":[6,24],\"2256\":[6,47],\"2257\":[7,31],\"2258\":[6,28],\"2259\":[6,23],\"2260\":[5,20],\"2261\":[7,23],\"2262\":[6,27],\"2263\":[4,42],\"2264\":[6,27],\"2265\":[4,29],\"2266\":[4,14],\"2267\":[5,19],\"2268\":[5,16],\"2269\":[7,21],\"2270\":[8,35],\"2271\":[8,39],\"2272\":[9,22],\"2273\":[7,31],\"2274\":[7,26],\"2275\":[7,26],\"2276\":[8,31],\"2277\":[10,48],\"2278\":[13,44],\"2279\":[8,19],\"2280\":[8,19],\"2281\":[10,40],\"2282\":[9,23],\"2283\":[8,42],\"2284\":[4,21],\"2285\":[5,22],\"2286\":[5,23],\"2287\":[8,24],\"2288\":[5,22],\"2289\":[5,15],\"2290\":[5,16],\"2291\":[2],\"2292\":[1,72],\"2293\":[3,57],\"2294\":[3,25],\"2295\":[4,50],\"2296\":[1,50],\"2297\":[2],\"2298\":[1,6],\"2299\":[2],\"2300\":[3,23],\"2301\":[4,18],\"2302\":[5,22],\"2303\":[5,22],\"2304\":[4,20],\"2305\":[4,20],\"2306\":[3,26],\"2307\":[4,36],\"2308\":[5,51],\"2309\":[4,53],\"2310\":[3,25],\"2311\":[4,28],\"2312\":[3,21],\"2313\":[3],\"2314\":[1,2],\"2315\":[1,3],\"2316\":[1],\"2317\":[1],\"2318\":[1]},\"averageFieldLength\":[5.15523932729625,37.71727934304683],\"storedFields\":{\"0\":{\"h\":\"Data Sharing Framework\",\"t\":[\"The Data Sharing Framework (DSF) is a concept for a secure middleware to distribute data sharing processes based on the BPMN 2.0 and FHIR R4 standards. The DSF is used to support biomedical research with routine data, aiming to extract, merge, pseudonymize and provide data stored in multiple distributed organizations. Every participating site runs a FHIR endpoint accessible by other sites and a business process engine in the local secured network. The process engines execute BPMN processes in order to coordinate local and remote steps necessary to enable cross-site data sharing or feasibility analyses. This includes access to local data repositories, use-and-access-committee decision support, consent filtering, and privacy preserving record-linkage and pseudonymization. The aim is to enable secure and syntactically-, semantically- and process-interoperable data exchange across organizational boundaries. The secure communication infrastructure is funded by the German Federal Ministry of Education and Research within the Medical Informatics structure as DSF Community.\",\"DSF concept\"]},\"1\":{\"h\":\"\",\"t\":[\"We are very pleased to have won the Rolf Hansen Memorial Award at EFMI MIE 2023 in Gothenburg. The Rolf Hansen Memorial Award is presented annually by the European Federation for Medical Informatics (EFMI) for an outstanding paper as well as for an excellent presentation. It is named after Rolf Hansen (1931-1993), a well-known Norwegian medical informatician and former president of EFMI. Hauke Hund presented his Paper: No Transfer Without Validation: A Data Sharing Framework Use Case in May at the EFMI MIE. doi:10.3233/SHTI230066 \"]},\"2\":{\"h\":\"and we will take care of your request as soon as possible.\"},\"3\":{\"h\":\"Contact & Community\"},\"4\":{\"h\":\"\",\"t\":[\"Feel free to contact us via E-Mail (dsf-gecko@hs-heilbronn.de) and we will take care of your request as soon as possible.\"]},\"5\":{\"h\":\"👥 COMMUNITY\",\"t\":[\"DSF's community is growing and we welcome anyone who would like to join! 🚀\"]},\"6\":{\"h\":\"Stay up to Date\",\"t\":[\"GitHub\",\"Follow our contributors on GitHub\",\"Zulip Chat - MII (If you would like access, please write us an E-MAIL)\"]},\"7\":{\"h\":\"Contribute Code\",\"t\":[\"You can get familiar with the DSF code on GitHub. Branching follows the git-flow model, for the latest development version see branch develop. Additionally, you can find more information here in the documentation.\"]},\"8\":{\"h\":\"Share your Experience & Get support\",\"t\":[\"You´re welcome to share your experience with the Community. If you have a bug to report or feature to request, that's what the GitHub issues are for.\"]},\"9\":{\"h\":\"Public Funding\"},\"10\":{\"h\":\"DSF - Medical Informatics Structure \\\"Data Sharing Framework Community\\\" (2023-2026)\",\"t\":[\"The DSF Community connects the DSF competencies of the entire Medical Informatics Initiative (MII) so that new use cases, in particular from Module 3 or the Network University Medicine (NUM), are better supported in creating the respective DSF plugins. In the context of Module 2b, the DSF Community contributes to the further development of the common digital infrastructure of the MII together with the FDPG+ and TRANSIT projects. BMBF\",\"Heilbronn University (HHN) focuses on the connecting of DSF related topics and competencies in the MII with the community management. The quality assurance of new DSF plugins and further development of the application and core components aim at a scalable, stable and secure operation of the DSF (Funding code: 01ZZ2307A).\",\"Heidelberg University is focusing on the further development of the DSF core components as well as the rollout of the DSF plugins, in particular also from the perspective of a data integration center in consultation with the FDGP+ and TRANSIT projects (Funding code: 01ZZ2307B).\",\"The University of Leipzig will further develop and adapt the DSF plugin for the Research Data Portal for Health FDPG according to specifications resulting from the FDPG+ project and enable Data Integration Centers (DIC) to operate the FDPG plugin (Funding code: 01ZZ2307C).\"]},\"11\":{\"h\":\"Development of the DSF in the HiGHmed consortium -Contribution Heilbronn University and Heidelberg University (2018-2022)\",\"t\":[\"HiGHmed aims to increase the efficiency of clinical research and improve patient care through new medical informatics solutions and cross-organizational data exchange. The concept will be developed on the basis of three defined prototypical use cases, which will ensure close integration with the requirements of patient care and medical research. The GECKO Institute of HHN will establish a trusted third party with pseudonymization service to implement the goals of HiGHmed and is involved in the technical development of the DSF together with the partners (Funding code: 01ZZ1802E). Heidelberg University is in particular involved in the technical development of the DSF (Funding code: 01ZZ1802A).\"]},\"12\":{\"h\":\"Partner\",\"t\":[\"Funded for further development of the Data Sharing Framework are:\"]},\"13\":{\"h\":\"Heilbronn University of Applied Sciences | Gecko Institute\",\"t\":[\"The GECKO Institute is a research institution of Heilbronn University of Applied Sciences and conducts research and development at the interfaces between medicine, economics and computer science. The DSF is part of Prof. Fegeler's research area: Interoperability and Digital Processes in Medicine. Other areas of research include educational technologies, health economics, and consumer health informatics.\"]},\"14\":{\"h\":\"University of Heidelberg | Institute of Medical Informatics\",\"t\":[\"The Institute of Medical Informatics belongs to the University of Heidelberg. The scientific focus of the institute is on structured patient data, e.g.\",\"in the Medical Data Integration Center (MeDIC),\",\"structured acquisition and transformation of biomedical data,\",\"medical information systems and data models\",\"and much more.\"]},\"15\":{\"h\":\"University of Leipzig | LIFE Institute\",\"t\":[\"The LIFE Institute of the University of Leipzig manages collaborative and follow-on projects in the fields of medicine, public health, medical informatics, and biobanking.\"]},\"16\":{\"h\":\"About us\"},\"17\":{\"h\":\"Overview\",\"t\":[\"Contact & Community Guide\",\"Contributors\",\"Partner\",\"Public Funding\"]},\"18\":{\"h\":\"Team\",\"t\":[\"The funded project team includes:\",\"Prof. Dr. Christian Fegeler • Homepage\",\"Hauke Hund • GitHub\",\"Maximilian Kurscheidt • GitHub\",\"Simon Schweizer • GitHub\",\"Christoph Zilske • GitHub\",\"Reto Wettstein • GitHub\",\"Alexander Kiel • GitHub\",\"We thank additional contributors, including:\",\"Florian Seidel • GitHub\",\"Simon Mödinger • GitHub\"]},\"19\":{\"h\":\"\",\"t\":[\"Community\"]},\"20\":{\"h\":\"DSF for your project\",\"t\":[\"Summary\",\"Use case agnostic middleware: DSF is adaptable to any distributed process, leveraging BPMN 2.0 and FHIR R4 for secure, efficient data sharing across various biomedical research scenarios.\",\"Security: DSF prioritizes security through stringent authentication and authorization protocols, ensuring data is accessed and shared only by authorized organizations to maintain data confidentiality and integrity.\",\"Proven in clinical research: Deployed in German university hospitals, DSF's effectiveness and reliability are validated in real-world settings.\",\"Implementation guidance: DSF offers resources on how to implement new process plugins.\"]},\"21\":{\"h\":\"Overview of DSF\",\"t\":[\"The Data Sharing Framework (DSF) is a secure middleware solution designed to facilitate data sharing across different organizations for biomedical research. It utilizes BPMN 2.0 and FHIR R4 standards to support processes such as data extraction, merging, pseudonymization, and provisioning. Funded by the German Federal Ministry of Education and Research as part of the Medical Informatics initiative, the DSF aims to improve data interoperability and security across institutional boundaries.\"]},\"22\":{\"h\":\"Key features and benefits\"},\"23\":{\"h\":\"Distributed data sharing processes\",\"t\":[\"DSF enables distributed data sharing by providing each participating site with a FHIR endpoint and a business process engine. This setup ensures that data can be securely shared and processed across different sites, facilitating cross-site data sharing and feasibility analyses.\"]},\"24\":{\"h\":\"Flexibility with data standards\",\"t\":[\"While DSF primarily uses the FHIR R4 standard to ensure high-quality data exchange, it is designed to be open and adaptable to other data formats. This flexibility allows for a wide range of data types to be incorporated into research projects.\"]},\"25\":{\"h\":\"Security and access control\",\"t\":[\"Security is a critical component of DSF, which includes robust authentication and authorization protocols. These protocols ensure that data access and sharing are restricted to authorized organizations, maintaining the confidentiality and integrity of the data.\"]},\"26\":{\"h\":\"Deployment in clinical environments\",\"t\":[\"DSF is already deployed and operational in Data Integration Centers at German university hospitals, demonstrating its applicability and reliability in real-world clinical research settings.\"]},\"27\":{\"h\":\"Getting started with the DSF\",\"t\":[\"If you're looking to leverage the DSF for your research or you're interested in exploring how it can enhance your data sharing needs, we're here to support you. Visit the Learn how to implement your use case page to start your journey towards integrating the DSF into your research project.\",\"Should you have any questions or need personalized assistance, don't hesitate to reach out to the DSF core team directly at dsf-gecko@hs-heilbronn.de.\",\"Embark on your DSF journey today and join a community committed to advancing biomedical research through secure, interoperable data sharing.\"]},\"28\":{\"h\":\"How to implement your use-case\",\"t\":[\"Work in progress\",\"This site is work in progress, please come back later.\",\"If you want further information about the DSF and how to implement use cases, please visit:\",\"Documentation Overview\",\"Getting started\",\"Contact us\"]},\"29\":{\"h\":\"Hackathon\",\"t\":[\"Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+\",\"Montags, 13:00-14:00 Uhr\",\"Ort: https://dsf.dev/sprechstunde\",\"Zusammenfassung\",\"Konferenz: https://audimax.heiconf.uni-heidelberg.de/jxh4-jxx2-tm6c-d37q\",\"Vorbereitung\",\"Installationshinweise\",\"Wir laden Sie herzlich zu unserem kommenden Hackathon am 18.06. von 10:00 Uhr bis 15:30 Uhr ein. Diese Veranstaltung bietet die Gelegenheit, sich mit den neuesten Updates und Funktionen unserer Komponenten vertraut zu machen.\",\"Agenda:\",\"Einführung in Neuerungen (10:00 - 11:00 Uhr): \",\"Begrüßung und Einführung in die neuen Funktionen und Verbesserungen des DSFs\",\"Präsentation der Änderungen der MII DSF-Prozessplugins, sowie von Blaze und Flare\",\"Updates MII-Komponenten (ab 11:00 Uhr bis verlängerter Pause, um NUM-DIZ-Meeting besuchen zu können): \",\"DSF\",\"Feasibility\",\"Data Sharing\",\"Data Transfer\",\"KDS Report\",\"Blaze\",\"Flare mit neuer KDS Ontologie\",\"Testen des Prozessplugins \\\"Data Sharing\\\" (ab 14:15 Uhr): \",\"Praktische Anwendung des \\\"Data Sharing\\\"-Prozessplugins auf unserer Testinfrastruktur.\",\"Ziel der Veranstaltung ist es die Test- und Produktivsysteme möglichst aller Standorte auf den neusten Stand zu patchen.\"]},\"30\":{\"h\":\"Vorbereitung\",\"t\":[\"In diesem Hackathon ist das Aktualisieren der Systeme ein aktiver Bestandteil und bedarf keiner speziellen Vorbereitung. Für das Testen der Data Sharing Prozesse sollten jedoch einige Voraussetzungen bereits vor dem Termin erfüllt sein.\"]},\"31\":{\"h\":\"Netzwerkfreigaben\",\"t\":[\"Für den Hackathon werden wir primär die Test-DMS aus Heilbronn verwenden, dafür muss neben der Freigabe zur FDPG auch die Freigabe zum und vom MII-Test-System der HHN vorhanden sein (mii-test.gecko.hs-heilbronn.de).\",\"In diesem Kontext bietet es sich an, auch die Freigaben für weitere Test-DMSen zu beantragen. Weitere Details dazu befinden sich in der Liste der Firewallregeln im Test-Allowlist-Management-Tool (allowlist-test.gecko.hs-heilbronn.de) unter dem Punkt “Download Allowlist”. Wir planen während des Termins auch mit ausgewählten DIZen erste Funktionstests der Test-DMSen durchzuführen.\",\"Wir empfehlen auch sicherzustellen, dass Sie Zugriff auf die Weboberfläche Ihres DSF-FHIR-Servers haben.\"]},\"32\":{\"h\":\"FHIR-Store\",\"t\":[\"Zur Datenausleitung im Kontext des Data Sharing Prozesses werden wir FHIR Bundles mit Testdaten zur Verfügung stellen, die in Form eines FHIR Bundles auf einem FHIR Store gespeichert werden müssen. Dabei kann ein beliebiger FHIR Server (z.B. HAPI FHIR oder Blaze) verwendet werden. Es kann auch der FHIR Server verwendet werden, der z.B. für Feasibility im Testsystem genutzt wird.\",\"Weitere Details zum Data Sharing Prozess sind hier zu finden:\",\"https://github.com/medizininformatik-initiative/mii-process-data-sharing/wiki\",\"Eine Installation kann vor oder während des Hackathons durchgeführt werden.\"]},\"33\":{\"h\":\"Installationshinweise\"},\"34\":{\"h\":\"DSF\",\"t\":[\"Installation oder Update\"]},\"35\":{\"h\":\"Prozessplugins\",\"t\":[\"DSF Ping Pong 1.0.1.0 Release Notes\",\"DSF Allowlist Plugin 1.0.0.1 Release Notes\",\"MII Feasibility 1.0.0.5 Instructions\",\"MII Process Report 1.1.0.0 for Test Infrastructure Instructions. Please use 1.0.x.x for Prod for now Instructions\",\"MII Process Data Transfer 1.0.1.0 Instructions\",\"MII Process Data Sharing 1.0.0.1 Instructions\"]},\"36\":{\"h\":\"Weitere Anwendungen\",\"t\":[\"Flare Instructions\",\"Blaze 0.27.1 Instructions\"]},\"37\":{\"h\":\"Data Sharing Demodaten\",\"t\":[\"https://github.com/medizininformatik-initiative/mii-process-data-sharing/blob/develop/src/test/resources/fhir/Bundle/Dic1FhirStore_Demo_Bundle.xml\",\"Falls Sie Fragen zum Hackathon oder der Installation des DSF haben, melden Sie sich gerne über den DSF-Community Zulip-Channel oder dsf-gecko@hs-heilbronn.de.\"]},\"38\":{\"h\":\"Publications and Talks\"},\"39\":{\"h\":\"Publications\",\"t\":[\"H. Hund, R. Wettstein, C.M. Heidt, C. Fegeler, Executing Distributed Healthcare and Research Processes – The HiGHmed Data Sharing Framework, Stud Health Technol Inform, 278 (2021) 126-133, doi:10.3233/SHTI210060\",\"R. Wettstein, H. Hund, I. Kobylinski, C. Fegeler, O. Heinze, Feasibility Queries in Distributed Architectures – Concept and Implementation in HiGHmed, Stud Health Technol Inform, 278 (2021) 134-141, doi:10.3233/SHTI210061\",\"C.M. Heidt, H. Hund, C. Fegeler, A Federated Record Linkage Algorithm for Secure Medical Data Sharing, Stud Health Technol Inform, 278 (2021) 142-149, doi:10.3233/SHTI210062\",\"R. Wettstein, H. Hund, C. Fegeler, O. Heinze, Data Sharing in Distributed Architectures – Concept and Implementation in HiGHmed, Stud Health Technol Inform, 283 (2021) 111-118, doi:10.3233/SHTI210548\",\"H.-U. Prokosch, T. Bahls, M. Bialke, J. Eils, C. Fegeler, J. Gruendner, B. Haarbrandt, C. Hampf, W. Hoffmann, H. Hund, et al. The COVID-19 Data Exchange Platform of the German University Medicine, Stud Health Technol Inform, 294 (2022) 674-678, doi:10.3233/SHTI220554\",\"R. Wettstein, T. Kussel, H. Hund, C. Fegeler, M. Dugas, K. Hamacher, Secure Multi-Party Computation Based Distributed Feasibility Queries – A HiGHmed Use Case, Stud Health Technol Inform, 296 (2022) 41-49, doi:10.3233/SHTI220802\",\"C. Zilske, M. Kurscheidt, S.T. Schweizer, H. Hund, S. Mödinger, C. Fegeler, Monitoring Distributed Business Processes in Biomedical Research, Stud Health Technol Inform, 302 (2023) 252-256, doi:10.3233/SHTI230113\",\"H. Hund, R. Wettstein, C. Hampf, M. Bialke, M. Kurscheidt, S.T. Schweizer, C. Zilske, S. Mödinger, C. Fegeler, No Transfer Without Validation: A Data Sharing Framework Use Case, Stud Health Technol Inform, 302 (2023) 68-72, doi:10.3233/SHTI230066\",\"H. Hund, R. Wettstein, M. Kurscheidt, S.T. Schweizer, C. Zilske, C. Fegeler, Interoperability Is a Process- The Data Sharing Framework, Stud Health Technol Inform, 310 (2024) 28-32, doi:10.3233/SHTI230921\"]},\"40\":{\"h\":\"Recorded Talks\"},\"41\":{\"h\":\"GMDS Conference 2022\",\"t\":[\"Hands On! - Introduction to the Data Sharing Framework from a User Perspective \",\"Tutorial: Implementing BPMN Processes as DSF Process-Plugins\"]},\"42\":{\"h\":\"GMDS Conference 2020\",\"t\":[\"Executing Distributed Healthcare and Research Processes – the HiGHmed Data Sharing Framework\",\"Feasibility Queries in Distributed Architectures – Concept and Implementation in HiGHmed\",\"A Federated Record Linkage Algorithm for Secure Medical Data Sharing\"]},\"43\":{\"h\":\"Documentation\"},\"44\":{\"h\":\"Overview\",\"t\":[\"Documentation \",\"Introduction\",\"Basics & Standards\",\"Architecture\",\"Security\",\"Allow Lists\",\"Process Plugins\"]},\"45\":{\"h\":\"\",\"t\":[\"Reference\"]},\"46\":{\"h\":\"\",\"t\":[\"Introduction\"]},\"47\":{\"h\":\"\",\"t\":[\"Research\"]},\"48\":{\"h\":\"Allow Lists\"},\"49\":{\"h\":\"Goal\",\"t\":[\"The main objective is to allow only authorized organizations to do what \\\"we\\\" allow them to do (e.g. query data). First, we need a list of organizations that we trust. Secondly, we need a way to ensure that the other party is a member of the parent organization. Thirdly, a list of actions we want to allow the organization to perform is needed. An organization can have different roles in different use cases.\",\"The Allow List consists of Organization-, Endpoint- and OrganisationAffiliation- resources. With these resources the allow list defines communication partners and and parent organizations like research consortia and groups as well as the roles of each organization. Each DSF FHIR server stores their own allow list. To make sure that processes can be executed, parties must allow access via their allow list.\",\"Architecture\"]},\"50\":{\"h\":\"Allow List Managment\",\"t\":[\"Here you can read all the information if you want to create or update an Allow List.\"]},\"51\":{\"h\":\"and we will take care of your request as soon as possible.\"},\"52\":{\"h\":\"Architecture\",\"t\":[\"The Data Sharing Framework implements a distributed business process engine based on the BPMN 2.0 and FHIR R4 standards. Every participating organisation (e.g. ORG. A) runs a FHIR endpoint accessible by other sites and a business process engine (BPE) in the local secured network. Once the DSF has been installed in an organisation, it can be used for multiple use cases.\",\"Simplified DSF Architecture\",\"The following architecture diagram also shows three organisations, each of which has installed the DSF. The FHIR endpoint (green) is located in a demilitarised zone (DMZ) and is accessible from outside for communication with other organisations. It can be compared to a mailbox. The Business Process Engine (BPE - blue) is located in the intranet of an organisation and is responsible for the execution of processes. The metaphor: control centre helps here.\",\"DSF Architecture\"]},\"53\":{\"h\":\"DSF FHIR Server 📫\",\"t\":[\"As mentioned above, the externally accessible DSF FHIR server acts as a mailbox for communication. This means that an organisation creates a task resource in its DSF and drops the task resource (letters) into the mailbox of another organisation, requesting that something happen. Task resources have been explained in more detail in the section Basics and Standards. It is important to understand that the DSF FHIR server is not used for persisting medical data.\",\"DSF FHIR Server\"]},\"54\":{\"h\":\"Business Process Engine (BPE)\",\"t\":[\"The BPE located in the secure internal network executes the processes (BPMN/Java). The BPE is deployed in the internal network and has access to the local systems, such as the organisation's own FHIR server, on which medical data is stored. These FHIR servers are not to be confused with the DSF FHIR server, on which no medical data is persisted. Different processes can be executed simultaneously. For this, only a new process plugin file has to be added and configured. More about this in the Process Plugins.\",\"BPE\",\"The DSF BPE uses websocket (WSS) and webservice (HTTPS) connections to communicate with the DSF FHIR server. FHIR resources are created, read, updated and deleted via HTTP requests against the FHIR webservice API. The FHIR subscription mechanism is used to communicate Task resources with status 'requested' and QuestionnaireResponse resources with status 'completed' to the BPE via websockets. When the BPE starts and before the websocket connections are established, 'requested' Task resources and 'completed' QuestionnaireResponse not seen by the BPE are read via webservice requests.\"]},\"55\":{\"h\":\"Flexible Deployment\",\"t\":[\"The deployment of the architecture is flexible. The organisations can be deployed as a star schema (left) or as a mesh schema (right). In the Star schema (left), all Data Integration Centres (DIC) are connected to a central node (CRR - Central Research Repository), which transfers the information to all nodes (DIC). For security reasons, a data transfer hub (DTH) is connected upstream, which provides additional security so that the medical data is never transferred together with the authenticating data.\",\"In the mesh scheme (right), the nodes (DIC) are all directly connected to each other and the information is transferred from node to node. Here in the FDPG (Forschungsdatenportal - Research Data Portal), the data can then be accessed for research purposes. More about this here.\"]},\"56\":{\"h\":\"Network Setup & Additional Reverse Proxy in external DMZ\",\"t\":[\"You can find more information about the network setup here\"]},\"57\":{\"h\":\"Basics and Standards\",\"t\":[\"Here you can find some basic information about interoperability and the standards were using within the DSF before we go into details about the architecture. Here we only describe how the standards (FHIR and BPMN) are used within the DSF. If you want to gain a deeper knowledge of the standards, we recommend visiting these websites: HL7 FHIR and BPMN\"]},\"58\":{\"h\":\"Interoperability\",\"t\":[\"Interoperability is the ability of different systems to work together as seamlessly as possible. We can divide interoperability into four levels.\",\"The foundational level defines the basic interconnectivity requirements which are necessary for a system or application to securely transmit data to and receive data from another system or application. Techniques such as HTTPS or REST are used for this.\",\"The second level is the structural level. It defines the format and the syntax of the data exchange. Therefore, data formats like JSON or XML can be used.\",\"The semantic level ensures the correct interpretation of the contents of the exchanged data between the different systems. Therefore, information models as FHIR or CDA or medical terminology systems like SNOMED CT or ICD can be used.\",\"The final level, the organizational level, includes policy, social, legal and organizational aspects that enable secure, seamless and timely communication and use of data both within and between organizations. And importantly, these components enable shared consent, trust and integrated end-user processes and workflows.\",\"Levels of interoperability\"]},\"59\":{\"h\":\"HL7 FHIR 🔥\",\"t\":[\"HL7 FHIR is a standard for data exchange that can be used as an information model for communication within and between systems. The standard is based on resources, references and profiles. With this concept, FHIR offers interoperability out of the box. The resources describe data formats. 150 specified resources cover the entire health system. An example of a resource would be a patient, which consists of data such as name or gender. These resources can refer to other resources by means of references. This connects the information units into a network. For seamless exchange of information, FHIR supports RESTful architectures and web standards such as XML or JSON, which makes it easier for developers to use FHIR. The FHIR profiles can be understood as a set of rules. They explain, for example, which attributes must be mandatorily specified or which terminology may be used. In addition, profiles and controlled vocabulary can be validated.\"]},\"60\":{\"h\":\"BPMN\",\"t\":[\"Business Process Modelling Notation is a modelling language that can be used to model and implement processes. The models can be used for the documentation of processes and for communication between different stakeholders. Furthermore, BPMN forms a standardised bridge between process design and process implementation. This is because it simplifies implementation. These processes are executed by a Business Process Engine. Basically, a BPE is a server that can read and execute the business process. More about this in the section on architecture.\",\"Example of a BPMN model (Ping-Pong-Process of the DSF)\"]},\"61\":{\"h\":\"Why are we using FHIR and BPMN?\",\"t\":[\"On the one hand we use FHIR because of the mentioned benefits. On the other hand FHIR fits great with BPMN and these two in combination are a great fit for what we do:Execute distributed data sharing Processes.\",\"We do not need all 150 FHIR resources. The following FHIR resources are the ones we need and have implemented: ActivityDefinition, Binary, Bundle, CodeSystem, DocumentReference, Endpoint, Group, Library, Measure, MeasureReport, NamingSystem, Organization, Questionnaire, QuestionnaireResponse, ResearchStudy, StructureDefinition, Subscription, Task and ValueSet.\",\"Don't worry, it is not important to understand them all now. But to understand why we use FHIR and BPMN, it is important to look at the ActivityDefinition and TaskResources on the FHIR side and the Message Events on the BPMN side. In the following picture you can see parts of BPMN. These Message Events enable the communication between different organizations. Every time there is a Message Event between two business processes, there is a corresponding TaskResource on the FHIR side. When one organization sends a message for example “do some work” to another organization or when we send a message to ourselves to start or continue a process, we do this by creating a FHIR TaskResource with the status “requested”. After that the Business Process Engine starts the work and the status switches to “in-progress” and if the work is done to “completed” or if there is a problem to “failed”.\",\"The ActivityDefinition is needed to publish what can be done in an instance. That means the ActivityDefinition contains the process description with the authorisation who is allowed to send a message.\",\"BPMN MessageEvents\"]},\"62\":{\"h\":\"Introduction\",\"t\":[\"The German Federal Ministry of Education and Research is funding the Medical Informatics Initiative with the aim of making routine data available digitally, reliably and quickly for medical research. University hospitals have founded consortia with partners such as research institutions and other companies to create the conditions for research and patient care to share their data across sites. Data Integration Centers (DIC) have been established at the university hospitals and partner institutions to create the technical and organizational conditions for data exchange between patient care and medical research.\",\"The Data Sharing Framework (DSF) was developed within the HiGHmed consortium of the Medical Informatics Initiative and is now funded as an independent project by the German Federal Ministry of Education and Research within the Medical Informatics structure as DSF Community.\",\"The DSF is a concept for a secure middleware to distribute data sharing processes, aiming to extract, merge, pseudonymize and provide data stored in multiple distributed DICs. A researcher can use the DSF for example to submit feasibility queries to several DICs and thus has the opportunity to obtain sufficient data from different locations for his or her research. By using international standards such as FHIR and BPMN 2.0, the problem of heterogeneous data models, primary systems, architectures and federated legislation between DICs can be solved. The aim is to enable secure and syntactically-, semantically- and process-interoperable data exchange across organisational boundaries.\",\"DSF concept\",\"The DSF is a secure communication infrastructure, that (1) scales with communication relationships, (2) orchestrates processes and instances, (3) separates execution logic from program code, (4) enables automated and user-centeric process steps ​(5) and can be used for heterogeny structures.\",\"Federated data exchange between distributed DICs (CRP=Central Research Portal, DMU=Data Management Unit)\"]},\"63\":{\"h\":\"Network Setup and General Architecture\",\"t\":[\"The Data Sharing Framework consists of two components: A FHIR Endpoint Server used to except Task resources and provide resources for download by other organizations and a Business Process Engine Server run internal and not accessible by other organization to execute and coordinate processes.\",\"Network Setup Diagramm\",\"FHIR Reverse Proxy: The FHIR Reverse Proxy is used to terminate incoming https connections to the FHIR App Server. The Reverse Proxy needs to be accessible on port 443 from the internet. Incoming https connection will be delegate as http on a docker internal network to the FHIR App Server.\",\"FHIR App Server: The FHIR App Server is used as a FHIR Endpoint for incoming Task resources and providing resources for download by other organizations. In order to validate incoming FHIR resources the server will communicate with FHIR Servers at other organizations. Access to resources and authorization for creating or updating resources is granted based on the content of the resource and/or based on the client (identified by its client certificate) being part of an allow list. JDBC connections to the FHIR DB Server\",\"FHIR DB Server: PostgreSQL database for the FHIR App Server.\",\"BPE App Server: The BPE App Server is executing BPMN 2.0 business processes with the included business process engine. Automatic BPMN service tasks are used for example to check resource, access the PDP- and MPI-servers as well as the MDAT repository. The calculation of record linkage bit vectors (Record Bloom Filters) is also performed using an automatic service task. As of version 0.3.0 the BPE server does not provide any webservices for modifying an server resources.\",\"BPE DB Server: PostgreSQL database for the BPE App Server.\",\"PDP: IHE Policy Decision Point for deciding on patient consent.\",\"MDAT Repo: Repository (e.g. openEHR) for storing medical data (MDAT).\",\"MPI: IHE Master Patient Index for storing identifying patient date (IDAT) e.g. first name, last name, date of birth.\",\"Cohort Browser: Example for a system to trigger patient cohort size estimations across multiple organizations.\",\"More information on Client- and Server-Certificates are available on the dedicated wiki page: Authentication: Client/Server Certificates\"]},\"64\":{\"h\":\"Additional Reverse Proxy in external DMZ\",\"t\":[\"In some organizations an additional reverse proxy in an external DMZ is needed. This can be accomplished by using for example nginx or haproxy as a TCP-Proxy. Example configurations routing traffic using SNI can be found below. Configuring an additional reverse proxy to terminate the incoming TLS connection early is not recommended.\",\"Network Setup Diagramm\"]},\"65\":{\"h\":\"Process Plugins\"},\"66\":{\"h\":\"Overview\",\"t\":[\"It is important to understand that the DSF is only the silent helper in the background: a middleware. The DSF is use case agnostic. This means that process plugins make it possible to execute almost any use case you can imagine with the DSF. Process plugins provide individual functionality. For example, it is possible to use the Ping Pong process to test bilateral communication or the Feasibility process to perform feasibility queries for research. However, it is possible to deploy several process plugins together, even the same process plugin in different versions. A process plugin is basically an archive of BPMN 2.0 models, FHIR R4 resources and Java code. This process plugin is deployed as a Jar file on the BPE.\"]},\"67\":{\"h\":\"BPMN: Example\",\"t\":[\"BPMN models can be created with Camunda Modeler. The following model is a BPMN model consisting of two lanes: These are the square boxes, i.e. Organization A and B. This process is intended only as an example to illustrate the formalities. We will look at realistic processes in the next chapter.\",\"BPMN: Example\"]},\"68\":{\"h\":\"Ping Pong Process\",\"t\":[\"The ping process plugin can be used for (periodic) connection testing between organizations that are part of your DSF allow list. The following figure shows a representation of the process.\",\"Ping-Pong Process\",\"The ping pong process is composed of 3 different subprocesses:\"]},\"69\":{\"h\":\"Autostart Ping Process\",\"t\":[\"The autostart ping process is used to execute connection tests in a predefined interval. This subprocess performs the following steps:\",\"Start a timer with a predefined interval (default 24 h)\",\"Start the ping process once per interval\",\"Stop the timer after the current interval completes\"]},\"70\":{\"h\":\"Ping Process\",\"t\":[\"The ping process is used to check outgoing and incoming connections to organizations in your allow-list. This subprocess performs the following steps:\",\"Select organizations in your allow list that should receive a ping message\",\"Send ping message to selected organizations\",\"Receive pong message from selected organizations\",\"Log status of ping/pong messages\",\"Log errors if any occur\"]},\"71\":{\"h\":\"Pong Process\",\"t\":[\"The pong process is used to send a response during the connection test to the requesting organization. This subprocess performs the following steps:\",\"Receive ping message from requesting organizations\",\"Send pong message to requesting organizations\",\"Log status of ping/pong message\",\"Log errors if any occur\"]},\"72\":{\"h\":\"Security by Design\"},\"73\":{\"h\":\"Basics Security\",\"t\":[\"The open-source Data Sharing Framework is EU-GDPR compliant and meets the highest security standards by design. DSF FHIR servers only accept certain FHIR resources from internal systems/administrators (e.g. tasks, binary resources...). In addition, the communication partners are defined via Allow Lists. This means that an organisation can only communicate with organisations that are included in the allow list of approved organisations of the participating organisations. More information about allow lists can be found in the next chapter. For transport encryption, the TLS protocol is used. Secure Web Socket (WSS) connections provide security for the connection between the DSF FHIR server (DMZ) and the BPE (internal network). In addition, the DSF is being actively developed and there is an excellent community, both of which guarantee fast security patches.\"]},\"74\":{\"h\":\"Authentication\",\"t\":[\"Authentication of organizations within the DSF is handled by the use of X.509 client and server certificates. Currently the certificate authorities run by DFN-PKI Global G2, D-Trust via TMF e.V. and GÉANT TCS via DFN are supported. All participating organizations are entered in a distributed and synchronized allow-list of valid organizations and certificates.\",\"A webserver certificate is needed to run the FHIR endpoint and a 802.1X client certificate is used to authenticate against other organizations endpoints and as a server certificate for the business process engine. For available certificate profiles see DFN-PKI-Zertifikatprofile_Global.pdf\",\"More information about client and server certificates can be found here.\"]},\"75\":{\"h\":\"Certificate Requests 🔒\"},\"76\":{\"h\":\"FHIR Endpoint\",\"t\":[\"Server certificates are used to authenticate the FHIR endpoint on the local network and to other organisations\",\"Certificate profile: \",\"DFN-PKI Global G2 via DFN e.V.: Web Server\",\"D-Trust via TMF e.V.: Advanced SSL ID\",\"GÉANT TCS via DFN e.V.: Web Server\",\"Common name: FQDN of the server used while accessing from other organizations (external FQDN)\",\"Subject alternative DNS entries: Use additional alternative FQDNs if a different name is used while accessing the Server from the local Network (local FQDN)\",\"More information: Parameters FHIR Server\"]},\"77\":{\"h\":\"Business Process Engine Server\",\"t\":[\"Client certificates are used to authenticate against remote FHIR endpoints (when either the BPE server or the FHIR endpoint server acts as the client). In addition, client certificates are used to authenticate the Business Process Engine server on the local network.\",\"Certificate profile: \",\"DFN-PKI Global G2 via DFN e.V.: 802.1X Client\",\"D-Trust via TMF e.V.: Basic Team ID\",\"GÉANT TCS via DFN e.V.: Web Server\",\"Common name: FQDN of the server used while accessing from the local network (local FQDN)\",\"More information: Parameters BPE Server\"]},\"78\":{\"h\":\"GMDS2022 - Process Development\",\"t\":[\"Redirect to this webpage.\"]},\"79\":{\"h\":\"MIE May 2023\"},\"80\":{\"h\":\"Abstract\",\"t\":[\"With this tutorial, participants will gain a detailed insight into the Data Sharing Framework (DSF) (https://github.com/highmed/highmed-dsf). The open source DSF enables users to execute biomedical research and healthcare delivery processes across organizations, and the tutorial will demonstrate this with examples from the German Medical Informatics Initiative (MII) (https://www.medizininformatik-initiative.de/en/start) funded by the Federal Ministry of Education and Research (BMBF). The tutorial will cover fundamental concepts of distributed processes, the DSFs architecture and key standards such as HL7 FHIR and BPMN 2.0. Participants will have the opportunity to gain hands-on experience with the DSF by working with different processes in a lab setting. Technical aspects such as authentication and authorization will be covered, as well as guidance on using the DSF for other use cases. This tutorial is designed for those involved in distributed research projects, including project members and software developers, as well as individuals interested in multi-organizational research projects.\"]},\"81\":{\"h\":\"Topic\",\"t\":[\"The use of real-world data collected by healthcare providers for bio-medical research requires the data to be available and accessible. This is especially important when considering the usage of data across organizations. Distributed processes such as feasibility studies, record linkage, and data sharing need to be established for effective consolidation and analysis. While even multi-center retrospective studies using real-world data become commonplace, maintaining infrastructure components for every project conducted is not sustainable. To address this, the Data Sharing Framework (DSF) was developed as an open source, use case independent distributed business process engine to execute cross-organizational research and healthcare delivery processes.\",\"The tutorial will cover the fundamental concepts of distributed processes and will provide an overview of the DSF's architecture and key standards such as HL7 FHIR and BPMN 2.0 that are used in the framework. The tutorial will present real-world examples to illustrate the DSFs capabilities and delve into specific issues the DSF addresses for the German Medical Informatics Initiative (MII).\",\"Participants will have the opportunity to gain hands-on experience with the DSF by working with different processes in a lab setting. Technical aspects such as authentication and authorization, onboarding of new organizations and guidance on using the DSF for other use cases, such as specific research projects or new infrastructure developments, will be covered. Finally, the tutorial will present lessons learned from the last years of using the DSF in test and production environments in multiple research consortia and will present ideas for future improvements based on feedback from end-users, process developers, project managers and administrative staff.\"]},\"82\":{\"h\":\"Target Group\",\"t\":[\"Decision makers and project members with data sharing ideas looking for an architecture, as well as medical informatics professionals and software developers tasked with building multi-centric data sharing applications, are the target audience for this tutorial.\"]},\"83\":{\"h\":\"What you need\",\"t\":[\"You need a laptop with a web browser for the hands-on portion of the tutorial.\"]},\"84\":{\"h\":\"What you will learn\",\"t\":[\"You will...\",\"… gain knowledge on various distributed processes specific to bio-medical research.\",\"… understand the unique challenges and considerations from the German MII resulting in the design and architecture of the DSF.\",\"… be introduced to the key concepts of the DSF and the various contexts in which it can be applied.\",\"… learn how to evaluate if the DSF is appropriate for their particular project or application your planning.\",\"… understand the difficulties that can occur when implementing distributed processes, as well as strategies for addressing them.\"]},\"85\":{\"h\":\"Tutorials\",\"t\":[\"MIE 2023\",\"GMDS 2022 - DSF Process Plugin Tutorial v 0.9.x\"]},\"86\":{\"h\":\"Recorded talks\",\"t\":[\"Redirect to this webpage.\"]},\"87\":{\"h\":\"Feasibility\"},\"88\":{\"h\":\"Overview\",\"t\":[\"Funded by the German Federal Ministry of Research and Education, 25 sites have installed the DSF to execute the Feasibility process. To perform feasibility queries, a researcher can register and query data on the FDPG (Forschungsdaten Portal für Gesundheit - Research Data Portal) website. Basic data of hospitalizations of over 8 million patients with over 40 million diagnoses and much more such as laboratory values or drug prescriptions are available. After a successful query, the data is made available in standardized FHIR format. Further information can be found in the flyer.\"]},\"89\":{\"h\":\"The Feasibility Process\",\"t\":[\"Medical routine data holds great promise for advancing research, yet its integration into a research context poses significant challenges. To address this, Medical Data Integration Centers have been established, by the medical informatics initiative to consolidate data from primary information systems into a central repository. However, relying on data from only one organization is rarely sufficient to answer complex research questions, so merging data across institutional boundaries is necessary.\",\"To enable researchers to leverage this integrated data for specific research projects, there is a critical need for the ability to query cohort sizes across institutions. The feasibility process allows researchers to conduct automated and distributed feasibility queries, i.e., cohort size estimates. This process is executed according to the open standard BPMN 2.0, the underlying process data model is based on HL7 FHIR R4 resources.\"]},\"90\":{\"h\":\"Technical Information\",\"t\":[\"DSF Middleware Setup: The DSF middleware connects your site to the central platform. This allows it to receive feasibility query requests as well as reporting back any results of these queries.\",\"Feasibility Process: Core Feasibility Process\",\"Feasibility Triangle: The Feasibility Triangle part of this repository provides a site (data integration center) with all the necessary components to set up in order to allow feasibility queries from the central feasibility portal.\",\"Data Transfer\",\"Data extraction after successful feasibility query\"]},\"91\":{\"h\":\"Network University Medicine\",\"t\":[\"The Network University Medicine was established in April 2020 as part of the COVID-19 pandemic crisis management. The aim of the NUM is to better coordinate COVID-19 research at all 36 university hospitals in Germany.'\",\"As part of the CODEX | COVID-19 Data Exchange Platform project, a nationwide, uniform, privacy-compliant infrastructure for storing and providing COVID-19 research datasets was established. Since 2022, the work continues within the project NUM RDP. All 36 university hospitals have installed the DSF to share Covid-19 research data.\"]},\"92\":{\"h\":\"The Data Transfer Process\",\"t\":[\"The Data Transfer Process is used in NUM CODEX to send data from a Data Integration Center (DIC), via the Gecco Transfer Hub (GTH), to the Central Research Repository (CRR). The infrastructure and communincation messages on which the process is based can be seen in the following figure. All organizations use the Data Sharing Framework (DSF) for deployment and execution of the process.\",\"More technical information can be found on GitHub.\"]},\"93\":{\"h\":\"Use-Cases\"},\"94\":{\"h\":\"Overview\",\"t\":[\"Feasibility\",\"Network University Medicine\"]},\"95\":{\"h\":\"Security\",\"t\":[\"We take security of the DSF, its process plugins, services and tools we operate very seriously.\",\"We describe the security mechanisms used by the DSF to implement secure communication on the pages Architecture, Security and Allow List.\",\"To ensure a high level of security, you should always install the latest DSF version and use the latest versions of the process plugins. Use the instructions to install the latest version of the DSF or to upgrade on the latest version. The instructions described there implement the security configuration recommended by us.\",\"It is also important that you ensure a secure operating environment in which you verify firewall configurations, keep the operating systems on which the DSF is running up to date and harden it according to the latest state of the art.\"]},\"96\":{\"h\":\"Security vulnerability disclosure policy\"},\"97\":{\"h\":\"Our commitment to security\",\"t\":[\"We as the DSF development team take security of our software, services and data very seriously. We understand that despite our best efforts, vulnerabilities can exist. To address this, we encourage responsible reporting of any security vulnerabilities discovered in our software and systems.\"]},\"98\":{\"h\":\"Responsible disclosure\",\"t\":[\"We kindly ask security researchers and the general public to follow the principles of Coordinated Vulnerability Disclosure (CVD) or Responsible Disclosure when reporting vulnerabilities to us. This approach helps us to mitigate potential risks and protect our users' data effectively.\"]},\"99\":{\"h\":\"How to Report a Vulnerability\",\"t\":[\"If you believe you have found a security vulnerability in our system, please email us at dsf-security@hs-heilbronn.de. If you want to use end-to-end-encryption, you can send us mails using s-mime with the certificate chain provided here. We kindly request the following:\",\"Provide a detailed description of the vulnerability, including if possible the potential impact and how it can be exploited.\",\"Include steps to reproduce the vulnerability or proof-of-concept code, if possible.\",\"Avoid accessing or modifying user data without permission, and do not exploit a security issue for any reason other than testing.\",\"Maintain confidentiality and do not publicly disclose the vulnerability, until we have had the opportunity to investigate and address it.\",\"Please do not file an issue on a security-related topic and use the e-mail address provided. You can verify the address both in the application repository and at the homepage (this page).\"]},\"100\":{\"h\":\"Our promise\",\"t\":[\"Acknowledgement: We usually will acknowledge receipt of your vulnerability report within 48 hours.\",\"Investigation: Our security team will investigate the issue and work diligently to verify and reproduce the vulnerability.\",\"Communication: We will keep you informed of our progress as we work to resolve the issue.\",\"Resolution: We will strive to resolve security issues in a timely manner and release updates, patches, or remediations as needed.\",\"Recognition: We value your effort in making our systems more secure and will recognize your contribution, if desired, once the vulnerability is resolved.\"]},\"101\":{\"h\":\"Legal Protection\",\"t\":[\"We promise not to initiate legal action against individuals who report vulnerabilities responsibly in accordance with this policy. This includes not suing for accidental access to data or reporting in good faith.\"]},\"102\":{\"h\":\"Questions?\",\"t\":[\"If you have any questions about this policy or security of the Data Sharing Framework, the services and tools we provide, please contact us at dsf-security@hs-heilbronn.de. You can send us encrypted e-mails using s-mime. You can find the certificate chain here.\"]},\"103\":{\"h\":\"Sprechstunde\",\"t\":[\"Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+\",\"Montags, 13:00-14:00 Uhr\",\"Ort: https://dsf.dev/sprechstunde\",\"Klicken Sie hier, um der Sprechstunde beizutreten.\"]},\"104\":{\"h\":\"\",\"t\":[\"Use-Cases\"]},\"105\":{\"h\":\"DSF 1.0.0\",\"t\":[\"Data Sharing Framework 1.0.0 is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Install DSF 1.0.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"106\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow user authenitication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features\"]},\"107\":{\"h\":\"DSF 1.1.0\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.x.\",\"Install DSF 1.1.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"108\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"109\":{\"h\":\"DSF 1.2.0\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.x.\",\"Install DSF 1.2.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"110\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"111\":{\"h\":\"DSF 1.3.0\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.x.\",\"Install DSF 1.3.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"112\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"113\":{\"h\":\"DSF 1.3.1\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.3.0\",\"Install DSF 1.3.1\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"114\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"115\":{\"h\":\"DSF 1.3.2\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.3.0\",\"Install DSF 1.3.2\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"116\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"117\":{\"h\":\"DSF 1.5.0\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.4.0\",\"Install DSF 1.5.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"118\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"119\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"120\":{\"h\":\"Develop Process Plugins\"},\"121\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"122\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"123\":{\"h\":\"DSF 1.4.0\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.3.2\",\"Install DSF 1.4.0\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"124\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"125\":{\"h\":\"Allow List Management\",\"t\":[\"Caution\",\"This is an outdated version of the Allow List Management documentation. Please use the current version, even if you use an outdated DSF version.\",\"You can read all about the concept of Allow Lists here.\"]},\"126\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow here. Currently, the Allow List Management Tool is only for DSF TEST infrastructure. For production, please write us an E-Mail with your information.\"]},\"127\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test infrastructure) 1.1 If none exists yet, read here\",\"Certificate 2.1 If none exists yet, read here\",\"Organization identifier (FQDN of your organization, e.g. hs-heilbronn.de)\",\"FHIR Endpoint URL (e.g. https://gth.gecko.hs-heilbronn.de/fhir )\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"128\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the DSF Allow List Management Tool. At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"129\":{\"h\":\"Install DSF 1.0.0\",\"t\":[\"Member of existing networks\",\"If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently DSF 0.9.x.\",\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"130\":{\"h\":\"Prerequisites\"},\"131\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"132\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"133\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"134\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"135\":{\"h\":\"Setup\"},\"136\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"137\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo addgroup --gid 2101 fhir sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_0_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_0_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L44: - app_client_certificate_private_key.pem.password ... L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L149: app_client_certificate_private_key.pem.password: L150: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: TODO_ORGANIZATION_IDENTIFIER Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: TODO_CLIENT_CERTIFICATE_THUMBPRINT Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: You can add other client certificates (e.g. personal DFN PKI S/MIME certificates, e.g. from admins) to your DSF instance. Set the SHA-512 Hash (lowercase hex) of your additional client certificates. The parameter TODO_WEBUSER_CLIENT_CERTIFICATE_THUMBPRINT can be a single thumbprint or can be expanded to a list (like dsf-role). If you don't have additional thumbprints you want to add, simply remove the DEV_DSF_FHIR_SERVER_ROLECONFIG variable from your docker-compose file.\",\"For additional environment variables, see DSF configuration parameters - FHIR Server\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"138\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo addgroup --gid 2202 bpe sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_0_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_0_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L18: - app_client_certificate_private_key.pem.password ... L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: TODO_ORGANIZATION_IDENTIFIER Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://TODO_DSF_FHIR_SERVER_FQDN/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see DSF configuration parameters - BPE Server\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"139\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"140\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"141\":{\"h\":\"Maintain a DSF instance\"},\"142\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.0.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"Configuration Paramters\"]},\"143\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"Do not upgrade unless prompted!\",\"Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).\",\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:\",\"shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"install the new DSF according to the instructions.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\"]},\"144\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"145\":{\"h\":\"Develop Process Plugins\"},\"146\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"147\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"148\":{\"h\":\"Allow List Management\",\"t\":[\"Caution\",\"This is an outdated version of the Allow List Management documentation. Please use the current version, even if you use an outdated DSF version.\",\"You can read all about the concept of Allow Lists here.\"]},\"149\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow here. Currently, the Allow List Management Tool is only for DSF TEST infrastructure. For production, please write us an E-Mail with your information.\"]},\"150\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test infrastructure) 1.1 If none exists yet, read here\",\"Certificate 2.1 If none exists yet, read here\",\"Organization identifier (FQDN of your organization website, e.g. hs-heilbronn.de)\",\"FHIR Endpoint URL (e.g. https://gth.gecko.hs-heilbronn.de/fhir )\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"151\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the DSF Allow List Management Tool. At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"152\":{\"h\":\"Install DSF 1.1.0\",\"t\":[\"Member of existing networks\",\"If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently DSF 0.9.x.\",\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"153\":{\"h\":\"Prerequisites\"},\"154\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"155\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"156\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"157\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"158\":{\"h\":\"Setup\"},\"159\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"160\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo addgroup --gid 2101 fhir sudo adduser --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_1_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_1_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L44: - app_client_certificate_private_key.pem.password ... L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L146: app_client_certificate_private_key.pem.password: L147: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"161\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo addgroup --gid 2202 bpe sudo adduser --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_1_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_1_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L18: - app_client_certificate_private_key.pem.password ... L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L97: app_client_certificate_private_key.pem.password: L98: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"162\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"163\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"164\":{\"h\":\"Maintain a DSF instance\"},\"165\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.1.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"166\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"Do not upgrade unless prompted!\",\"Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).\",\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:\",\"shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"install the new DSF according to the instructions.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\"]},\"167\":{\"h\":\"Upgrade from DSF 1.x\",\"t\":[\"Upgrading the DSF from 1.0.0 to 1.1.0 involves modifying the docker-compose.yml files and recreating the containers.\",\"Upgrade from 0.9.x\",\"If you want to migrate from DSF 0.9.x, please follow these instructions.\"]},\"168\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.1.0_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.1.0\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.0.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.1.0 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.0.0 + image: ghcr.io/datasharingframework/fhir:1.1.0 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"169\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.1.0_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.1.0\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.0.0 + image: ghcr.io/datasharingframework/bpe:1.1.0 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.1.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.1.0, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.1.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.1.0, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"170\":{\"h\":\"DSF 1.5.1\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.5.0\",\"Install DSF 1.5.1\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"171\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"172\":{\"h\":\"Allow List Management\",\"t\":[\"Caution\",\"This is an outdated version of the Allow List Management documentation. Please use the current version, even if you use an outdated DSF version.\",\"You can read all about the concept of Allow Lists here.\"]},\"173\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow here. Currently, the Allow List Management Tool is only for DSF TEST infrastructure. For production, please write us an E-Mail with your information.\"]},\"174\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test infrastructure) 1.1 If none exists yet, read here\",\"Certificate 2.1 If none exists yet, read here\",\"Organization identifier (FQDN of your organization website, e.g. hs-heilbronn.de)\",\"FHIR Endpoint URL (e.g. https://gth.gecko.hs-heilbronn.de/fhir )\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"175\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists on the DSF Allow List Management Tool. At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"176\":{\"h\":\"Install DSF 1.2.0\",\"t\":[\"Member of existing networks\",\"If you are part of an existing network (e.g. the German MII), please install the appropriate DSF version. For the production environment of MII and NUM this is currently DSF 0.9.x.\",\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"177\":{\"h\":\"Prerequisites\"},\"178\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"179\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"180\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"181\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"182\":{\"h\":\"Setup\"},\"183\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"184\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_2_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_2_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L44: - app_client_certificate_private_key.pem.password ... L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L146: app_client_certificate_private_key.pem.password: L147: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"185\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_2_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_2_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L18: - app_client_certificate_private_key.pem.password ... L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L97: app_client_certificate_private_key.pem.password: L98: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"186\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"187\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"188\":{\"h\":\"Maintain a DSF instance\"},\"189\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.2.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"190\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"Do not upgrade unless prompted!\",\"Please do not upgrade your DSF installation from DSF 0.9.x to DSF 1.x unless prompted to do so (e.g. from the German MII).\",\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. Instead, please perform the following steps:\",\"shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"install the new DSF according to the instructions.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\"]},\"191\":{\"h\":\"Upgrade from DSF 1.1.0\",\"t\":[\"Upgrading the DSF from 1.1.0 to 1.2.0 involves modifying the docker-compose.yml files and recreating the containers.\",\"Upgrade from 0.9.x\",\"If you want to migrate from DSF 0.9.x, please follow these instructions.\"]},\"192\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.2.0_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.2.0 and remove the old healthcheck definition. The new healthcheck is defined as part of the docker image.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.1.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.2.0 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.1.0 + image: ghcr.io/datasharingframework/fhir:1.2.0 restart: on-failure - healthcheck: - test: [\\\"CMD\\\", \\\"java\\\", \\\"-cp\\\", \\\"dsf_fhir.jar\\\", \\\"dev.dsf.common.status.client.StatusClient\\\"] - interval: 10s - timeout: 15s - retries: 5 ...\",\"The role configuration is now optional. If you don't use roles, you can remove the role config (default for new installations):\",\" app: ... environment: ... - # TODO specify role configuration to allow access to the UI via web-browser or REST API for specific users, see documentation at dsf.dev - DEV_DSF_FHIR_SERVER_ROLECONFIG: |\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"193\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.2.0_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.2.0 and remove the old healthcheck definition. The new healthcheck is defined as part of the docker image.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.1.0 + image: ghcr.io/datasharingframework/bpe:1.2.0 restart: on-failure - healthcheck: - test: [\\\"CMD\\\", \\\"java\\\", \\\"-cp\\\", \\\"dsf_bpe.jar\\\", \\\"dev.dsf.common.status.client.StatusClient\\\"] - interval: 10s - timeout: 15s - retries: 5 ...\",\"DSF v1.2.0 is not compatible with the Ping/Pong process plugin v1.0.0.0, upgrade to the Ping/Pong plugin v1.0.1.0 by removing the old jar file and replacing it with the new v1.0.1.0 one.\",\"We have released a new version of the Allow List Process plugin where we added support for delete operations. Please upgrade to the Allow-List process v1.0.0.1 by removing the old jar file and replacing it with the new v1.0.0.1 one.\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.2.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.2.0, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.2.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.2.0, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"194\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"195\":{\"h\":\"Develop Process Plugins\"},\"196\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"197\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"198\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"199\":{\"h\":\"Develop Process Plugins\"},\"200\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"201\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"202\":{\"h\":\"DSF 1.5.2\",\"t\":[\"Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click here to find more information about the DSF in general.\",\"Important note\",\"This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf.\",\"Upgrade from DSF 0.9.x.\",\"Upgrade from DSF 1.5.1\",\"Install DSF 1.5.2\",\"Create a new process plugin\",\"Upgrade from DSF 0.9.x.\"]},\"203\":{\"h\":\"New features\",\"t\":[\"Improved versioning to support up- and downwards-compatibility\",\"Enhanced web ui to start processes in the web browser\",\"Allow local user authentication and authorization with OpenID Connect\",\"New process plugin API\",\"Removed mostly unused features to simplify instance configuration\",\"Unified proxy setup\",\"Many more features, see 1.x release-notes\"]},\"204\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"205\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use your personal client certificate or the client certificate from your DSF BPE, which needs to be added to your webbrowser. For instructions on how to add a client certificate to your browser, please follow here.\"]},\"206\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier (FQDN of your organization website, e.g. hs-heilbronn.de)\",\"FHIR Endpoint URL (e.g. https://gth.gecko.hs-heilbronn.de/fhir )\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"207\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists respective Allow List Management Tool.\",\"Click here to open the DSF Allow List Management Tool for the Test infrastructure.\",\"Click here to open the DSF Allow List Management Tool for the Production infrastructure.\",\"We use different colors for the DSF Allow List Management Tools in the Test (green) and Production (blue) infastructure.\",\"At the beginning, a popup will appear where you have to select your certificate. Only then you will have access to the website.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"208\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatable process plugins below.\"]},\"209\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"210\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\"]},\"211\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"212\":{\"h\":\"Install DSF 1.3.0\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"213\":{\"h\":\"Prerequisites\"},\"214\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"215\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"216\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"217\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"218\":{\"h\":\"Setup\"},\"219\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"220\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_3_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_3_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L44: - app_client_certificate_private_key.pem.password ... L59: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L146: app_client_certificate_private_key.pem.password: L147: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"221\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_3_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_3_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L18: - app_client_certificate_private_key.pem.password ... L40: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L97: app_client_certificate_private_key.pem.password: L98: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"222\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"223\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"224\":{\"h\":\"Maintain a DSF instance\"},\"225\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.3.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"226\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"227\":{\"h\":\"Upgrade from DSF 1.2.0\",\"t\":[\"Upgrading the DSF from 1.2.0 to 1.3.0 involves modifying the docker-compose.yml files and recreating the containers.\",\"Upgrade from 0.9.x\",\"If you want to migrate from DSF 0.9.x, please follow these instructions.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"228\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.0_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.0.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.2.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.3.0 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.2.0 + image: ghcr.io/datasharingframework/fhir:1.3.0 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"229\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.0_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.0.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.2.0 + image: ghcr.io/datasharingframework/bpe:1.3.0 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.3.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.0, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.3.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.0, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"230\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"231\":{\"h\":\"Develop Process Plugins\"},\"232\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"233\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"234\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"235\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"236\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"237\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"238\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatable process plugins below.\"]},\"239\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"240\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\"]},\"241\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"242\":{\"h\":\"Install DSF 1.3.1\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"243\":{\"h\":\"Prerequisites\"},\"244\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"245\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"246\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"247\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"248\":{\"h\":\"Setup\"},\"249\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"250\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_3_1.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_3_1.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"251\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_3_1.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_3_1.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"252\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"253\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"254\":{\"h\":\"Maintain a DSF instance\"},\"255\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.3.1\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"256\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"257\":{\"h\":\"Upgrade from DSF 1.3.0\",\"t\":[\"Upgrading the DSF from 1.3.0 to 1.3.1 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"258\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.1_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.1.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.3.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.3.1 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.3.0 + image: ghcr.io/datasharingframework/fhir:1.3.1 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"259\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.1_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.1.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.3.0 + image: ghcr.io/datasharingframework/bpe:1.3.1 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.3.1. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.1, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.3.1. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.1, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"260\":{\"h\":\"Create a new process plugin\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"261\":{\"h\":\"Develop Process Plugins\"},\"262\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"263\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"264\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"265\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"266\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"267\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"268\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatable process plugins below.\"]},\"269\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"270\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/feasibility-dsf-process/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\",\"MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases\"]},\"271\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"272\":{\"h\":\"Install DSF 1.3.2\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"273\":{\"h\":\"Prerequisites\"},\"274\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"275\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"276\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"277\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"278\":{\"h\":\"Setup\"},\"279\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"280\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_3_2.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_3_2.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"281\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_3_2.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_3_2.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"282\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"283\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"284\":{\"h\":\"Maintain a DSF instance\"},\"285\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.3.1\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"286\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"287\":{\"h\":\"Upgrade from DSF 1.3.1\",\"t\":[\"Upgrading the DSF from 1.3.1 to 1.3.2 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"288\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.3.2_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.3.2.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.3.1 + image: ghcr.io/datasharingframework/fhir_proxy:1.3.2 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.3.1 + image: ghcr.io/datasharingframework/fhir:1.3.2 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"289\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.3.2_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.3.2.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.3.1 + image: ghcr.io/datasharingframework/bpe:1.3.2 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.3.2. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.3.2, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.3.2. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.3.2, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"290\":{\"h\":\"Contribute code\",\"t\":[\"Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.\"]},\"291\":{\"h\":\"Benefits of Contributing:\",\"t\":[\"Foster community growth and diversification.\",\"Sharpen your coding skills.\",\"Gain recognition in the DSF community.\",\"Directly impact the future of data sharing in medicine.\",\"Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.\"]},\"292\":{\"h\":\"General\"},\"293\":{\"h\":\"Code style\",\"t\":[\"You can import our code style for your specific IDE:\",\"Eclipse. Open your preferences, click on Java, Code style, Formatter, Import and select the downloaded file.\",\"IntelliJ. Open your settings, click on Editor, Code style, Java, the settings icon, import scheme, IntelliJ and select the downloaded file.\",\"Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use mvn compile -Pformat-and-sort.\"]},\"294\":{\"h\":\"Branching strategy\",\"t\":[\"Git Flow is used as this project's branching strategy. Therefore, you will find the following structure:\",\"main\",\"develop\",\"issue\",\"hotfix\",\"release\",\"Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.\"]},\"295\":{\"h\":\"Branch naming\",\"t\":[\"The following ruleset is applied to name branches:\",\"issue/<issue-number>_<issue-name>\",\"hotfix/<version>\",\"release/<version>\"]},\"296\":{\"h\":\"Setting up the project\",\"t\":[\"This chapter lists all important requirements to get the project buildable and running properly.\"]},\"297\":{\"h\":\"Java\",\"t\":[\"This project uses Java JDK 17, so make sure you have it installed on your system.\"]},\"298\":{\"h\":\"Docker\",\"t\":[\"Docker is used in this project to test database functionality and to run more complex test-setups.\"]},\"299\":{\"h\":\"Maven\",\"t\":[\"The project relies on Maven as its management tool.Important: When building the project you might encounter the following error:Could not determine gpg versionGPG is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with -Dgpg.skip.\"]},\"300\":{\"h\":\"Workflow\",\"t\":[\"Create an issue or comment on an issue that you want to contribute some feature\",\"Fork the repository, create a branch and mention it in the issue\",\"If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests\",\"If your changes are production-ready, create a pull request.\"]},\"301\":{\"h\":\"Pull request process\",\"t\":[\"We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:\",\"Ship: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.\",\"Show: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.\",\"Ask: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.\",\"This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.\",\"For more information on Fowler's approach, visit Martin Fowler's article on Pull Requests.\"]},\"302\":{\"h\":\"Data Security in DSF Development\",\"t\":[\"The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:\",\"No development with real personal data: Always use anonymized or synthetic data for development purposes.\",\"No personal data in repositories: Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.\",\"Review all log files: Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.\"]},\"303\":{\"h\":\"Contribute documentation\",\"t\":[\"Join us in enhancing our documentation!\",\"We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!\",\"Contact us with feedback: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.\",\"Create an issue: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at Data Sharing Framework Documentation and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.\",\"Contribute directly with a pull request: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at Data Sharing Framework Documentation and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.\",\"We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!\"]},\"304\":{\"h\":\"Contribute\",\"t\":[\"We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.\"]},\"305\":{\"h\":\"\",\"t\":[\"Helping other users: \",\"MII Zulip: If you are part of the German Medical Informatics Initiative, join the MII Zulip community to assist others, share your knowledge, and learn from fellow contributors.\",\"GitHub Discussions: Engage with our community in GitHub Discussions by answering questions, providing feedback, and sharing your insights.\",\"Testing releases: \",\"Stay ahead: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.\",\"Report findings: Share your testing results to help us refine and enhance our releases.\",\"Reviewing changes: \",\"Peer review: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.\",\"Constructive feedback: Offer constructive feedback and suggestions to help improve and refine proposed changes.\",\"Documentation changes: \",\"Improve documentation: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our Getting started guide for documentation contributions to DSF.\",\"Suggest improvements: If you notice gaps or areas for enhancement in our documentation, we welcome your suggestions and contributions.\",\"Contributing bug reports: \",\"Report bugs: If you find a bug, please report it via an issue on GitHub. Detailed bug reports are incredibly helpful.\",\"Reproduction steps: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.\",\"Contributing feature requests: \",\"Suggest features: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.\",\"Collaborate on implementation: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our Getting started guide for code contributions to DSF.\",\"Contributing process plugins: \",\"Develop process plugins for the DSF: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our Getting started guide for process plugin development will be a useful reference.\",\"Share your work: Your plugins could be a valuable addition to the ecosystem and benefit other users.\",\"Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.\",\"Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!\"]},\"306\":{\"h\":\"Create a new process plugin\",\"t\":[\"Visit the how the DSF can help you page to get started.\",\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"307\":{\"h\":\"Develop Process Plugins\"},\"308\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"309\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"310\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"311\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"312\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"313\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"314\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatable process plugins below.\"]},\"315\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"316\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/mii-process-feasibility/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\",\"MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases\"]},\"317\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"318\":{\"h\":\"Install DSF 1.5.0\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"319\":{\"h\":\"Prerequisites\"},\"320\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"321\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"322\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"323\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"324\":{\"h\":\"Setup\"},\"325\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"326\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_5_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_5_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"327\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_5_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_5_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"328\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"329\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"330\":{\"h\":\"Maintain a DSF instance\"},\"331\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.5.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Reverse Proxy \",\"Configuration Parameters\",\"BPE Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"332\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"333\":{\"h\":\"Upgrade from DSF 1.4.0\",\"t\":[\"Upgrading the DSF from 1.4.0 to 1.5.0 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"334\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.0_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.0.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.4.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.5.0 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.4.0 + image: ghcr.io/datasharingframework/fhir:1.5.0 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"335\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.0_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.0.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.4.0 + image: ghcr.io/datasharingframework/bpe:1.5.0 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.5.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.0, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.5.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.0, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"336\":{\"h\":\"Create a new process plugin\",\"t\":[\"Visit the how the DSF can help you page to get started.\",\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"337\":{\"h\":\"Develop Process Plugins\"},\"338\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"339\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"340\":{\"h\":\"Contribute code\",\"t\":[\"Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.\"]},\"341\":{\"h\":\"Benefits of Contributing:\",\"t\":[\"Foster community growth and diversification.\",\"Sharpen your coding skills.\",\"Gain recognition in the DSF community.\",\"Directly impact the future of data sharing in medicine.\",\"Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.\"]},\"342\":{\"h\":\"General\"},\"343\":{\"h\":\"Code style\",\"t\":[\"You can import our code style for your specific IDE:\",\"Eclipse. Open your preferences, click on Java, Code style, Formatter, Import and select the downloaded file.\",\"IntelliJ. Open your settings, click on Editor, Code style, Java, the settings icon, import scheme, IntelliJ and select the downloaded file.\",\"Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use mvn compile -Pformat-and-sort.\"]},\"344\":{\"h\":\"Branching strategy\",\"t\":[\"Git Flow is used as this project's branching strategy. Therefore, you will find the following structure:\",\"main\",\"develop\",\"issue\",\"hotfix\",\"release\",\"Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.\"]},\"345\":{\"h\":\"Branch naming\",\"t\":[\"The following ruleset is applied to name branches:\",\"issue/<issue-number>_<issue-name>\",\"hotfix/<version>\",\"release/<version>\"]},\"346\":{\"h\":\"Setting up the project\",\"t\":[\"This chapter lists all important requirements to get the project buildable and running properly.\"]},\"347\":{\"h\":\"Java\",\"t\":[\"This project uses Java JDK 17, so make sure you have it installed on your system.\"]},\"348\":{\"h\":\"Docker\",\"t\":[\"Docker is used in this project to test database functionality and to run more complex test-setups.\"]},\"349\":{\"h\":\"Maven\",\"t\":[\"The project relies on Maven as its management tool.Important: When building the project you might encounter the following error:Could not determine gpg versionGPG is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with -Dgpg.skip.\"]},\"350\":{\"h\":\"Workflow\",\"t\":[\"Create an issue or comment on an issue that you want to contribute some feature\",\"Fork the repository, create a branch and mention it in the issue\",\"If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests\",\"If your changes are production-ready, create a pull request.\"]},\"351\":{\"h\":\"Pull request process\",\"t\":[\"We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:\",\"Ship: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.\",\"Show: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.\",\"Ask: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.\",\"This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.\",\"For more information on Fowler's approach, visit Martin Fowler's article on Pull Requests.\"]},\"352\":{\"h\":\"Data Security in DSF Development\",\"t\":[\"The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:\",\"No development with real personal data: Always use anonymized or synthetic data for development purposes.\",\"No personal data in repositories: Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.\",\"Review all log files: Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.\"]},\"353\":{\"h\":\"Contribute documentation\",\"t\":[\"Join us in enhancing our documentation!\",\"We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!\",\"Contact us with feedback: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.\",\"Create an issue: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at Data Sharing Framework Documentation and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.\",\"Contribute directly with a pull request: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at Data Sharing Framework Documentation and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.\",\"We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!\"]},\"354\":{\"h\":\"Contribute\",\"t\":[\"We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.\"]},\"355\":{\"h\":\"\",\"t\":[\"Helping other users: \",\"MII Zulip: If you are part of the German Medical Informatics Initiative, join the MII Zulip community to assist others, share your knowledge, and learn from fellow contributors.\",\"GitHub Discussions: Engage with our community in GitHub Discussions by answering questions, providing feedback, and sharing your insights.\",\"Testing releases: \",\"Stay ahead: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.\",\"Report findings: Share your testing results to help us refine and enhance our releases.\",\"Reviewing changes: \",\"Peer review: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.\",\"Constructive feedback: Offer constructive feedback and suggestions to help improve and refine proposed changes.\",\"Documentation changes: \",\"Improve documentation: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our Getting started guide for documentation contributions to DSF.\",\"Suggest improvements: If you notice gaps or areas for enhancement in our documentation, we welcome your suggestions and contributions.\",\"Contributing bug reports: \",\"Report bugs: If you find a bug, please report it via an issue on GitHub. Detailed bug reports are incredibly helpful.\",\"Reproduction steps: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.\",\"Contributing feature requests: \",\"Suggest features: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.\",\"Collaborate on implementation: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our Getting started guide for code contributions to DSF.\",\"Contributing process plugins: \",\"Develop process plugins for the DSF: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our Getting started guide for process plugin development will be a useful reference.\",\"Share your work: Your plugins could be a valuable addition to the ecosystem and benefit other users.\",\"Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.\",\"Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!\"]},\"356\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"357\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"358\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"359\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"360\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatable process plugins below.\"]},\"361\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"362\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/mii-process-feasibility/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\",\"MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases\"]},\"363\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"364\":{\"h\":\"Install DSF 1.4.0\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"365\":{\"h\":\"Prerequisites\"},\"366\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"367\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"368\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"369\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"370\":{\"h\":\"Setup\"},\"371\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"372\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_4_0.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_4_0.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"373\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_4_0.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_4_0.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"374\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID1} INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket connected {uri: wss://FHIR_SERVER_FQDN/fhir/ws, session-id: SOME_RANDOM_UUID2}\"]},\"375\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"376\":{\"h\":\"Maintain a DSF instance\"},\"377\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.4.0\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Server \",\"Configuration Parameters\"]},\"378\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"379\":{\"h\":\"Upgrade from DSF 1.3.2\",\"t\":[\"Upgrading the DSF from 1.3.2 to 1.4.0 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"380\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.4.0_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.4.0.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.3.2 + image: ghcr.io/datasharingframework/fhir_proxy:1.4.0 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.3.2 + image: ghcr.io/datasharingframework/fhir:1.4.0 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"381\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.4.0_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.4.0.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.3.2 + image: ghcr.io/datasharingframework/bpe:1.4.0 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.4.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.4.0, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.4.0. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.4.0, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"382\":{\"h\":\"Parameters BPE Server\",\"t\":[\"Please also check common parameters for additional configuration options.\"]},\"383\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"384\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"385\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"386\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"387\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"388\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"389\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"390\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"391\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"392\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"393\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"394\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"395\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"396\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable loging bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"397\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"398\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"399\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"400\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"401\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"402\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"403\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"404\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"405\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"406\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"407\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"408\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"409\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"410\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"411\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"412\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"413\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"414\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"415\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"416\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"417\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"418\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"419\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"420\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"421\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"422\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"423\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"424\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"425\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"426\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"427\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"428\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"429\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"430\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"431\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"432\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\"]},\"433\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"434\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"435\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"436\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\"]},\"437\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"438\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"439\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"440\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"441\":{\"h\":\"Common Parameters\"},\"442\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"443\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"444\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"445\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"446\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"447\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"448\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"449\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"450\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"451\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"452\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"453\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"454\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"455\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"456\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"457\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"458\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"459\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"460\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"461\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"462\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"463\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"464\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"465\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"466\":{\"h\":\"Parameters FHIR Server\",\"t\":[\"Please also check common parameters for additional configuration options.\"]},\"467\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"468\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"469\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"470\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"471\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"472\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"473\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"474\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"475\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"476\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"477\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"478\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"479\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"480\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"481\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"482\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"483\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"484\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"485\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"486\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"487\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"488\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"489\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: Yes\",\"Description: Role config YAML\"]},\"490\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"491\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"492\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"493\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"494\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"495\":{\"h\":\"Configuration Parameters\"},\"496\":{\"h\":\"Overview\",\"t\":[\"Common Parameters\",\"Parameters FHIR Server\",\"Parameters BPE Server\",\"Parameters FHIR Reverse Proxy\"]},\"497\":{\"h\":\"Parameters FHIR Reverse Proxy\"},\"498\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"499\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"500\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"501\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"502\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"503\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"504\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"505\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"506\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"507\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"508\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"509\":{\"h\":\"Configuration Parameters\"},\"510\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"511\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"512\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"513\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"514\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"515\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"516\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"517\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"518\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"519\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"520\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"521\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"522\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"523\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"524\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"525\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"526\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"527\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"528\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"529\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"530\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"531\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"532\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"533\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"534\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"535\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"536\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"537\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"538\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"539\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"540\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"541\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"542\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"543\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"544\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"545\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"546\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"547\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable loging bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"548\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"549\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"550\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"551\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"552\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"553\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"554\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"555\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"556\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"557\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"558\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"559\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"560\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"561\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"562\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"563\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"564\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"565\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"566\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"567\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"568\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"569\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"570\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"571\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"572\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"573\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"574\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"575\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"576\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"577\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"578\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"579\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"580\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"581\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"582\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"583\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\"]},\"584\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"585\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"586\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"587\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\"]},\"588\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"589\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"590\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"591\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"592\":{\"h\":\"BPE Server\"},\"593\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"594\":{\"h\":\"Configuration Parameters\"},\"595\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"596\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"597\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"598\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"599\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"600\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"601\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"602\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"603\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"604\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"605\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"606\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient \",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"607\":{\"h\":\"FHIR Reverse Proxy\"},\"608\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"609\":{\"h\":\"Access Control\"},\"610\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"611\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"612\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"613\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"614\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"615\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"616\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"617\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"618\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"619\":{\"h\":\"Configuration Parameters\"},\"620\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"621\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"622\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"623\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"624\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"625\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"626\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"627\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"628\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"629\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"630\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"631\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"632\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"633\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"634\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"635\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"636\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"637\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"638\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"639\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"640\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"641\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"642\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"643\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: Yes\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\",\"Recommendation: Use an empty string \\\"\\\" or a single block scalar | character if no roles should be configured\"]},\"644\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"645\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"646\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"647\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"648\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"649\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"650\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"651\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"652\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"653\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"654\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"655\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"656\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"657\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"658\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"659\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"660\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"661\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"662\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"663\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"664\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"665\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"666\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"667\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"668\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"669\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"670\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"671\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"672\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"673\":{\"h\":\"OpenID Connect\"},\"674\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"675\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"676\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"677\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"678\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.1.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"679\":{\"h\":\"FHIR Server\"},\"680\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"681\":{\"h\":\"Contribute code\",\"t\":[\"Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.\"]},\"682\":{\"h\":\"Benefits of Contributing:\",\"t\":[\"Foster community growth and diversification.\",\"Sharpen your coding skills.\",\"Gain recognition in the DSF community.\",\"Directly impact the future of data sharing in medicine.\",\"Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.\"]},\"683\":{\"h\":\"General\"},\"684\":{\"h\":\"Code style\",\"t\":[\"You can import our code style for your specific IDE:\",\"Eclipse. Open your preferences, click on Java, Code style, Formatter, Import and select the downloaded file.\",\"IntelliJ. Open your settings, click on Editor, Code style, Java, the settings icon, import scheme, IntelliJ and select the downloaded file.\",\"Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use mvn compile -Pformat-and-sort.\"]},\"685\":{\"h\":\"Branching strategy\",\"t\":[\"Git Flow is used as this project's branching strategy. Therefore, you will find the following structure:\",\"main\",\"develop\",\"issue\",\"hotfix\",\"release\",\"Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.\"]},\"686\":{\"h\":\"Branch naming\",\"t\":[\"The following ruleset is applied to name branches:\",\"issue/<issue-number>_<issue-name>\",\"hotfix/<version>\",\"release/<version>\"]},\"687\":{\"h\":\"Setting up the project\",\"t\":[\"This chapter lists all important requirements to get the project buildable and running properly.\"]},\"688\":{\"h\":\"Java\",\"t\":[\"This project uses Java JDK 17, so make sure you have it installed on your system.\"]},\"689\":{\"h\":\"Docker\",\"t\":[\"Docker is used in this project to test database functionality and to run more complex test-setups.\"]},\"690\":{\"h\":\"Maven\",\"t\":[\"The project relies on Maven as its management tool.Important: When building the project you might encounter the following error:Could not determine gpg versionGPG is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with -Dgpg.skip.\"]},\"691\":{\"h\":\"Workflow\",\"t\":[\"Create an issue or comment on an issue that you want to contribute some feature\",\"Fork the repository, create a branch and mention it in the issue\",\"If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests\",\"If your changes are production-ready, create a pull request.\"]},\"692\":{\"h\":\"Pull request process\",\"t\":[\"We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:\",\"Ship: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.\",\"Show: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.\",\"Ask: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.\",\"This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.\",\"For more information on Fowler's approach, visit Martin Fowler's article on Pull Requests.\"]},\"693\":{\"h\":\"Data Security in DSF Development\",\"t\":[\"The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:\",\"No development with real personal data: Always use anonymized or synthetic data for development purposes.\",\"No personal data in repositories: Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.\",\"Review all log files: Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.\"]},\"694\":{\"h\":\"Contribute documentation\",\"t\":[\"Join us in enhancing our documentation!\",\"We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!\",\"Contact us with feedback: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.\",\"Create an issue: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at Data Sharing Framework Documentation and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.\",\"Contribute directly with a pull request: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at Data Sharing Framework Documentation and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.\",\"We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!\"]},\"695\":{\"h\":\"Contribute\",\"t\":[\"We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.\"]},\"696\":{\"h\":\"\",\"t\":[\"Helping other users: \",\"MII Zulip: If you are part of the German Medical Informatics Initiative, join the MII Zulip community to assist others, share your knowledge, and learn from fellow contributors.\",\"GitHub Discussions: Engage with our community in GitHub Discussions by answering questions, providing feedback, and sharing your insights.\",\"Testing releases: \",\"Stay ahead: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.\",\"Report findings: Share your testing results to help us refine and enhance our releases.\",\"Reviewing changes: \",\"Peer review: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.\",\"Constructive feedback: Offer constructive feedback and suggestions to help improve and refine proposed changes.\",\"Documentation changes: \",\"Improve documentation: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our Getting started guide for documentation contributions to DSF.\",\"Suggest improvements: If you notice gaps or areas for enhancement in our documentation, we welcome your suggestions and contributions.\",\"Contributing bug reports: \",\"Report bugs: If you find a bug, please report it via an issue on GitHub. Detailed bug reports are incredibly helpful.\",\"Reproduction steps: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.\",\"Contributing feature requests: \",\"Suggest features: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.\",\"Collaborate on implementation: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our Getting started guide for code contributions to DSF.\",\"Contributing process plugins: \",\"Develop process plugins for the DSF: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our Getting started guide for process plugin development will be a useful reference.\",\"Share your work: Your plugins could be a valuable addition to the ecosystem and benefit other users.\",\"Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.\",\"Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!\"]},\"697\":{\"h\":\"Create a new process plugin\",\"t\":[\"Visit the how the DSF can help you page to get started.\",\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"698\":{\"h\":\"Develop Process Plugins\"},\"699\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"700\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"701\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"702\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"703\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"704\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"705\":{\"h\":\"Install Plugins\",\"t\":[\"You can find an overview of compatible process plugins below.\"]},\"706\":{\"h\":\"Common processes\",\"t\":[\"Ping-Pong: https://github.com/datasharingframework/dsf-process-ping-pong/releases\",\"AllowList Download: https://github.com/datasharingframework/dsf-process-allow-list/releases\"]},\"707\":{\"h\":\"MII processes\",\"t\":[\"Feasibility: https://github.com/medizininformatik-initiative/mii-process-feasibility/releases\",\"KDS-Report: https://github.com/medizininformatik-initiative/mii-process-report/releases\",\"MII-Data-Sharing: https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases\",\"MII-Data-Transfer: https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases\"]},\"708\":{\"h\":\"NUM processes\",\"t\":[\"NUM-RDP: https://github.com/num-codex/codex-processes-ap1/releases\"]},\"709\":{\"h\":\"Install DSF 1.5.1\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"710\":{\"h\":\"Prerequisites\"},\"711\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"712\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"713\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"714\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"715\":{\"h\":\"Setup\"},\"716\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"717\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_5_1.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_5_1.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"718\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_5_1.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_5_1.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"719\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID1 INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID2\"]},\"720\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"721\":{\"h\":\"Maintain a DSF instance\"},\"722\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.5.1\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Reverse Proxy \",\"Configuration Parameters\",\"BPE Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"723\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"724\":{\"h\":\"Upgrade from DSF 1.5.0\",\"t\":[\"Upgrading the DSF from 1.5.0 to 1.5.1 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"725\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.1_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.1.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.5.0 + image: ghcr.io/datasharingframework/fhir_proxy:1.5.1 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.5.0 + image: ghcr.io/datasharingframework/fhir:1.5.1 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"726\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.1_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.1.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.5.0 + image: ghcr.io/datasharingframework/bpe:1.5.1 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.5.1. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.1, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.5.1. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.1, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"727\":{\"h\":\"Configuration Parameters\"},\"728\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"729\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"730\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"731\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"732\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"733\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"734\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"735\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"736\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"737\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"738\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"739\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"740\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"741\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"742\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"743\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"744\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"745\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"746\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"747\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"748\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"749\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"750\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"751\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"752\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"753\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"754\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"755\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"756\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"757\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"758\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"759\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"760\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"761\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"762\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"763\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"764\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"765\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"766\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"767\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"768\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"769\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"770\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"771\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"772\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"773\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"774\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"775\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"776\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"777\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"778\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"779\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"780\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"781\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"782\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"783\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"784\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"785\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"786\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"787\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"788\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"789\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"790\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"791\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"792\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"793\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"794\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"795\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"796\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"797\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"798\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"799\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"800\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"801\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"802\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"803\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"804\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"805\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"806\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"807\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"808\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"809\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"810\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"811\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"812\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"813\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"814\":{\"h\":\"BPE Server\"},\"815\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"816\":{\"h\":\"Access Control\"},\"817\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"818\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"819\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"820\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"821\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"822\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"823\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"824\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"825\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"826\":{\"h\":\"Configuration Parameters\"},\"827\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"828\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"829\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"830\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"831\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"832\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_server_trust_certificates.pem\"]},\"833\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"834\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"835\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"836\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"837\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"838\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"839\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"840\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"841\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"842\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"843\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"844\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"845\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"846\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"847\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"848\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"849\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"850\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"851\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"852\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"853\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"854\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"855\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"856\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"857\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"858\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"859\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"860\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"861\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"862\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"863\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"864\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"865\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"866\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"867\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"868\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"869\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"870\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"871\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"872\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"873\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"874\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"875\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"876\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"877\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"878\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"879\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"880\":{\"h\":\"OpenID Connect\"},\"881\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"882\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"883\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"884\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"885\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.2.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"886\":{\"h\":\"FHIR Server\"},\"887\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"888\":{\"h\":\"Contribute code\",\"t\":[\"Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community.\"]},\"889\":{\"h\":\"Benefits of Contributing:\",\"t\":[\"Foster community growth and diversification.\",\"Sharpen your coding skills.\",\"Gain recognition in the DSF community.\",\"Directly impact the future of data sharing in medicine.\",\"Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF.\"]},\"890\":{\"h\":\"General\"},\"891\":{\"h\":\"Code style\",\"t\":[\"You can import our code style for your specific IDE:\",\"Eclipse. Open your preferences, click on Java, Code style, Formatter, Import and select the downloaded file.\",\"IntelliJ. Open your settings, click on Editor, Code style, Java, the settings icon, import scheme, IntelliJ and select the downloaded file.\",\"Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use mvn compile -Pformat-and-sort.\"]},\"892\":{\"h\":\"Branching strategy\",\"t\":[\"Git Flow is used as this project's branching strategy. Therefore, you will find the following structure:\",\"main\",\"develop\",\"issue\",\"hotfix\",\"release\",\"Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category.\"]},\"893\":{\"h\":\"Branch naming\",\"t\":[\"The following ruleset is applied to name branches:\",\"issue/<issue-number>_<issue-name>\",\"hotfix/<version>\",\"release/<version>\"]},\"894\":{\"h\":\"Setting up the project\",\"t\":[\"This chapter lists all important requirements to get the project buildable and running properly.\"]},\"895\":{\"h\":\"Java\",\"t\":[\"This project uses Java JDK 17, so make sure you have it installed on your system.\"]},\"896\":{\"h\":\"Docker\",\"t\":[\"Docker is used in this project to test database functionality and to run more complex test-setups.\"]},\"897\":{\"h\":\"Maven\",\"t\":[\"The project relies on Maven as its management tool.Important: When building the project you might encounter the following error:Could not determine gpg versionGPG is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with -Dgpg.skip.\"]},\"898\":{\"h\":\"Workflow\",\"t\":[\"Create an issue or comment on an issue that you want to contribute some feature\",\"Fork the repository, create a branch and mention it in the issue\",\"If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests\",\"If your changes are production-ready, create a pull request.\"]},\"899\":{\"h\":\"Pull request process\",\"t\":[\"We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it:\",\"Ship: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes.\",\"Show: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team.\",\"Ask: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control.\",\"This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors.\",\"For more information on Fowler's approach, visit Martin Fowler's article on Pull Requests.\"]},\"900\":{\"h\":\"Data Security in DSF Development\",\"t\":[\"The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines:\",\"No development with real personal data: Always use anonymized or synthetic data for development purposes.\",\"No personal data in repositories: Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily.\",\"Review all log files: Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included.\"]},\"901\":{\"h\":\"Contribute documentation\",\"t\":[\"Join us in enhancing our documentation!\",\"We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input!\",\"Contact us with feedback: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement.\",\"Create an issue: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at Data Sharing Framework Documentation and please create an issue. This way, our team and other contributors can track and address documentation changes systematically.\",\"Contribute directly with a pull request: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at Data Sharing Framework Documentation and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts.\",\"We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together!\"]},\"902\":{\"h\":\"Contribute\",\"t\":[\"We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact.\"]},\"903\":{\"h\":\"\",\"t\":[\"Helping other users: \",\"MII Zulip: If you are part of the German Medical Informatics Initiative, join the MII Zulip community to assist others, share your knowledge, and learn from fellow contributors.\",\"GitHub Discussions: Engage with our community in GitHub Discussions by answering questions, providing feedback, and sharing your insights.\",\"Testing releases: \",\"Stay ahead: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable.\",\"Report findings: Share your testing results to help us refine and enhance our releases.\",\"Reviewing changes: \",\"Peer review: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes.\",\"Constructive feedback: Offer constructive feedback and suggestions to help improve and refine proposed changes.\",\"Documentation changes: \",\"Improve documentation: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our Getting started guide for documentation contributions to DSF.\",\"Suggest improvements: If you notice gaps or areas for enhancement in our documentation, we welcome your suggestions and contributions.\",\"Contributing bug reports: \",\"Report bugs: If you find a bug, please report it via an issue on GitHub. Detailed bug reports are incredibly helpful.\",\"Reproduction steps: Include steps to reproduce the bug and any relevant logs according to our bug report issue template.\",\"Contributing feature requests: \",\"Suggest features: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template.\",\"Collaborate on implementation: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our Getting started guide for code contributions to DSF.\",\"Contributing process plugins: \",\"Develop process plugins for the DSF: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our Getting started guide for process plugin development will be a useful reference.\",\"Share your work: Your plugins could be a valuable addition to the ecosystem and benefit other users.\",\"Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved.\",\"Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!\"]},\"904\":{\"h\":\"Create a new process plugin\",\"t\":[\"Visit the how the DSF can help you page to get started.\",\"Work in progress\",\"We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the process plugin tutorial. Additionally, we recommend to take a look at the upgraded DSF processes here:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"905\":{\"h\":\"Develop Process Plugins\"},\"906\":{\"h\":\"Overview\",\"t\":[\"Create a new process plugin\",\"Upgrade processes from 0.9.x\"]},\"907\":{\"h\":\"Upgrade processes from 0.9.x\",\"t\":[\"Work in progress\",\"We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins:\",\"The hello world plugin\",\"The ping pong plugin\",\"The update allowlist plugin\"]},\"908\":{\"h\":\"Configuration Parameters\"},\"909\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"910\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"911\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"912\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"913\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"914\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"915\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"916\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"917\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"918\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"919\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"920\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"921\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"922\":{\"h\":\"FHIR Reverse Proxy\"},\"923\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"924\":{\"h\":\"Allow List Management\",\"t\":[\"You can read all about the concept of Allow Lists in our introduction.\"]},\"925\":{\"h\":\"Overview\",\"t\":[\"To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes.\",\"The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store.\"]},\"926\":{\"h\":\"Prerequisites\",\"t\":[\"Deployed DSF instance (test or production infrastructure) 1.1 If none exists yet, read the installation guide\",\"Certificate 2.1 If none exists yet, read the certificate requirements\",\"Organization identifier, shortest FQDN of your organizations website, e.g. my-hospital.de\",\"FHIR endpoint URL, e.g. https://dsf.my-hospital.de/fhir\",\"Contact details from a responsible person of your organization\",\"Access to the E-Mail address from your organization for verification\"]},\"927\":{\"h\":\"Start here\",\"t\":[\"When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool:\",\"Test infrastructure\",\"Production infrastructure\",\"We use different highlight colors for the DSF Allow List Management Tool: Green for the Test environment and blue for the Production infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"928\":{\"h\":\"Install Plugins\",\"t\":[\"Marketplace for process plugins\",\"To install and learn more about each Process Plugin, you can visit the Marketplace here.\"]},\"929\":{\"h\":\"\",\"t\":[\"You can find an overview of compatable process plugins below (last updated 14/08/2024).\",\"Process Plugin\",\"released for test\",\"released for production\",\"Ping-Pong\",\"v1.0.1.0\",\"v1.0.1.0\",\"Allow-List\",\"v1.0.0.1\",\"v1.0.0.1\",\"MII Process Feasibility\",\"v1.0.0.6\",\"v1.0.0.6\",\"MII Process Report\",\"v1.1.1.1\",\"v1.1.1.1\",\"MII Process Data Transfer\",\"v1.0.2.1\",\"v1.0.2.1\",\"MII Process Data Sharing\",\"v1.0.1.1\",\"v1.0.1.1\",\"NUM-RDP\",\"v1.1.0.0\",\"v1.1.0.0\",\"Explore and install Process Plugins in the Marketplace. Details on each plugin are available here.\",\"Deploying the process plugin to the DSF involves copy the process jar-file and configuring environment variable for the business process engine (BPE).\"]},\"930\":{\"h\":\"Prerequisites\",\"t\":[\"A DSF installation of version 1.3.x or higher. An installation guide can be found here.\"]},\"931\":{\"h\":\"Deployment\",\"t\":[\"Add the process jar-file to the DSF BPE folder /opt/bpe/process:\",\"wget (your jar-file download link)\",\"For example:\",\" wget https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/download/v1.0.0.1/mii-process-data-sharing-1.0.0.1.jar\",\"Make sure the process is readable by the bpe user or group, for example by executing:\",\"sudo chmod 440 (your jar-file name.jar) sudo chown root:bpe (your jar-file name.jar)\",\"For example:\",\"sudo chmod 440 mii-process-data-sharing-1.0.0.1.jar sudo chown root:bpe mii-process-data-sharing-1.0.0.1.jar\",\"Modify the process exclude config in /opt/bpe/docker-compose.yml\",\"Reminder: Update/verify required configurations in docker-compose.yml\"]},\"932\":{\"h\":\"Install DSF 1.5.2\",\"t\":[\"In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network.\",\"Unified installation manual\",\"The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages.\"]},\"933\":{\"h\":\"Prerequisites\"},\"934\":{\"h\":\"Virtual Machines\",\"t\":[\"DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\",\"DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD\"]},\"935\":{\"h\":\"Docker / Docker-Compose\",\"t\":[\"Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install.\",\"sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \\\"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\\\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable docker.service sudo systemctl enable containerd.service\",\"The current version of docker compose is installed with the current docker version.\"]},\"936\":{\"h\":\"Client/Server Certificates\",\"t\":[\"Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed:\",\"Certificate A: Server Certificate - TLS Web Server Authentication (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN)\",\"Certificate B: Client Certificate - TLS Web Client Authentication (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN)\",\"If you use GÉANT TCS certificates, then they are configured by default with the necessary X509v3 Extended Key Usages: TLS Web Server Authentication, TLS Web Client Authentication.\"]},\"937\":{\"h\":\"Network setup / Network access\",\"t\":[\"The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception.\",\"The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception.\",\"Here is a quick overview of the expected network setup.\",\"Source\",\"Target\",\"Port\",\"Protocol\",\"DSF BPE (local)\",\"DSF FHIR (local)\",\"443\",\"https, wss\",\"DSF BPE (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https\",\"DSF FHIR (local)\",\"DSF FHIR (other DSF communication partners)\",\"443\",\"https (HTTP HEAD only)\",\"DSF BPE (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https\",\"DSF FHIR (other DSF communication partners)\",\"DSF FHIR (local)\",\"443\",\"https (HTTP HEAD only)\",\"Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information.\"]},\"938\":{\"h\":\"Setup\"},\"939\":{\"h\":\"Prepare Certificates\",\"t\":[\"Server Certificate (certificate A)This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)\",\"Store PEM encoded certificate as ssl_certificate_file.pem\",\"Store unencrypted, PEM encoded private-key as ssl_certificate_key_file.pem\",\"Client Certificate (Certificate B)This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)\",\"Store PEM encoded certificate as client_certificate.pem\",\"Store encrypted or not encrypted, PEM encoded private-key as client_certificate_private_key.pem\"]},\"940\":{\"h\":\"DSF FHIR Server\",\"t\":[\"Add Group/User Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2101 fhir sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir\",\"Download and Extract Config Files Download and unpack the prepared DSF FHIR server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_fhir_1_5_2.tar.gz sudo tar --same-owner -zxvf dsf_fhir_1_5_2.tar.gz\",\"The tar command will unpack the config files at /opt/fhir assuming you changed into the /opt directory.\",\"Verify that the fhir system user or group can write into the following folder\",\"/opt/fhir/log\",\"Add certificates and keys\",\"Add the server certificate (certificate A) and the corresponding private-key to /opt/fhir/secrets/\",\"ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)\",\"ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker)\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/fhir/secrets/\",\"client_certificate.pem (chmod: 440, chown: fhir:docker)\",\"client_certificate_private_key.pem (chmod: 440, chown: fhir:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/fhir/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L39: - app_client_certificate_private_key.pem.password ... L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L141: app_client_certificate_private_key.pem.password: L142: file: ./secrets/client_certificate_private_key.pem.password\",\"How to chmod / chown\",\"For the example ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) you must:\",\"Set the file content as requested\",\"Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users):chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem\",\"Change the owner of the file to the user fhir and the group the file belongs to to docker:chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem\",\"Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by DFN-Verein Global Issuing CA\",\"L114: ssl_certificate_chain_file.pem: L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem\",\"Modify database passwords\",\"/opt/fhir/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/fhir/secrets/db_user_permanent_delete.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> proxy -> environment:\",\"HTTPS_SERVER_NAME_PORT: TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443 Set your FHIR servers external FQDN, e.g. foo.bar.de -> foo.bar.de:443\",\"For additional environment variables, see DSF configuration parameters - FHIR Reverse Proxy\",\"services -> app -> environment:\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: todo.organization.com Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. hs-heilbronn.de\",\"DEV_DSF_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT: f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate B) Use certtool --fingerprint --hash=sha512 --infile=client_certificate.pem to generate the hash.\",\"DEV_DSF_FHIR_SERVER_ROLECONFIG: | (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server Access Control page.\",\"For additional environment variables, see FHIR server Configuration Parameters page.\",\"Start the DSF FHIR Server Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\"]},\"941\":{\"h\":\"DSF BPE Server\",\"t\":[\"Add Group/User Add group and user used by the DSF BPE java application. Ubuntu compatible commands below:\",\"sudo groupadd --gid 2202 bpe sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe\",\"Download and Extract Config Files Download and extract prepared DSF BPE server config files and folder structure:\",\"cd /opt wget https://dsf.dev/download/dsf_bpe_1_5_2.tar.gz sudo tar --same-owner -zxvf dsf_bpe_1_5_2.tar.gz\",\"The tar command will unpack the config files at /opt/bpe assuming you changed into the /opt directory.\",\"Verify that the bpe system user or group can write into the following folders\",\"/opt/bpe/log\",\"Add certificates and keys\",\"Add the client certificate (Certificate B) and the corresponding private-key to /opt/bpe/secrets/\",\"client_certificate.pem (chmod: 440 chown: bpe:docker)\",\"client_certificate_private_key.pem (chmod: 440 chown: bpe:docker)\",\"If the private key is encrypted, add a password file with the password as the only content to /opt/bpe/secrets/client_certificate_private_key.pem.password\",\"If the private key is not encrypted, remove the corresponding docker secret lines from the docker-compose.yml file\",\"L13: - app_client_certificate_private_key.pem.password ... L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password ... L89: app_client_certificate_private_key.pem.password: L90: file: ./secrets/client_certificate_private_key.pem.password\",\"Modify database passwords\",\"/opt/bpe/secrets/db_liquibase.password\",\"Generate a random password (min. 32 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"/opt/bpe/secrets/db_user_camunda.password\",\"Generate a random password (min. 16 characters recommended) and replace the content of the file.\",\"Modify the docker-compose.yml file and set environment variables to the appropriate values\",\"services -> app -> environment:\",\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf.todo.organization.com/fhir Set your FHIR servers external FQDN, e.g. foo.bar.de -> https://foo.bar.de/fhir\",\"For additional environment variables, see the BPE server Configuration Parameters page.\",\"Start the DSF BPE Server (without process plugins) Start using: docker compose up -d && docker compose logs -f (Ctrl-C will close log, but not stop container)\",\"Verify DSF BPE Startup\",\"Check that the BPE was able to download new Task resources from the DSF FHIR server during startup.\",\"Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup.\",\"Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup.\",\"If you need to debug the TLS connection to your DSF FHIR server use for example:docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443 The command above should print the server certificate of your DSF FHIR server (certificate A) and end with a message like [...]tlsv13 alert certificate required[...]\"]},\"942\":{\"h\":\"Logs\",\"t\":[\"By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use docker compose logs -f in /opt/bpe and /opt/fhir to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the /opt/fhir/log and /opt/bpe/log directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from /opt/fhir/log and /opt/bpe/log in your support request.\",\"On a successful BPE start, you should see the following entries in your BPE log:\",\"INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID1 INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID2\"]},\"943\":{\"h\":\"On-Boarding\",\"t\":[\"Please visit the on boarding website of your network for more information.\",\"Ideas for improvement?\",\"Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much!\"]},\"944\":{\"h\":\"Maintain a DSF instance\"},\"945\":{\"h\":\"Overview\",\"t\":[\"Install DSF 1.5.2\",\"Upgrade from DSF 0.9.x\",\"Allow List Management\",\"FHIR Reverse Proxy \",\"Configuration Parameters\",\"FHIR Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\",\"BPE Reverse Proxy \",\"Configuration Parameters\",\"BPE Server \",\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"946\":{\"h\":\"Upgrade from DSF 0.9.x\",\"t\":[\"A direct upgrade from DSF 0.9.x to DSF 1.x is not supported.\",\"Do not use your 0.9.x configuration as starting point\",\"There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names.\",\"Please use the new installation manual to perform a new installation and use the old setup only for reference.\",\"Instead, please perform the following steps:\",\"Shut down your DSF instances (DSF FHIR Server and DSF BPE).\",\"Backup your DSF instances (e.g. by moving the folders /opt/bpe and /opt/fhir to /opt/bpe_0.9 and /opt/fhir_0.9)\",\"Install the new DSF according to the instructions.\",\"You can copy your certificates (server- and client certificates) to your new installation. Please do not copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust).\",\"Configure your processes according to the new process plugin documentation. You can use your test environment configuration and your old production setup configuration for reference. Please ensure to use the new configuration parameter names, as many of them will have new prefixes (like DEV_DSF instead of ORG_HIGHMED).\",\"If you perform the installation before the change of the according environment, you can start the old instances again (out of the /opt/fhir_0.9 and /opt/bpe_0.9 directories).\",\"If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones.\",\"New process plugins\",\"Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance.\",\"Use your old virtual machine\",\"We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place.\"]},\"947\":{\"h\":\"Upgrade from DSF 1.5.1\",\"t\":[\"Upgrading the DSF from 1.5.1 to 1.5.2 involves modifying the docker-compose.yml files and recreating the containers.\",\"Update to DSF 1.2.0 first\",\"When upgrading from 1.0.0 or 1.1.0 it is important to migrate to DSF 1.2.0 first.\"]},\"948\":{\"h\":\"Modify DSF FHIR Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/fhir directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.5.2_upgrade\",\"Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.5.2.\",\"version: '3.8' services: proxy: - image: ghcr.io/datasharingframework/fhir_proxy:1.5.1 + image: ghcr.io/datasharingframework/fhir_proxy:1.5.2 restart: on-failure ... app: - image: ghcr.io/datasharingframework/fhir:1.5.1 + image: ghcr.io/datasharingframework/fhir:1.5.2 restart: on-failure ...\",\"Upgrade the DSF FHIR containers From /opt/fhir execute\",\"docker compose up -d && docker compose logs -f\"]},\"949\":{\"h\":\"Modify DSF BPE Server Setup\",\"t\":[\"Preparation / Backup\",\"We recommend to create a backup of the /opt/bpe directory before proceeding with the upgrade. For example using: sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.5.2_upgrade\",\"Modify the DSF BPE docker-compose.yml file, replace the version number with 1.5.2.\",\"version: '3.8' services: app: - image: ghcr.io/datasharingframework/bpe:1.5.1 + image: ghcr.io/datasharingframework/bpe:1.5.2 restart: on-failure ...\",\"Upgrade the DSF BPE containers From /opt/bpe execute\",\"docker compose up -d && docker compose logs -f\",\"Verify your upgrade:\",\"Verify the DSF FHIR server is running in version 1.5.2. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.5.2, [...]\",\"Verify the DSF FHIR server started without errors\",\"Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate)\",\"Verify the DSF BPE server is running in version 1.5.2. The log should contain a message:INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.5.2, [...]\",\"Verify the DSF BPE server started without errors\",\"Verify your install with a ping/pong test\"]},\"950\":{\"h\":\"Configuration Parameters\"},\"951\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"952\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"953\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"954\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"955\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"956\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"957\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"958\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"959\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"960\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"961\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"962\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"963\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"964\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"965\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"966\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"967\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"968\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"969\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"970\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"971\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"972\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"973\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"974\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"975\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"976\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"977\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"978\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"979\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"980\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"981\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"982\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"983\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"984\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"985\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"986\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"987\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"988\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"989\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"990\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"991\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"992\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"993\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"994\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"995\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"996\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"997\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"998\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"999\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1000\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1001\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1002\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1003\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1004\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1005\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1006\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1007\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1008\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1009\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1010\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1011\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1012\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1013\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1014\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1015\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1016\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1017\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1018\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1019\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1020\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1021\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1022\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1023\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1024\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1025\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1026\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1027\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1028\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1029\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1030\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1031\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1032\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1033\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1034\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1035\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1036\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1037\":{\"h\":\"BPE Server\"},\"1038\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1039\":{\"h\":\"Access Control\"},\"1040\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1041\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1042\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1043\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1044\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1045\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"1046\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"1047\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"1048\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"1049\":{\"h\":\"Configuration Parameters\"},\"1050\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1051\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1052\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1053\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1054\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"1055\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"1056\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1057\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1058\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1059\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1060\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"1061\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"1062\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"1063\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1064\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"1065\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"1066\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"1067\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"1068\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1069\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"1070\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"1071\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"1072\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"1073\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1074\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1075\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1076\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1077\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1078\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1079\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1080\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1081\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1082\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1083\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1084\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1085\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1086\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1087\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1088\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1089\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1090\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1091\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1092\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1093\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1094\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1095\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1096\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1097\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1098\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1099\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1100\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1101\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1102\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1103\":{\"h\":\"OpenID Connect\"},\"1104\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1105\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1106\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"1107\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1108\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.3.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1109\":{\"h\":\"FHIR Server\"},\"1110\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1111\":{\"h\":\"Configuration Parameters\"},\"1112\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1113\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1114\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1115\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1116\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1117\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1118\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1119\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1120\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1121\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1122\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1123\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1124\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1125\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1126\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1127\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1128\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1129\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1130\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1131\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1132\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1133\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1134\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1135\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1136\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1137\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1138\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1139\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"1140\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"1141\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"1142\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"1143\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"1144\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"1145\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1146\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"1147\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1148\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1149\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1150\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1151\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1152\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1153\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1154\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1155\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1156\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"1157\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"1158\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1159\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1160\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1161\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1162\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1163\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1164\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1165\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1166\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1167\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1168\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1169\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1170\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1171\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1172\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1173\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1174\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1175\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1176\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1177\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1178\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1179\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1180\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1181\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1182\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1183\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1184\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1185\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1186\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1187\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1188\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1189\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1190\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1191\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1192\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1193\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1194\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1195\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1196\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1197\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1198\":{\"h\":\"BPE Server\"},\"1199\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1200\":{\"h\":\"Configuration Parameters\"},\"1201\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1202\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1203\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1204\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1205\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1206\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1207\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"1208\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1209\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1210\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1211\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1212\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1213\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1214\":{\"h\":\"FHIR Reverse Proxy\"},\"1215\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1216\":{\"h\":\"Access Control\"},\"1217\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1218\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1219\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1220\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1221\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1222\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"1223\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"1224\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"1225\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"1226\":{\"h\":\"Configuration Parameters\"},\"1227\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1228\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1229\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1230\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1231\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"1232\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"1233\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1234\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1235\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1236\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1237\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"1238\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"1239\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"1240\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1241\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"1242\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"1243\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"1244\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"1245\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1246\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"1247\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"1248\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"1249\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"1250\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1251\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1252\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1253\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1254\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1255\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1256\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1257\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1258\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1259\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1260\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1261\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1262\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1263\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1264\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1265\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1266\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1267\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1268\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1269\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1270\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1271\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1272\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1273\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1274\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1275\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1276\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1277\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1278\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1279\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1280\":{\"h\":\"OpenID Connect\"},\"1281\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1282\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1283\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"1284\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1285\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.3.1 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1286\":{\"h\":\"FHIR Server\"},\"1287\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1288\":{\"h\":\"Configuration Parameters\"},\"1289\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1290\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1291\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1292\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1293\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1294\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1295\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"1296\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1297\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1298\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1299\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1300\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1301\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1302\":{\"h\":\"FHIR Reverse Proxy\"},\"1303\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1304\":{\"h\":\"Configuration Parameters\"},\"1305\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1306\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1307\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1308\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1309\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1310\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1311\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1312\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1313\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1314\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1315\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1316\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1317\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1318\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1319\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1320\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1321\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1322\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1323\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1324\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1325\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1326\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1327\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1328\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1329\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1330\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1331\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1332\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"1333\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"1334\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"1335\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"1336\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"1337\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"1338\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1339\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"1340\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1341\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1342\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1343\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1344\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1345\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1346\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1347\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1348\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1349\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"1350\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"1351\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1352\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1353\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1354\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1355\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1356\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1357\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1358\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1359\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1360\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1361\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1362\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1363\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1364\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1365\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1366\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1367\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1368\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1369\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1370\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1371\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1372\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1373\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1374\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1375\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1376\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1377\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1378\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1379\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1380\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1381\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1382\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1383\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1384\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1385\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1386\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1387\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1388\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1389\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1390\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1391\":{\"h\":\"BPE Server\"},\"1392\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1393\":{\"h\":\"Configuration Parameters\"},\"1394\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1395\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1396\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1397\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1398\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1399\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1400\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"1401\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1402\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1403\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1404\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1405\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1406\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1407\":{\"h\":\"FHIR Reverse Proxy\"},\"1408\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1409\":{\"h\":\"Access Control\"},\"1410\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1411\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1412\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1413\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1414\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1415\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"1416\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"1417\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"1418\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"1419\":{\"h\":\"Configuration Parameters\"},\"1420\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1421\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1422\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1423\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1424\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"1425\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"1426\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1427\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1428\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1429\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1430\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"1431\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"1432\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"1433\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1434\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"1435\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"1436\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"1437\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"1438\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1439\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"1440\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"1441\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"1442\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"1443\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1444\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1445\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1446\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1447\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1448\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1449\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1450\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1451\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1452\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1453\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1454\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1455\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1456\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1457\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1458\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1459\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1460\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1461\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1462\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1463\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1464\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1465\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1466\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1467\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1468\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1469\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1470\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1471\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1472\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1473\":{\"h\":\"OpenID Connect\"},\"1474\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1475\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1476\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"1477\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1478\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.3.2 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1479\":{\"h\":\"FHIR Server\"},\"1480\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1481\":{\"h\":\"Access Control\"},\"1482\":{\"h\":\"Overview\",\"t\":[\"The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect configuration page.\",\"Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable access for a specific client-certificate:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - ADMIN\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1483\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1484\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1485\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1486\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1487\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"1488\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the user interface. Allowed values are:\",\"ADMIN.\"]},\"1489\":{\"h\":\"practitioner-role\",\"t\":[\"The BPE server currently does not support any practionier-roles.\"]},\"1490\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - ADMIN\",\"The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - email-admins: email: - first.user@test.org - second.user@test.org dsf-role: - ADMIN\"]},\"1491\":{\"h\":\"Configuration Parameters\"},\"1492\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1493\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1494\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1495\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1496\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1497\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1498\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1499\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1500\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1501\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1502\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1503\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1504\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1505\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1506\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1507\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1508\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1509\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1510\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1511\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1512\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1513\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1514\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1515\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1516\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1517\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1518\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1519\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"1520\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"1521\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"1522\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"1523\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"1524\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"1525\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1526\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"1527\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1528\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1529\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1530\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1531\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1532\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1533\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1534\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1535\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1536\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1537\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1538\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1539\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"1540\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"1541\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1542\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1543\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1544\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1545\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1546\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1547\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1548\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1549\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1550\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1551\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1552\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1553\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1554\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1555\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1556\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1557\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1558\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1559\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1560\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1561\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1562\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1563\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1564\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1565\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1566\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1567\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1568\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1569\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1570\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1571\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1572\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1573\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1574\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1575\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1576\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1577\":{\"h\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.server.base.url\",\"Required: No\",\"Description: Base address of the BPE server, configure when exposing the web-ui\",\"Example:https://foo.bar/bpe\",\"Default:https\"]},\"1578\":{\"h\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.bpe.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1579\":{\"h\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.bpe.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1580\":{\"h\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.bpe.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"1581\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1582\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1583\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1584\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1585\":{\"h\":\"OpenID Connect\"},\"1586\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF BPE server user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF BPE server supports Authorization Code Flow for the user interface. Back-Channel Logout is also supported.\",\"BPE Reverse Proxy\",\"The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1587\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF BPE server accepts logout tokens at DEV_DSF_BPE_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1588\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF BPE server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1589\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/bpe:1.5.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-bpe DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1590\":{\"h\":\"BPE Server\"},\"1591\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1592\":{\"h\":\"Configuration Parameters\"},\"1593\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1594\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF BPE server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1595\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1596\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1597\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1598\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1599\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/bpe\"]},\"1600\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1601\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1602\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1603\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1604\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1605\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1606\":{\"h\":\"BPE Reverse Proxy\"},\"1607\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1608\":{\"h\":\"Access Control\"},\"1609\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1610\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1611\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1612\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1613\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1614\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"1615\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"1616\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"1617\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"1618\":{\"h\":\"Configuration Parameters\"},\"1619\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1620\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1621\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1622\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1623\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"1624\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"1625\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1626\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1627\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1628\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1629\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"1630\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"1631\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"1632\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1633\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"1634\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"1635\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"1636\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"1637\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1638\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1639\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1640\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1641\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"1642\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: Local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"1643\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"1644\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: Page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"1645\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1646\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1647\":{\"h\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.fhir.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"1648\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1649\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1650\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1651\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1652\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1653\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1654\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1655\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1656\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1657\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1658\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1659\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1660\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1661\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1662\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1663\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1664\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1665\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1666\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1667\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1668\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1669\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1670\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1671\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1672\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1673\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1674\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1675\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1676\":{\"h\":\"OpenID Connect\"},\"1677\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1678\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1679\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"1680\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1681\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.5.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1682\":{\"h\":\"FHIR Server\"},\"1683\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1684\":{\"h\":\"Configuration Parameters\"},\"1685\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1686\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1687\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1688\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1689\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1690\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1691\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"1692\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1693\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1694\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1695\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1696\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1697\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1698\":{\"h\":\"FHIR Reverse Proxy\"},\"1699\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1700\":{\"h\":\"Configuration Parameters\"},\"1701\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1702\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1703\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1704\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1705\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1706\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1707\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1708\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1709\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1710\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1711\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1712\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1713\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1714\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1715\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1716\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1717\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1718\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1719\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1720\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1721\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1722\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1723\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1724\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1725\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1726\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1727\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1728\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"1729\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"1730\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"1731\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"1732\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"1733\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"1734\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1735\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"1736\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1737\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1738\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1739\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1740\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1741\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1742\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1743\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1744\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1745\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"1746\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"1747\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1748\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1749\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1750\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1751\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1752\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1753\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1754\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1755\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1756\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1757\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1758\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1759\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1760\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1761\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1762\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1763\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1764\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1765\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1766\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1767\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1768\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1769\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1770\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1771\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1772\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1773\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1774\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1775\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1776\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1777\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1778\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1779\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1780\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1781\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1782\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1783\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1784\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1785\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1786\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1787\":{\"h\":\"BPE Server\"},\"1788\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1789\":{\"h\":\"Access Control\"},\"1790\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1791\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1792\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1793\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1794\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1795\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"To types of roles can be applied to matched users.\"]},\"1796\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"1797\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"1798\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"1799\":{\"h\":\"Configuration Parameters\"},\"1800\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1801\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1802\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1803\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: The timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1804\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: The timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"1805\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"1806\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1807\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1808\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1809\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1810\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"1811\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: The address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"1812\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"1813\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1814\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"1815\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"1816\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"1817\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"1818\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: The base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1819\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: The fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"1820\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: The local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"1821\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"1822\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: The page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"1823\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1824\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1825\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1826\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1827\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1828\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1829\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1830\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1831\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1832\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1833\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1834\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1835\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1836\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1837\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1838\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1839\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1840\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1841\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1842\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1843\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1844\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1845\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1846\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1847\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1848\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1849\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1850\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1851\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1852\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1853\":{\"h\":\"OpenID Connect\"},\"1854\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1855\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1856\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"1857\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1858\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.4.0 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1859\":{\"h\":\"FHIR Server\"},\"1860\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1861\":{\"h\":\"Configuration Parameters\"},\"1862\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR servers application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1863\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1864\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1865\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1866\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1867\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1868\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"1869\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1870\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1871\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1872\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"1873\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"1874\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"1875\":{\"h\":\"FHIR Reverse Proxy\"},\"1876\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"1877\":{\"h\":\"Access Control\"},\"1878\":{\"h\":\"Overview\",\"t\":[\"The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect configuration page.\",\"Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable access for a specific client-certificate:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - ADMIN\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG if no roles should be configured.\"]},\"1879\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"1880\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"1881\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"1882\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"1883\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"1884\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the user interface. Allowed values are:\",\"ADMIN.\"]},\"1885\":{\"h\":\"practitioner-role\",\"t\":[\"The BPE server currently does not support any practionier-roles.\"]},\"1886\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - ADMIN\",\"The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - email-admins: email: - first.user@test.org - second.user@test.org dsf-role: - ADMIN\"]},\"1887\":{\"h\":\"Configuration Parameters\"},\"1888\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"1889\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"1890\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"1891\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"1892\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"1893\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"1894\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"1895\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1896\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"1897\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"1898\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"1899\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"1900\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"1901\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"1902\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"1903\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"1904\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1905\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1906\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1907\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1908\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"1909\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"1910\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"1911\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"1912\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"1913\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"1914\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"1915\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"1916\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"1917\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"1918\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"1919\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"1920\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"1921\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"1922\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"1923\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1924\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1925\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1926\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"1927\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1928\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1929\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"1930\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"1931\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"1932\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"1933\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"1934\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1935\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"1936\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"1937\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"1938\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"1939\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"1940\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1941\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"1942\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"1943\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"1944\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"1945\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"1946\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"1947\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"1948\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"1949\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"1950\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"1951\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"1952\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1953\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"1954\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"1955\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1956\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"1957\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"1958\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"1959\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"1960\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"1961\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"1962\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"1963\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"1964\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"1965\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"1966\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"1967\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"1968\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"1969\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"1970\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"1971\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"1972\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"1973\":{\"h\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.server.base.url\",\"Required: No\",\"Description: Base address of the BPE server, configure when exposing the web-ui\",\"Example:https://foo.bar/bpe\",\"Default:https\"]},\"1974\":{\"h\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.bpe.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"1975\":{\"h\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.bpe.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"1976\":{\"h\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.bpe.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"1977\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"1978\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"1979\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"1980\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"1981\":{\"h\":\"OpenID Connect\"},\"1982\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF BPE server user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF BPE server supports Authorization Code Flow for the user interface. Back-Channel Logout is also supported.\",\"BPE Reverse Proxy\",\"The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"1983\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF BPE server accepts logout tokens at DEV_DSF_BPE_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"1984\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF BPE server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"1985\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/bpe:1.5.1 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-bpe DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"1986\":{\"h\":\"BPE Server\"},\"1987\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"1988\":{\"h\":\"Configuration Parameters\"},\"1989\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"1990\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF BPE server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"1991\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1992\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"1993\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1994\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"1995\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/bpe\"]},\"1996\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"1997\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"1998\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"1999\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"2000\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"2001\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"2002\":{\"h\":\"BPE Reverse Proxy\"},\"2003\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"2004\":{\"h\":\"Access Control\"},\"2005\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"2006\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"2007\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"2008\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"2009\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"2010\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"2011\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"2012\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"2013\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"2014\":{\"h\":\"Configuration Parameters\"},\"2015\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"2016\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"2017\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"2018\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"2019\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"2020\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"2021\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"2022\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"2023\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"2024\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"2025\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"2026\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"2027\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"2028\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"2029\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"2030\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"2031\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"2032\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"2033\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2034\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2035\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2036\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"2037\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"2038\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: Local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"2039\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"2040\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: Page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"2041\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"2042\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"2043\":{\"h\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.fhir.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"2044\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"2045\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"2046\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"2047\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"2048\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"2049\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"2050\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"2051\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"2052\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"2053\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"2054\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"2055\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2056\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2057\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"2058\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"2059\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"2060\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"2061\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"2062\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"2063\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"2064\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"2065\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2066\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2067\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2068\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2069\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"2070\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"2071\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"2072\":{\"h\":\"OpenID Connect\"},\"2073\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"2074\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"2075\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"2076\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"2077\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.5.1 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"2078\":{\"h\":\"FHIR Server\"},\"2079\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"2080\":{\"h\":\"Configuration Parameters\"},\"2081\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"2082\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"2083\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2084\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2085\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2086\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2087\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"2088\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"2089\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"2090\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"2091\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"2092\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"2093\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"2094\":{\"h\":\"FHIR Reverse Proxy\"},\"2095\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"2096\":{\"h\":\"Access Control\"},\"2097\":{\"h\":\"Overview\",\"t\":[\"The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user.\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect configuration page.\",\"Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable access for a specific client-certificate:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - ADMIN\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_BPE_SERVER_ROLECONFIG if no roles should be configured.\"]},\"2098\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"2099\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"2100\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"2101\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"2102\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"2103\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the user interface. Allowed values are:\",\"ADMIN.\"]},\"2104\":{\"h\":\"practitioner-role\",\"t\":[\"The BPE server currently does not support any practionier-roles.\"]},\"2105\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - ADMIN\",\"The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_BPE_SERVER_ROLECONFIG: | - email-admins: email: - first.user@test.org - second.user@test.org dsf-role: - ADMIN\"]},\"2106\":{\"h\":\"Configuration Parameters\"},\"2107\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"2108\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"2109\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"2110\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"2111\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"2112\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"2113\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"2114\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2115\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2116\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"2117\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"2118\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"2119\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"2120\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"2121\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"2122\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"2123\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"2124\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2125\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2126\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2127\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2128\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"2129\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"2130\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"2131\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"2132\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"2133\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF BPE server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"2134\":{\"h\":\"DEV_DSF_BPE_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF BPE server to execute database migrations\",\"Default:liquibase_user\"]},\"2135\":{\"h\":\"DEV_DSF_BPE_DB_URL\",\"t\":[\"Property: dev.dsf.bpe.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF BPE server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/bpe\"]},\"2136\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server for camunda processes\",\"Default:camunda_users\"]},\"2137\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE\",\"Example:/run/secrets/db_user_camunda.password\"]},\"2138\":{\"h\":\"DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.camunda.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server for camunda processes\",\"Recommendation: Use a different user then in DEV_DSF_BPE_DB_USER_USERNAME\",\"Default:camunda_server_user\"]},\"2139\":{\"h\":\"DEV_DSF_BPE_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.bpe.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF BPE server\",\"Default:bpe_users\"]},\"2140\":{\"h\":\"DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF BPE server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"2141\":{\"h\":\"DEV_DSF_BPE_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF BPE server\",\"Default:bpe_server_user\"]},\"2142\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2143\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2144\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityEnd\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity end, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"2145\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.onActivityStart\",\"Required: No\",\"Description: To enable debug log messages for every bpmn activity start, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development.\",\"Default:false\"]},\"2146\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variables\",\"Required: No\",\"Description: To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2147\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.variablesLocal\",\"Required: No\",\"Description: To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to true.\",\"Recommendation: This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2148\":{\"h\":\"DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.bpe.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2149\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"2150\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"2151\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"2152\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with the local DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"2153\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"2154\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.local.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from the local DSF FHIR server, set to true\",\"Default:false\"]},\"2155\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established with a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:5000\"]},\"2156\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:60000\"]},\"2157\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.remote.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"2158\":{\"h\":\"DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"2159\":{\"h\":\"DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about questionnaire response resources from the DSF FHIR server\",\"Default:?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"2160\":{\"h\":\"DEV_DSF_BPE_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of the local DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"2161\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.max\",\"Required: No\",\"Description: Number of retries until a websocket connection can be established with the DSF FHIR server, -1 means infinite number of retries\",\"Default:-1\"]},\"2162\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a websocket connection with the DSF FHIR server\",\"Default:5000\"]},\"2163\":{\"h\":\"DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER\",\"t\":[\"Property: dev.dsf.bpe.fhir.task.subscription.search.parameter\",\"Required: No\",\"Description: Subscription to receive notifications about task resources from the DSF FHIR server\",\"Default:?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson\"]},\"2164\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate.pem\"]},\"2165\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem\"]},\"2166\":{\"h\":\"DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/smtp_server_client_certificate_private_key.pem.password\"]},\"2167\":{\"h\":\"DEV_DSF_BPE_MAIL_FROMADDRESS\",\"t\":[\"Property: dev.dsf.bpe.mail.fromAddress\",\"Required: No\",\"Description: Mail service sender address\",\"Example:sender@localhost\"]},\"2168\":{\"h\":\"DEV_DSF_BPE_MAIL_HOST\",\"t\":[\"Property: dev.dsf.bpe.mail.host\",\"Required: No\",\"Description: SMTP server hostname\",\"Example:smtp.server.de\"]},\"2169\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize\",\"Required: No\",\"Description: Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:4\"]},\"2170\":{\"h\":\"DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION\",\"t\":[\"Property: dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation\",\"Required: No\",\"Description: Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect.\",\"Default:/opt/bpe/log/bpe.log\"]},\"2171\":{\"h\":\"DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.password\",\"Required: No\",\"Description: SMTP server authentication password\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using DEV_DSF_BPE_MAIL_PASSWORD_FILE; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"2172\":{\"h\":\"DEV_DSF_BPE_MAIL_PORT\",\"t\":[\"Property: dev.dsf.bpe.mail.port\",\"Required: No\",\"Description: SMTP server port\",\"Example:465\",\"Default:0\"]},\"2173\":{\"h\":\"DEV_DSF_BPE_MAIL_REPLYTOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.replyToAddresses\",\"Required: No\",\"Description: Mail service reply to addresses; comma or space separated list, YAML block scalars supported\",\"Example:reply.to@localhost\"]},\"2174\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT\",\"t\":[\"Property: dev.dsf.bpe.mail.sendMailOnErrorLogEvent\",\"Required: No\",\"Description: To enable mails being send for every ERROR logged, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"2175\":{\"h\":\"DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP\",\"t\":[\"Property: dev.dsf.bpe.mail.sendTestMailOnStartup\",\"Required: No\",\"Description: To enable a test mail being send on startup of the BPE, set to true. Requires SMTP server to be configured.\",\"Default:false\"]},\"2176\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore\",\"Required: No\",\"Description: PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smime_certificate.p12\"]},\"2177\":{\"h\":\"DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.bpe.mail.smime.p12Keystore.password\",\"Required: No\",\"Description: Password to decrypt the PKCS12 encoded S/MIMIE certificate file\",\"Recommendation: Use docker secret file to configure using DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE\",\"Example:/run/secrets/smime_certificate.p12.password\"]},\"2178\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSES\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddresses\",\"Required: No\",\"Description: Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported\",\"Example:recipient@localhost\"]},\"2179\":{\"h\":\"DEV_DSF_BPE_MAIL_TOADDRESSESCC\",\"t\":[\"Property: dev.dsf.bpe.mail.toAddressesCc\",\"Required: No\",\"Description: Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported\",\"Example:cc.recipient@localhost\"]},\"2180\":{\"h\":\"DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.bpe.mail.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via DEV_DSF_BPE_MAIL_USESMTPS\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/smtp_server_trust_certificates.pem\"]},\"2181\":{\"h\":\"DEV_DSF_BPE_MAIL_USERNAME\",\"t\":[\"Property: dev.dsf.bpe.mail.username\",\"Required: No\",\"Description: SMTP server authentication username\",\"Recommendation: Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via DEV_DSF_BPE_MAIL_USESMTPS\"]},\"2182\":{\"h\":\"DEV_DSF_BPE_MAIL_USESMTPS\",\"t\":[\"Property: dev.dsf.bpe.mail.useSmtps\",\"Required: No\",\"Description: To enable SMTP over TLS (smtps), set to true\",\"Default:false\"]},\"2183\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.corePoolSize\",\"Required: No\",\"Description: Process engine job executor core pool size\",\"Default:4\"]},\"2184\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.maxPoolSize\",\"Required: No\",\"Description: Process engine job executor max pool size, additional threads until max pool size are created if the queue is full\",\"Default:10\"]},\"2185\":{\"h\":\"DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE\",\"t\":[\"Property: dev.dsf.bpe.process.engine.queueSize\",\"Required: No\",\"Description: Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy\",\"Default:40\"]},\"2186\":{\"h\":\"DEV_DSF_BPE_PROCESS_EXCLUDED\",\"t\":[\"Property: dev.dsf.bpe.process.excluded\",\"Required: No\",\"Description: List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Only deploy processes that can be started depending on your organization's roles in the Allow-List\",\"Example:dsfdev_updateAllowList|1.0, another_process|x.y\"]},\"2187\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.max\",\"Required: No\",\"Description: Number of retries until a connection can be established with the local DSF FHIR server during process deployment, -1 means infinite number of retries\",\"Default:-1\"]},\"2188\":{\"h\":\"DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP\",\"t\":[\"Property: dev.dsf.bpe.process.fhir.server.retry.sleep\",\"Required: No\",\"Description: Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment\",\"Default:5000\"]},\"2189\":{\"h\":\"DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY\",\"t\":[\"Property: dev.dsf.bpe.process.plugin.directroy\",\"Required: No\",\"Description: Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server\",\"Recommendation: Change only if you don't use the provided directory structure from the installation guide or made changes to tit\",\"Default:process\"]},\"2190\":{\"h\":\"DEV_DSF_BPE_PROCESS_RETIRED\",\"t\":[\"Property: dev.dsf.bpe.process.retired\",\"Required: No\",\"Description: List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported\",\"Recommendation: Retire processes that where deployed previously but are not anymore available\",\"Example:old_process|x.y\"]},\"2191\":{\"h\":\"DEV_DSF_BPE_PROCESS_THREADS\",\"t\":[\"Property: dev.dsf.bpe.process.threads\",\"Required: No\",\"Description: Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value <= 0 means number of cpu cores\",\"Default:-1\"]},\"2192\":{\"h\":\"DEV_DSF_BPE_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.bpe.server.base.url\",\"Required: No\",\"Description: Base address of the BPE server, configure when exposing the web-ui\",\"Example:https://foo.bar/bpe\",\"Default:https\"]},\"2193\":{\"h\":\"DEV_DSF_BPE_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.bpe.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"2194\":{\"h\":\"DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.bpe.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"2195\":{\"h\":\"DEV_DSF_BPE_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.bpe.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"2196\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"2197\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"2198\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"2199\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"2200\":{\"h\":\"OpenID Connect\"},\"2201\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF BPE server user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF BPE server supports Authorization Code Flow for the user interface. Back-Channel Logout is also supported.\",\"BPE Reverse Proxy\",\"The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"2202\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF BPE server accepts logout tokens at DEV_DSF_BPE_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"2203\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF BPE server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"2204\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/bpe:1.5.2 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-bpe DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"2205\":{\"h\":\"BPE Server\"},\"2206\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"2207\":{\"h\":\"Configuration Parameters\"},\"2208\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"2209\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF BPE server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"2210\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2211\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2212\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2213\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2214\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/bpe\"]},\"2215\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"2216\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"2217\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"2218\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"2219\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"2220\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"2221\":{\"h\":\"BPE Reverse Proxy\"},\"2222\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"2223\":{\"h\":\"Access Control\"},\"2224\":{\"h\":\"Overview\",\"t\":[\"The DSF FHIR server implements a subset of the FHIR R4 REST API. When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"OpenID Connect\",\"To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect configuration page.\",\"Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG. The value for this environment variable is specified as YAML using the block scalar |.\",\"The listing below shows a minimal configuration to enable read access for a specific client-certificate:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - example_read_only_role: thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} dsf-role: - READ - SEARCH - HISTORY\",\"The list of user roles above contains a single rule-entry example_read_only_role, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty.\",\"Certificate Thumbprints\",\"SHA-512 certificate thumbprints in HEX form [a-f0-9]{128} can be calculated using:\",\"certtool --fingerprint --hash=sha512 --infile=certificate.pem\",\"Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string \\\"\\\" or a single block scalar | character as the value for the configuration parameter DEV_DSF_FHIR_SERVER_ROLECONFIG if no roles should be configured.\"]},\"2225\":{\"h\":\"Matching Users\",\"t\":[\"To apply roles, users can be matched via the thumbprint, email, token-role or token-group properties. A single value or a list of values can be specified.\"]},\"2226\":{\"h\":\"thumbprint\",\"t\":[\"The property thumbprint can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints.\"]},\"2227\":{\"h\":\"email\",\"t\":[\"Using the property email users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the emailclaim from the access token will be matched against the property values.\"]},\"2228\":{\"h\":\"token-role and token-group\",\"t\":[\"With the properties token-role and token-group role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens.\"]},\"2229\":{\"h\":\"DSF and Practitioner Roles\",\"t\":[\"Two types of roles can be applied to matched users.\"]},\"2230\":{\"h\":\"dsf-role\",\"t\":[\"DSF roles specified via the dsf-role property define general access to the REST API and user interface. Allowed values are:\",\"CREATE, READ, UPDATE, DELETE, SEARCH, HISTORY, PERMANENT_DELETE and WEBSOCKET.\"]},\"2231\":{\"h\":\"practitioner-role\",\"t\":[\"In order to allow users to start processes, the property practitioner-role can be used to assign codes from FHIR CodeSystem resources. Codes are specified in the form system-url|code. If the uses has a code specified here that match with a requester extension within the process plugin's ActivityDefinition resource, the user can start the process if he also has the dsf-roleCREATE.\",\"Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem http://dsf.dev/fhir/CodeSystem/practitioner-role:\",\"UAC_USER, COS_USER, CRR_USER, DIC_USER, DMS_USER, DTS_USER, HRP_USER, TTP_USER, AMS_USER and DSF_ADMIN.\"]},\"2232\":{\"h\":\"Examples\",\"t\":[\"The first example defines a group of DSF administrators. Two client certificates match against this role:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - certificate-admins: thumbprint: - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The second example defines a group of DSF administrators by specifying an admin role that gets matched against OAuth 2.0 access tokens:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - token-role-admins: token-role: admin dsf-role: - CREATE - READ - UPDATE - DELETE - SEARCH - HISTORY practitioner-role: - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN\",\"The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched:\",\" DEV_DSF_FHIR_SERVER_ROLECONFIG: | - read-only: email: - first.user@test.org - second.user@test.org dsf-role: - READ - SEARCH - HISTORY\"]},\"2233\":{\"h\":\"Configuration Parameters\"},\"2234\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate\",\"Required: Yes\",\"Description: PEM encoded file with local client certificate for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate.pem\"]},\"2235\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key\",\"Required: Yes\",\"Description: Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_certificate_private_key.pem\"]},\"2236\":{\"h\":\"DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the local client certificate encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/app_client_certificate_private_key.pem.password\"]},\"2237\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.connect\",\"Required: No\",\"Description: Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:2000\"]},\"2238\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TIMEOUT_READ\",\"t\":[\"Property: dev.dsf.fhir.client.timeout.read\",\"Required: No\",\"Description: Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted\",\"Recommendation: Change default value only if timeout exceptions occur\",\"Default:10000\"]},\"2239\":{\"h\":\"DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.fhir.client.trust.server.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client _trust_certificates.pem\"]},\"2240\":{\"h\":\"DEV_DSF_FHIR_CLIENT_VERBOSE\",\"t\":[\"Property: dev.dsf.fhir.client.verbose\",\"Required: No\",\"Description: To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to true\",\"Default:false\"]},\"2241\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.forceUnlock\",\"Required: No\",\"Description: To force liquibase to unlock the migration lock set to true\",\"Recommendation: Only use this option temporarily to unlock a stuck DB migration step\",\"Default:false\"]},\"2242\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.lockWaitTime\",\"Required: No\",\"Description: Liquibase change lock wait time in minutes, default 2 minutes\",\"Default:2\"]},\"2243\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.password\",\"Required: Yes\",\"Description: The password to access the database from the DSF FHIR server to execute database migrations\",\"Recommendation: Use docker secret file to configure by using DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE\",\"Example:/run/secrets/db_liquibase.password\"]},\"2244\":{\"h\":\"DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.liquibase.username\",\"Required: No\",\"Description: The user name to access the database from the DSF FHIR server to execute database migrations\",\"Default:liquibase_user\"]},\"2245\":{\"h\":\"DEV_DSF_FHIR_DB_URL\",\"t\":[\"Property: dev.dsf.fhir.db.url\",\"Required: Yes\",\"Description: Address of the database used for the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose\",\"Example:jdbc:postgresql://db/fhir\"]},\"2246\":{\"h\":\"DEV_DSF_FHIR_DB_USER_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server\",\"Default:fhir_users\"]},\"2247\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PASSWORD_FILE\",\"Example:/run/secrets/db_user.password\"]},\"2248\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.group\",\"Required: No\",\"Description: The name of the user group to access the database from the DSF FHIR server for permanent deletes\",\"Default:fhir_permanent_delete_users\"]},\"2249\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.password\",\"Required: Yes\",\"Description: Password to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use docker secret file to configure using DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE\",\"Example:/run/secrets/db_user_permanent_delete.password\"]},\"2250\":{\"h\":\"DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.permanent.delete.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server for permanent deletes\",\"Recommendation: Use a different user then DEV_DSF_FHIR_DB_USER_USERNAME\",\"Default:fhir_server_permanent_delete_user\"]},\"2251\":{\"h\":\"DEV_DSF_FHIR_DB_USER_USERNAME\",\"t\":[\"Property: dev.dsf.fhir.db.user.username\",\"Required: No\",\"Description: Username to access the database from the DSF FHIR server\",\"Default:fhir_server_user\"]},\"2252\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.currentUser\",\"Required: No\",\"Description: To enable logging of the currently requesting user set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2253\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.dbStatement\",\"Required: No\",\"Description: To enable logging of DB queries set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2254\":{\"h\":\"DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST\",\"t\":[\"Property: dev.dsf.fhir.debug.log.message.webserviceRequest\",\"Required: No\",\"Description: To enable logging of webservices requests set to true.\",\"Recommendation: This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log!\",\"Default:false\"]},\"2255\":{\"h\":\"DEV_DSF_FHIR_SERVER_BASE_URL\",\"t\":[\"Property: dev.dsf.fhir.server.base.url\",\"Required: Yes\",\"Description: Base address of this DSF FHIR server to read/store fhir resources\",\"Example:https://foo.bar/fhir\"]},\"2256\":{\"h\":\"DEV_DSF_FHIR_SERVER_INIT_BUNDLE\",\"t\":[\"Property: dev.dsf.fhir.server.init.bundle\",\"Required: No\",\"Description: Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server\",\"Recommendation: Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source\",\"Default:conf/bundle.xml\"]},\"2257\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE\",\"t\":[\"Property: dev.dsf.fhir.server.organization.identifier.value\",\"Required: Yes\",\"Description: Local identifier value used in the Allow-List\",\"Recommendation: By convention: The shortest possible FQDN that resolve the homepage of the organization\",\"Example:hospital.com\"]},\"2258\":{\"h\":\"DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT\",\"t\":[\"Property: dev.dsf.fhir.server.organization.thumbprint\",\"Required: Yes\",\"Description: The SHA-512 thumbprint of the local organization client certificate\",\"Recommendation: The thumbprint can be calculated via certtool --fingerprint --hash=sha512 --infile=client_certificate.pem\"]},\"2259\":{\"h\":\"DEV_DSF_FHIR_SERVER_PAGE_COUNT\",\"t\":[\"Property: dev.dsf.fhir.server.page.count\",\"Required: No\",\"Description: Page size returned by the DSF FHIR server when reading/searching fhir resources\",\"Default:20\"]},\"2260\":{\"h\":\"DEV_DSF_FHIR_SERVER_ROLECONFIG\",\"t\":[\"Property: dev.dsf.fhir.server.roleConfig\",\"Required: No\",\"Description: Role config YAML as defined in FHIR Server: Access Control.\"]},\"2261\":{\"h\":\"DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE\",\"t\":[\"Property: dev.dsf.fhir.server.static.resource.cache\",\"Required: No\",\"Description: To disable static resource caching, set to false\",\"Recommendation: Only set to false for development\",\"Default:true\"]},\"2262\":{\"h\":\"DEV_DSF_FHIR_SERVER_UI_THEME\",\"t\":[\"Property: dev.dsf.fhir.server.ui.theme\",\"Required: No\",\"Description: UI theme parameter, adds a color indicator to the ui to distinguish dev, test and prod environments im configured; supported values: dev, test and prod\"]},\"2263\":{\"h\":\"DEV_DSF_PROXY_NOPROXY\",\"t\":[\"Property: dev.dsf.proxy.noProxy\",\"Required: No\",\"Description: Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported\",\"Example:foo.bar, test.com:8080\"]},\"2264\":{\"h\":\"DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.proxy.password\",\"Required: No\",\"Description: Forward Proxy password\",\"Recommendation: Configure password if proxy requires authentication, use docker secret file to configure using DEV_DSF_PROXY_PASSWORD_FILE\"]},\"2265\":{\"h\":\"DEV_DSF_PROXY_URL\",\"t\":[\"Property: dev.dsf.proxy.url\",\"Required: No\",\"Description: Forward (http/https) proxy url, use DEV_DSF_BPE_PROXY_NOPROXY to list domains that do not require a forward proxy\",\"Example:http://proxy.foo:8080\"]},\"2266\":{\"h\":\"DEV_DSF_PROXY_USERNAME\",\"t\":[\"Property: dev.dsf.proxy.username\",\"Required: No\",\"Description: Forward proxy username\",\"Recommendation: Configure username if proxy requires authentication\"]},\"2267\":{\"h\":\"DEV_DSF_SERVER_API_HOST\",\"t\":[\"Property: dev.dsf.server.api.host\",\"Required: Yes\",\"Description: API connector host, default in docker image: 0.0.0.0\",\"Default:127.0.0.1\"]},\"2268\":{\"h\":\"DEV_DSF_SERVER_API_PORT\",\"t\":[\"Property: dev.dsf.server.api.port\",\"Required: Yes\",\"Description: API connector port, default in docker image: 8080\"]},\"2269\":{\"h\":\"DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER\",\"t\":[\"Property: dev.dsf.server.auth.client.certificate.header\",\"Required: Yes\",\"Description: Name of HTTP header with client certificate from reverse proxy\",\"Default:X-ClientCert\"]},\"2270\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW\",\"t\":[\"Property: dev.dsf.server.auth.oidc.authorization.code.flow\",\"Required: No\",\"Description: Set to true to enable OIDC authorization code flow\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL, DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET to be specified\",\"Default:false\"]},\"2271\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout\",\"Required: No\",\"Description: Set to true to enable OIDC back-channel logout\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to be set to true (enabled), DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID and DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH to be specified\",\"Default:false\"]},\"2272\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH\",\"t\":[\"Property: dev.dsf.server.auth.oidc.back.channel.logout.path\",\"Required: No\",\"Description: Path called by the OIDC provide to request back-channel logout\",\"Default:/back-channel-logout\"]},\"2273\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN\",\"t\":[\"Property: dev.dsf.server.auth.oidc.bearer.token\",\"Required: No\",\"Description: Set to true to enable OIDC bearer token authentication\",\"Recommendation: Requires DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL to be specified\",\"Default:false\"]},\"2274\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"t\":[\"Property:dev.dsf.server.auth.oidc.client.id\",\"Required: No\",\"Description: OIDC provider client_id, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2275\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"t\":[\"Property: dev.dsf.server.auth.oidc.client.secret\",\"Required: No\",\"Description: OIDC provider client_secret, must be specified if DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW is enabled\"]},\"2276\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate\",\"Required: No\",\"Description: PEM encoded file with client certificate for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate.pem\"]},\"2277\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key\",\"Required: No\",\"Description: Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE if private key is encrypted\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem\"]},\"2278\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password\",\"Required: No\",\"Description: Password to decrypt the client certificate for the OIDC provider encrypted private key\",\"Recommendation: Use docker secret file to configure using DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE\",\"Example:/run/secrets/oidc_provider_client_certificate_private_key.pem.password\"]},\"2279\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.connectTimeout\",\"Required: No\",\"Description: OIDC provider client connect timeout in milliseconds\",\"Default:5000\"]},\"2280\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.idleTimeout\",\"Required: No\",\"Description: OIDC provider client idle timeout in milliseconds\",\"Default:30000\"]},\"2281\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas\",\"Required: No\",\"Description: PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/oidc_provider_trust_certificates.pem\"]},\"2282\":{\"h\":\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"t\":[\"Property: dev.dsf.server.auth.oidc.provider.realm.base.url\",\"Required: No\",\"Description: OIDC provider realm base url\",\"Example:https://keycloak.test.com:8443/realms/example-realm-name\"]},\"2283\":{\"h\":\"DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS\",\"t\":[\"Property: dev.dsf.server.auth.trust.client.certificate.cas\",\"Required: Yes\",\"Description: PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/app_client_trust_certificates.pem\"]},\"2284\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE\",\"t\":[\"Property: dev.dsf.server.certificate\",\"Required: No\",\"Description: Server certificate file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2285\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_CHAIN\",\"t\":[\"Property: dev.dsf.server.certificate.chain\",\"Required: No\",\"Description: Server certificate chain file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2286\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY\",\"t\":[\"Property: dev.dsf.server.certificate.key\",\"Required: No\",\"Description: Server certificate private key file for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2287\":{\"h\":\"DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE\",\"t\":[\"Property: dev.dsf.server.certificate.key.password\",\"Required: No\",\"Description: Server certificate private key file password for testing\",\"Recommendation: Only specify For testing when terminating TLS in jetty server\"]},\"2288\":{\"h\":\"DEV_DSF_SERVER_CONTEXT_PATH\",\"t\":[\"Property: dev.dsf.server.context.path\",\"Required: Yes\",\"Description: Web application context path, default in bpe docker image: /bpe, default in fhir docker image: /fhir\",\"Recommendation: Only modify for testing\"]},\"2289\":{\"h\":\"DEV_DSF_SERVER_STATUS_HOST\",\"t\":[\"Property: dev.dsf.server.status.host\",\"Required: Yes\",\"Description: Status connector host\",\"Default:127.0.0.1\"]},\"2290\":{\"h\":\"DEV_DSF_SERVER_STATUS_PORT\",\"t\":[\"Property: dev.dsf.server.status.port\",\"Required: Yes\",\"Description: Status connector port, default in docker image: 10000\"]},\"2291\":{\"h\":\"OpenID Connect\"},\"2292\":{\"h\":\"Overview\",\"t\":[\"Access to the DSF FHIR server REST API and user interface can be configured via access control roles. By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled.\",\"The DSF FHIR server supports Authorization Code Flow for the user interface as well as Bearer Token Authentication for the REST API. Back-Channel Logout is also supported.\",\"FHIR Reverse Proxy\",\"The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter SSL_VERIFY_CLIENT needs to be set to optional.\"]},\"2293\":{\"h\":\"Authorization Code Flow\",\"t\":[\"To enable authentication via OpenID Connect authorization code flow, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW to true and specify the following parameters:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID\",\"DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET\",\"Optionally, back channel logout can be enabled by setting DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT to true. The DSF FHIR server accepts logout tokens at DEV_DSF_FHIR_SERVER_BASE_URL + /back-channel-logout. The path can be modified via DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH.\"]},\"2294\":{\"h\":\"Bearer Token Authentication\",\"t\":[\"To enable bearer token authentication, set the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN to true and specify the following parameter:\",\"DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL\"]},\"2295\":{\"h\":\"Additional ODIC Configuration Parameter\",\"t\":[\"A number of additional DEV_DSF_SERVER_AUTH_OIDC ... configuration parameter are specify on the DSF FHIR server configuration parameter page.\",\"For example the configuration parameter DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection.\"]},\"2296\":{\"h\":\"Example\",\"t\":[\"services: app: image: ghcr.io/datasharingframework/fhir:1.5.2 # ... secrets: - keycloak_root_ca.pem # ... environment: # ... DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 # ... secrets: keycloak_root_ca.pem: file: ./secrets/keycloak_root_ca.pem\"]},\"2297\":{\"h\":\"FHIR Server\"},\"2298\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\",\"Access Control\",\"OpenID Connect\"]},\"2299\":{\"h\":\"Configuration Parameters\"},\"2300\":{\"h\":\"APP_SERVER_IP\",\"t\":[\"Required: Yes\",\"Description: Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target\",\"Example:app, 172.28.1.3\"]},\"2301\":{\"h\":\"HTTPS_SERVER_NAME_PORT\",\"t\":[\"Required: Yes\",\"Description: External FQDN of your DSF FHIR server with port, typically 443\",\"Example:my-external.fqdn:443\"]},\"2302\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2303\":{\"h\":\"PROXY_PASS_CONNECTION_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established\",\"Default:30 seconds\"]},\"2304\":{\"h\":\"PROXY_PASS_TIMEOUT_HTTP\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2305\":{\"h\":\"PROXY_PASS_TIMEOUT_WS\",\"t\":[\"Required: No\",\"Description: Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply\",\"Default:60 seconds\"]},\"2306\":{\"h\":\"SERVER_CONTEXT_PATH\",\"t\":[\"Required: No\",\"Description: Reverse proxy context path that delegates to the app server, / character at start, no / character at end, use '' (empty string) to configure root as context path.\",\"Default:/fhir\"]},\"2307\":{\"h\":\"SSL_CA_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter SSLCACertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_certificate_file.pem\"]},\"2308\":{\"h\":\"SSL_CA_DN_REQUEST_FILE\",\"t\":[\"Required: No\",\"Description: File containing all signing certificates excepted, will be used to specify the Acceptable client certificate CA names send to the client, during TLS handshake, sets the apache httpd parameter SSLCADNRequestFile; if omitted all entries from SSL_CA_CERTIFICATE_FILE are used\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_ca_dn_request_file.pem\"]},\"2309\":{\"h\":\"SSL_CERTIFICATE_CHAIN_FILE\",\"t\":[\"Required: No\",\"Description: Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter SSLCertificateChainFile; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via SSL_CERTIFICATE_FILE contains the certificate chain\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_chain_file.pem\"]},\"2310\":{\"h\":\"SSL_CERTIFICATE_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate file, PEM encoded, sets the apache httpd parameter SSLCertificateFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_file.pem\"]},\"2311\":{\"h\":\"SSL_CERTIFICATE_KEY_FILE\",\"t\":[\"Required: Yes\",\"Description: Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter SSLCertificateKeyFile\",\"Recommendation: Use docker secret file to configure\",\"Example:/run/secrets/ssl_certificate_key_file.pem\"]},\"2312\":{\"h\":\"SSL_VERIFY_CLIENT\",\"t\":[\"Required: No\",\"Description: Modifies the apache mod_ssl config parameter SSLVerifyClient\",\"Recommendation: Set to optional when using OIDC authentication\",\"Default:require\"]},\"2313\":{\"h\":\"FHIR Reverse Proxy\"},\"2314\":{\"h\":\"Overview\",\"t\":[\"Configuration Parameters\"]},\"2315\":{\"h\":\"\",\"t\":[\"404 Not Found\"]},\"2316\":{\"h\":\"Info\"},\"2317\":{\"h\":\"Archive\"},\"2318\":{\"h\":\"Release\"}},\"dirtCount\":0,\"index\":[[\"<=\",{\"1\":{\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"<version>\",{\"1\":{\"295\":2,\"345\":2,\"686\":2,\"893\":2}}],[\"<issue\",{\"1\":{\"295\":2,\"345\":2,\"686\":2,\"893\":2}}],[\"+\",{\"1\":{\"168\":2,\"169\":1,\"192\":2,\"193\":1,\"226\":1,\"228\":2,\"229\":1,\"256\":1,\"258\":2,\"259\":1,\"286\":1,\"288\":2,\"289\":1,\"332\":1,\"334\":2,\"335\":1,\"378\":1,\"380\":2,\"381\":1,\"675\":1,\"723\":1,\"725\":2,\"726\":1,\"882\":1,\"946\":1,\"948\":2,\"949\":1,\"1105\":1,\"1282\":1,\"1475\":1,\"1587\":1,\"1678\":1,\"1855\":1,\"1983\":1,\"2074\":1,\"2202\":1,\"2293\":1}}],[\">\",{\"1\":{\"132\":1,\"137\":6,\"138\":3,\"155\":1,\"160\":6,\"161\":3,\"179\":1,\"184\":6,\"185\":3,\"215\":1,\"220\":6,\"221\":3,\"245\":1,\"250\":6,\"251\":3,\"275\":1,\"280\":6,\"281\":3,\"321\":1,\"326\":6,\"327\":3,\"367\":1,\"372\":6,\"373\":3,\"712\":1,\"717\":6,\"718\":3,\"935\":1,\"940\":6,\"941\":3}}],[\">=0\",{\"1\":{\"418\":1,\"569\":1,\"787\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\">=\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"$\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"822\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"840\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"8443\",{\"1\":{\"457\":1,\"525\":1,\"664\":1,\"743\":1,\"871\":1,\"966\":1,\"1094\":1,\"1127\":1,\"1271\":1,\"1320\":1,\"1464\":1,\"1507\":1,\"1667\":1,\"1716\":1,\"1844\":1,\"1903\":1,\"2063\":1,\"2122\":1,\"2282\":1}}],[\"8080\",{\"1\":{\"437\":1,\"439\":1,\"443\":1,\"491\":1,\"493\":1,\"511\":1,\"588\":1,\"590\":1,\"645\":1,\"647\":1,\"650\":1,\"729\":1,\"810\":1,\"812\":1,\"852\":1,\"854\":1,\"857\":1,\"952\":1,\"1033\":1,\"1035\":1,\"1075\":1,\"1077\":1,\"1080\":1,\"1113\":1,\"1194\":1,\"1196\":1,\"1252\":1,\"1254\":1,\"1257\":1,\"1306\":1,\"1387\":1,\"1389\":1,\"1445\":1,\"1447\":1,\"1450\":1,\"1493\":1,\"1581\":1,\"1583\":1,\"1648\":1,\"1650\":1,\"1653\":1,\"1702\":1,\"1783\":1,\"1785\":1,\"1825\":1,\"1827\":1,\"1830\":1,\"1889\":1,\"1977\":1,\"1979\":1,\"2044\":1,\"2046\":1,\"2049\":1,\"2108\":1,\"2196\":1,\"2198\":1,\"2263\":1,\"2265\":1,\"2268\":1}}],[\"802\",{\"1\":{\"74\":1,\"77\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"8\",{\"1\":{\"88\":1,\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"9\",{\"0\":{\"122\":1,\"143\":1,\"147\":1,\"166\":1,\"190\":1,\"197\":1,\"201\":1,\"226\":1,\"233\":1,\"256\":1,\"263\":1,\"286\":1,\"309\":1,\"332\":1,\"339\":1,\"378\":1,\"700\":1,\"723\":1,\"907\":1,\"946\":1},\"1\":{\"85\":1,\"105\":3,\"107\":3,\"109\":3,\"111\":3,\"113\":3,\"115\":3,\"117\":3,\"121\":1,\"123\":3,\"129\":2,\"142\":1,\"143\":4,\"146\":1,\"152\":2,\"165\":1,\"166\":4,\"167\":2,\"170\":3,\"176\":2,\"189\":1,\"190\":4,\"191\":2,\"196\":1,\"200\":1,\"202\":3,\"212\":1,\"225\":1,\"226\":8,\"227\":2,\"232\":1,\"242\":1,\"255\":1,\"256\":8,\"262\":1,\"272\":1,\"285\":1,\"286\":8,\"308\":1,\"318\":1,\"331\":1,\"332\":8,\"338\":1,\"364\":1,\"377\":1,\"378\":8,\"610\":2,\"613\":2,\"699\":1,\"709\":1,\"722\":1,\"723\":8,\"817\":2,\"820\":2,\"906\":1,\"932\":1,\"945\":1,\"946\":8,\"1040\":2,\"1043\":2,\"1217\":2,\"1220\":2,\"1410\":2,\"1413\":2,\"1482\":2,\"1485\":2,\"1609\":2,\"1612\":2,\"1790\":2,\"1793\":2,\"1878\":2,\"1881\":2,\"2005\":2,\"2008\":2,\"2097\":2,\"2100\":2,\"2224\":2,\"2227\":2}}],[\"y\",{\"1\":{\"804\":1,\"808\":1,\"1027\":1,\"1031\":1,\"1188\":1,\"1192\":1,\"1381\":1,\"1385\":1,\"1571\":1,\"1575\":1,\"1777\":1,\"1781\":1,\"1967\":1,\"1971\":1,\"2186\":1,\"2190\":1}}],[\"yaml\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"489\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"610\":1,\"643\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"817\":1,\"850\":1,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1040\":1,\"1073\":1,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1217\":1,\"1250\":1,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1410\":1,\"1443\":1,\"1445\":1,\"1482\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1578\":1,\"1581\":1,\"1609\":1,\"1645\":1,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1790\":1,\"1823\":1,\"1825\":1,\"1878\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1974\":1,\"1977\":1,\"2005\":1,\"2041\":1,\"2044\":1,\"2097\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2193\":1,\"2196\":1,\"2224\":1,\"2260\":1,\"2263\":1}}],[\"yml\",{\"1\":{\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"167\":1,\"168\":1,\"169\":1,\"184\":2,\"185\":2,\"191\":1,\"192\":1,\"193\":1,\"220\":2,\"221\":2,\"227\":1,\"228\":1,\"229\":1,\"250\":2,\"251\":2,\"257\":1,\"258\":1,\"259\":1,\"280\":2,\"281\":2,\"287\":1,\"288\":1,\"289\":1,\"326\":2,\"327\":2,\"333\":1,\"334\":1,\"335\":1,\"372\":2,\"373\":2,\"379\":1,\"380\":1,\"381\":1,\"717\":2,\"718\":2,\"724\":1,\"725\":1,\"726\":1,\"931\":2,\"940\":2,\"941\":2,\"947\":1,\"948\":1,\"949\":1}}],[\"yes\",{\"1\":{\"385\":1,\"387\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"406\":1,\"408\":1,\"409\":1,\"442\":1,\"443\":1,\"444\":1,\"458\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"472\":1,\"476\":1,\"478\":1,\"480\":1,\"482\":1,\"485\":1,\"487\":1,\"489\":1,\"498\":1,\"499\":1,\"504\":1,\"507\":1,\"508\":1,\"510\":1,\"511\":1,\"512\":1,\"526\":1,\"531\":1,\"532\":1,\"533\":1,\"536\":1,\"538\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"557\":1,\"559\":1,\"560\":1,\"595\":1,\"596\":1,\"601\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"625\":1,\"629\":1,\"631\":1,\"633\":1,\"635\":1,\"638\":1,\"640\":1,\"641\":1,\"643\":1,\"649\":1,\"650\":1,\"651\":1,\"665\":1,\"670\":1,\"671\":1,\"672\":1,\"728\":1,\"729\":1,\"730\":1,\"744\":1,\"749\":1,\"750\":1,\"751\":1,\"754\":1,\"756\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"776\":1,\"778\":1,\"827\":1,\"828\":1,\"832\":1,\"836\":1,\"838\":1,\"840\":1,\"842\":1,\"845\":1,\"847\":1,\"848\":1,\"856\":1,\"857\":1,\"858\":1,\"872\":1,\"877\":1,\"878\":1,\"879\":1,\"909\":1,\"910\":1,\"916\":1,\"919\":1,\"920\":1,\"951\":1,\"952\":1,\"953\":1,\"967\":1,\"972\":1,\"973\":1,\"974\":1,\"977\":1,\"979\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"999\":1,\"1001\":1,\"1050\":1,\"1051\":1,\"1055\":1,\"1059\":1,\"1061\":1,\"1063\":1,\"1065\":1,\"1068\":1,\"1070\":1,\"1071\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1095\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1128\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1138\":1,\"1140\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1160\":1,\"1162\":1,\"1201\":1,\"1202\":1,\"1208\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1232\":1,\"1236\":1,\"1238\":1,\"1240\":1,\"1242\":1,\"1245\":1,\"1247\":1,\"1248\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1272\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1289\":1,\"1290\":1,\"1296\":1,\"1299\":1,\"1300\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1321\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1331\":1,\"1333\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1353\":1,\"1355\":1,\"1394\":1,\"1395\":1,\"1401\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1425\":1,\"1429\":1,\"1431\":1,\"1433\":1,\"1435\":1,\"1438\":1,\"1440\":1,\"1441\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1465\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1508\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1518\":1,\"1520\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1543\":1,\"1545\":1,\"1593\":1,\"1594\":1,\"1600\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1624\":1,\"1628\":1,\"1630\":1,\"1632\":1,\"1634\":1,\"1640\":1,\"1642\":1,\"1643\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1668\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1685\":1,\"1686\":1,\"1692\":1,\"1695\":1,\"1696\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1717\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1727\":1,\"1729\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1749\":1,\"1751\":1,\"1800\":1,\"1801\":1,\"1805\":1,\"1809\":1,\"1811\":1,\"1813\":1,\"1815\":1,\"1818\":1,\"1820\":1,\"1821\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1845\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1862\":1,\"1863\":1,\"1869\":1,\"1872\":1,\"1873\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1904\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1914\":1,\"1916\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1939\":1,\"1941\":1,\"1989\":1,\"1990\":1,\"1996\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2020\":1,\"2024\":1,\"2026\":1,\"2028\":1,\"2030\":1,\"2036\":1,\"2038\":1,\"2039\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2064\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2081\":1,\"2082\":1,\"2088\":1,\"2091\":1,\"2092\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2123\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2133\":1,\"2135\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2158\":1,\"2160\":1,\"2208\":1,\"2209\":1,\"2215\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2239\":1,\"2243\":1,\"2245\":1,\"2247\":1,\"2249\":1,\"2255\":1,\"2257\":1,\"2258\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2283\":1,\"2288\":1,\"2289\":1,\"2290\":1,\"2300\":1,\"2301\":1,\"2307\":1,\"2310\":1,\"2311\":1}}],[\"yet\",{\"1\":{\"89\":1,\"127\":2,\"150\":2,\"174\":2,\"206\":2,\"236\":2,\"266\":2,\"300\":1,\"303\":1,\"312\":2,\"350\":1,\"353\":1,\"358\":2,\"691\":1,\"694\":1,\"703\":2,\"898\":1,\"901\":1,\"926\":2}}],[\"years\",{\"1\":{\"81\":1}}],[\"you´re\",{\"1\":{\"8\":1}}],[\"you\",{\"0\":{\"83\":1,\"84\":1},\"1\":{\"6\":1,\"7\":2,\"8\":1,\"27\":4,\"28\":1,\"50\":2,\"56\":1,\"57\":2,\"61\":1,\"66\":1,\"83\":1,\"84\":1,\"95\":3,\"99\":5,\"100\":1,\"102\":3,\"125\":2,\"126\":3,\"128\":7,\"129\":3,\"133\":1,\"137\":5,\"138\":2,\"139\":6,\"140\":3,\"143\":1,\"148\":2,\"149\":3,\"151\":7,\"152\":3,\"156\":1,\"160\":3,\"161\":2,\"162\":6,\"163\":3,\"166\":1,\"167\":1,\"172\":2,\"173\":3,\"175\":7,\"176\":3,\"180\":1,\"184\":3,\"185\":2,\"186\":6,\"187\":3,\"190\":1,\"191\":1,\"192\":2,\"204\":1,\"205\":3,\"207\":7,\"208\":1,\"212\":2,\"216\":1,\"220\":3,\"221\":2,\"222\":6,\"223\":3,\"226\":7,\"227\":1,\"234\":1,\"235\":3,\"237\":6,\"238\":1,\"242\":2,\"246\":1,\"250\":3,\"251\":2,\"252\":6,\"253\":3,\"256\":7,\"264\":1,\"265\":3,\"267\":6,\"268\":1,\"272\":2,\"276\":1,\"280\":3,\"281\":2,\"282\":6,\"283\":3,\"286\":7,\"293\":1,\"294\":1,\"297\":1,\"299\":2,\"300\":3,\"303\":7,\"304\":3,\"305\":9,\"306\":1,\"310\":1,\"311\":3,\"313\":6,\"314\":1,\"318\":2,\"322\":1,\"326\":3,\"327\":2,\"328\":6,\"329\":3,\"332\":7,\"336\":1,\"343\":1,\"344\":1,\"347\":1,\"349\":2,\"350\":3,\"353\":7,\"354\":3,\"355\":9,\"356\":1,\"357\":3,\"359\":6,\"360\":1,\"364\":2,\"368\":1,\"372\":3,\"373\":2,\"374\":6,\"375\":3,\"378\":7,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"684\":1,\"685\":1,\"688\":1,\"690\":2,\"691\":3,\"694\":7,\"695\":3,\"696\":9,\"697\":1,\"701\":1,\"702\":3,\"704\":6,\"705\":1,\"709\":2,\"713\":1,\"717\":3,\"718\":2,\"719\":6,\"720\":3,\"723\":7,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"891\":1,\"892\":1,\"895\":1,\"897\":2,\"898\":3,\"901\":7,\"902\":3,\"903\":9,\"904\":1,\"924\":1,\"925\":3,\"927\":6,\"928\":1,\"929\":1,\"932\":2,\"936\":1,\"940\":3,\"941\":2,\"942\":6,\"943\":3,\"946\":7,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"yourself\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"237\":1,\"252\":1,\"267\":1,\"282\":1,\"313\":1,\"328\":1,\"359\":1,\"374\":1,\"704\":1,\"719\":1,\"927\":1,\"942\":1}}],[\"your\",{\"0\":{\"2\":1,\"8\":1,\"20\":1,\"28\":1,\"51\":1},\"1\":{\"4\":1,\"8\":1,\"27\":6,\"68\":1,\"70\":2,\"84\":1,\"90\":1,\"100\":3,\"126\":6,\"127\":3,\"128\":2,\"129\":1,\"133\":2,\"134\":1,\"137\":8,\"138\":5,\"139\":2,\"140\":1,\"143\":5,\"149\":6,\"150\":3,\"151\":2,\"152\":1,\"156\":2,\"157\":1,\"160\":6,\"161\":5,\"162\":2,\"163\":1,\"166\":5,\"169\":4,\"173\":6,\"174\":3,\"175\":2,\"176\":1,\"180\":2,\"181\":1,\"184\":6,\"185\":5,\"186\":2,\"187\":1,\"190\":5,\"193\":4,\"205\":5,\"206\":3,\"207\":2,\"212\":1,\"216\":2,\"217\":1,\"220\":6,\"221\":5,\"222\":2,\"223\":1,\"226\":14,\"229\":4,\"235\":3,\"236\":3,\"237\":2,\"242\":1,\"246\":2,\"247\":1,\"250\":6,\"251\":4,\"252\":2,\"253\":1,\"256\":14,\"259\":4,\"265\":3,\"266\":3,\"267\":2,\"272\":1,\"276\":2,\"277\":1,\"280\":6,\"281\":4,\"282\":2,\"283\":1,\"286\":14,\"289\":4,\"290\":1,\"291\":1,\"293\":3,\"297\":1,\"300\":3,\"303\":4,\"304\":1,\"305\":12,\"311\":3,\"312\":3,\"313\":2,\"318\":1,\"322\":2,\"323\":1,\"326\":6,\"327\":4,\"328\":2,\"329\":1,\"332\":14,\"335\":4,\"340\":1,\"341\":1,\"343\":3,\"347\":1,\"350\":3,\"353\":4,\"354\":1,\"355\":12,\"357\":3,\"358\":3,\"359\":2,\"364\":1,\"368\":2,\"369\":1,\"372\":6,\"373\":4,\"374\":2,\"375\":1,\"378\":14,\"381\":4,\"432\":1,\"499\":1,\"583\":1,\"596\":1,\"681\":1,\"682\":1,\"684\":3,\"688\":1,\"691\":3,\"694\":4,\"695\":1,\"696\":12,\"702\":3,\"703\":3,\"704\":2,\"709\":1,\"713\":2,\"714\":1,\"717\":6,\"718\":4,\"719\":2,\"720\":1,\"723\":14,\"726\":4,\"804\":1,\"888\":1,\"889\":1,\"891\":3,\"895\":1,\"898\":3,\"901\":4,\"902\":1,\"903\":12,\"910\":1,\"925\":3,\"926\":3,\"927\":2,\"931\":3,\"932\":1,\"936\":2,\"937\":1,\"940\":6,\"941\":4,\"942\":2,\"943\":1,\"946\":14,\"949\":4,\"1027\":1,\"1188\":1,\"1202\":1,\"1290\":1,\"1381\":1,\"1395\":1,\"1571\":1,\"1594\":1,\"1686\":1,\"1777\":1,\"1863\":1,\"1967\":1,\"1990\":1,\"2082\":1,\"2186\":1,\"2209\":1,\"2301\":1}}],[\"​\",{\"1\":{\"62\":1}}],[\"72\",{\"1\":{\"39\":1}}],[\"6\",{\"1\":{\"929\":2}}],[\"60\",{\"1\":{\"502\":1,\"503\":1,\"599\":1,\"600\":1,\"913\":1,\"914\":1,\"1205\":1,\"1206\":1,\"1293\":1,\"1294\":1,\"1398\":1,\"1399\":1,\"1597\":1,\"1598\":1,\"1689\":1,\"1690\":1,\"1866\":1,\"1867\":1,\"1993\":1,\"1994\":1,\"2085\":1,\"2086\":1,\"2212\":1,\"2213\":1,\"2304\":1,\"2305\":1}}],[\"60000\",{\"1\":{\"401\":1,\"404\":1,\"552\":1,\"555\":1,\"771\":1,\"774\":1,\"994\":1,\"997\":1,\"1155\":1,\"1158\":1,\"1348\":1,\"1351\":1,\"1538\":1,\"1541\":1,\"1744\":1,\"1747\":1,\"1934\":1,\"1937\":1,\"2153\":1,\"2156\":1}}],[\"68\",{\"1\":{\"39\":1}}],[\"678\",{\"1\":{\"39\":1}}],[\"674\",{\"1\":{\"39\":1}}],[\"465\",{\"1\":{\"421\":1,\"572\":1,\"790\":1,\"1013\":1,\"1174\":1,\"1367\":1,\"1557\":1,\"1763\":1,\"1953\":1,\"2172\":1}}],[\"440\",{\"1\":{\"137\":7,\"138\":2,\"160\":7,\"161\":2,\"184\":7,\"185\":2,\"220\":7,\"221\":2,\"250\":7,\"251\":2,\"280\":7,\"281\":2,\"326\":7,\"327\":2,\"372\":7,\"373\":2,\"717\":7,\"718\":2,\"931\":2,\"940\":7,\"941\":2}}],[\"443\",{\"1\":{\"63\":1,\"134\":5,\"137\":2,\"138\":1,\"157\":5,\"160\":2,\"161\":1,\"181\":5,\"184\":2,\"185\":1,\"217\":5,\"220\":2,\"221\":1,\"247\":5,\"250\":2,\"251\":1,\"277\":5,\"280\":2,\"281\":1,\"323\":5,\"326\":2,\"327\":1,\"369\":5,\"372\":2,\"373\":1,\"499\":2,\"596\":2,\"714\":5,\"717\":2,\"718\":1,\"910\":2,\"937\":5,\"940\":2,\"941\":1,\"1202\":2,\"1290\":2,\"1395\":2,\"1594\":2,\"1686\":2,\"1863\":2,\"1990\":2,\"2082\":2,\"2209\":2,\"2301\":2}}],[\"48\",{\"1\":{\"100\":1}}],[\"404\",{\"1\":{\"2315\":1}}],[\"40\",{\"1\":{\"88\":1,\"803\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1}}],[\"4\",{\"0\":{\"123\":1,\"333\":1,\"364\":1},\"1\":{\"62\":1,\"117\":1,\"123\":1,\"131\":4,\"154\":4,\"178\":4,\"214\":4,\"244\":4,\"274\":4,\"320\":4,\"333\":1,\"334\":2,\"335\":1,\"366\":4,\"372\":2,\"373\":2,\"377\":1,\"379\":1,\"380\":4,\"381\":7,\"418\":1,\"569\":1,\"711\":4,\"787\":1,\"801\":1,\"934\":4,\"1010\":1,\"1024\":1,\"1171\":1,\"1185\":1,\"1364\":1,\"1378\":1,\"1554\":1,\"1568\":1,\"1760\":1,\"1774\":1,\"1858\":1,\"1950\":1,\"1964\":1,\"2169\":1,\"2183\":1}}],[\"49\",{\"1\":{\"39\":1}}],[\"41\",{\"1\":{\"39\":1}}],[\"über\",{\"1\":{\"37\":1}}],[\"x509v3\",{\"1\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"xml\",{\"1\":{\"37\":1,\"58\":1,\"59\":1,\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"x\",{\"0\":{\"122\":1,\"143\":1,\"147\":1,\"166\":1,\"167\":1,\"190\":1,\"197\":1,\"201\":1,\"226\":1,\"233\":1,\"256\":1,\"263\":1,\"286\":1,\"309\":1,\"332\":1,\"339\":1,\"378\":1,\"700\":1,\"723\":1,\"907\":1,\"946\":1},\"1\":{\"35\":2,\"74\":1,\"85\":1,\"105\":3,\"107\":5,\"108\":1,\"109\":5,\"110\":1,\"111\":5,\"112\":1,\"113\":4,\"114\":1,\"115\":4,\"116\":1,\"117\":4,\"118\":1,\"121\":1,\"123\":4,\"124\":1,\"129\":2,\"142\":1,\"143\":4,\"146\":1,\"152\":2,\"165\":1,\"166\":4,\"167\":2,\"170\":4,\"171\":1,\"176\":2,\"189\":1,\"190\":4,\"191\":2,\"196\":1,\"200\":1,\"202\":4,\"203\":1,\"212\":1,\"225\":1,\"226\":7,\"227\":2,\"232\":1,\"242\":1,\"255\":1,\"256\":7,\"262\":1,\"272\":1,\"285\":1,\"286\":7,\"308\":1,\"318\":1,\"331\":1,\"332\":7,\"338\":1,\"364\":1,\"377\":1,\"378\":7,\"444\":1,\"512\":1,\"610\":1,\"613\":1,\"618\":1,\"651\":1,\"674\":1,\"699\":1,\"709\":1,\"722\":1,\"723\":7,\"730\":1,\"817\":1,\"820\":1,\"825\":1,\"858\":1,\"881\":1,\"906\":1,\"930\":1,\"932\":1,\"945\":1,\"946\":7,\"953\":1,\"1040\":1,\"1043\":1,\"1048\":1,\"1081\":1,\"1104\":1,\"1114\":1,\"1217\":1,\"1220\":1,\"1225\":1,\"1258\":1,\"1281\":1,\"1307\":1,\"1410\":1,\"1413\":1,\"1418\":1,\"1451\":1,\"1474\":1,\"1482\":1,\"1485\":1,\"1490\":1,\"1494\":1,\"1586\":1,\"1609\":1,\"1612\":1,\"1617\":1,\"1654\":1,\"1677\":1,\"1703\":1,\"1790\":1,\"1793\":1,\"1798\":1,\"1831\":1,\"1854\":1,\"1878\":1,\"1881\":1,\"1886\":1,\"1890\":1,\"1982\":1,\"2005\":1,\"2008\":1,\"2013\":1,\"2050\":1,\"2073\":1,\"2097\":1,\"2100\":1,\"2105\":1,\"2109\":1,\"2201\":1,\"2224\":1,\"2227\":1,\"2232\":1,\"2269\":1,\"2292\":1}}],[\"5000\",{\"1\":{\"403\":1,\"411\":1,\"434\":1,\"454\":1,\"522\":1,\"554\":1,\"562\":1,\"585\":1,\"661\":1,\"740\":1,\"773\":1,\"780\":1,\"806\":1,\"868\":1,\"963\":1,\"996\":1,\"1003\":1,\"1029\":1,\"1091\":1,\"1124\":1,\"1157\":1,\"1164\":1,\"1190\":1,\"1268\":1,\"1317\":1,\"1350\":1,\"1357\":1,\"1383\":1,\"1461\":1,\"1504\":1,\"1540\":1,\"1547\":1,\"1573\":1,\"1664\":1,\"1713\":1,\"1746\":1,\"1753\":1,\"1779\":1,\"1841\":1,\"1900\":1,\"1936\":1,\"1943\":1,\"1969\":1,\"2060\":1,\"2119\":1,\"2155\":1,\"2162\":1,\"2188\":1,\"2279\":1}}],[\"509\",{\"1\":{\"74\":1,\"610\":1,\"613\":1,\"618\":1,\"674\":1,\"817\":1,\"820\":1,\"825\":1,\"881\":1,\"1040\":1,\"1043\":1,\"1048\":1,\"1104\":1,\"1217\":1,\"1220\":1,\"1225\":1,\"1281\":1,\"1410\":1,\"1413\":1,\"1418\":1,\"1474\":1,\"1482\":1,\"1485\":1,\"1490\":1,\"1586\":1,\"1609\":1,\"1612\":1,\"1617\":1,\"1677\":1,\"1790\":1,\"1793\":1,\"1798\":1,\"1854\":1,\"1878\":1,\"1881\":1,\"1886\":1,\"1982\":1,\"2005\":1,\"2008\":1,\"2013\":1,\"2073\":1,\"2097\":1,\"2100\":1,\"2105\":1,\"2201\":1,\"2224\":1,\"2227\":1,\"2232\":1,\"2292\":1}}],[\"512\",{\"1\":{\"137\":2,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":2,\"612\":1,\"641\":1,\"717\":1,\"817\":2,\"819\":1,\"848\":1,\"940\":1,\"1040\":2,\"1042\":1,\"1071\":1,\"1217\":2,\"1219\":1,\"1248\":1,\"1410\":2,\"1412\":1,\"1441\":1,\"1482\":2,\"1484\":1,\"1609\":2,\"1611\":1,\"1643\":1,\"1790\":2,\"1792\":1,\"1821\":1,\"1878\":2,\"1880\":1,\"2005\":2,\"2007\":1,\"2039\":1,\"2097\":2,\"2099\":1,\"2224\":2,\"2226\":1,\"2258\":1}}],[\"5\",{\"0\":{\"117\":1,\"170\":1,\"202\":1,\"318\":1,\"709\":1,\"724\":1,\"932\":1,\"947\":1},\"1\":{\"35\":1,\"62\":1,\"117\":1,\"170\":2,\"192\":1,\"193\":1,\"202\":2,\"326\":2,\"327\":2,\"331\":1,\"333\":1,\"334\":4,\"335\":7,\"717\":2,\"718\":2,\"722\":1,\"724\":2,\"725\":6,\"726\":8,\"940\":2,\"941\":2,\"945\":1,\"947\":2,\"948\":6,\"949\":8,\"1589\":1,\"1681\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"änderungen\",{\"1\":{\"29\":1}}],[\"jvm\",{\"1\":{\"677\":1,\"884\":1,\"1107\":1,\"1284\":1,\"1477\":1,\"1588\":1,\"1680\":1,\"1857\":1,\"1984\":1,\"2076\":1,\"2203\":1,\"2295\":1}}],[\"jdk\",{\"1\":{\"297\":1,\"347\":1,\"688\":1,\"895\":1}}],[\"jdbc\",{\"1\":{\"63\":1,\"387\":1,\"478\":1,\"538\":1,\"631\":1,\"756\":1,\"838\":1,\"979\":1,\"1061\":1,\"1140\":1,\"1238\":1,\"1333\":1,\"1431\":1,\"1520\":1,\"1630\":1,\"1729\":1,\"1811\":1,\"1916\":1,\"2026\":1,\"2135\":1,\"2245\":1}}],[\"just\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"304\":1,\"332\":1,\"354\":1,\"378\":1,\"695\":1,\"723\":1,\"902\":1,\"946\":1}}],[\"jetty\",{\"1\":{\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"726\":2,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"949\":2,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1}}],[\"jedoch\",{\"1\":{\"30\":1}}],[\"jar\",{\"1\":{\"66\":1,\"192\":1,\"193\":3,\"929\":1,\"931\":9}}],[\"java\",{\"0\":{\"297\":1,\"347\":1,\"688\":1,\"895\":1},\"1\":{\"54\":1,\"66\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"293\":2,\"297\":1,\"326\":1,\"327\":1,\"343\":2,\"347\":1,\"372\":1,\"373\":1,\"684\":2,\"688\":1,\"717\":1,\"718\":1,\"891\":2,\"895\":1,\"940\":1,\"941\":1}}],[\"json\",{\"1\":{\"58\":1,\"59\":1}}],[\"j\",{\"1\":{\"39\":2}}],[\"jxx2\",{\"1\":{\"29\":1}}],[\"jxh4\",{\"1\":{\"29\":1}}],[\"jobs\",{\"1\":{\"803\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1}}],[\"job\",{\"1\":{\"801\":1,\"802\":1,\"803\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"2183\":1,\"2184\":1,\"2185\":1}}],[\"journey\",{\"1\":{\"27\":2}}],[\"join\",{\"1\":{\"5\":1,\"27\":1,\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"quick\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"quickly\",{\"1\":{\"62\":1}}],[\"queuesize\",{\"0\":{\"803\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1},\"1\":{\"803\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1}}],[\"queue\",{\"1\":{\"802\":1,\"803\":2,\"1025\":1,\"1026\":2,\"1186\":1,\"1187\":2,\"1379\":1,\"1380\":2,\"1569\":1,\"1570\":2,\"1775\":1,\"1776\":2,\"1965\":1,\"1966\":2,\"2184\":1,\"2185\":2}}],[\"questionnaire\",{\"0\":{\"407\":1,\"558\":1,\"777\":1,\"1000\":1,\"1161\":1,\"1354\":1,\"1544\":1,\"1750\":1,\"1940\":1,\"2159\":1},\"1\":{\"61\":1,\"407\":2,\"558\":2,\"777\":2,\"1000\":2,\"1161\":2,\"1354\":2,\"1544\":2,\"1750\":2,\"1940\":2,\"2159\":2}}],[\"questionnaireresponse\",{\"1\":{\"54\":2,\"61\":1,\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"questions\",{\"0\":{\"102\":1},\"1\":{\"27\":1,\"89\":1,\"102\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"305\":1,\"328\":1,\"355\":1,\"374\":1,\"696\":1,\"719\":1,\"903\":1,\"942\":1}}],[\"query\",{\"1\":{\"49\":1,\"88\":2,\"89\":1,\"90\":2}}],[\"queries\",{\"1\":{\"39\":2,\"42\":1,\"62\":1,\"66\":1,\"88\":1,\"89\":1,\"90\":2,\"1528\":1,\"1638\":1,\"1924\":1,\"2034\":1,\"2143\":1,\"2253\":1}}],[\"quality\",{\"1\":{\"10\":1,\"24\":1,\"301\":2,\"305\":1,\"351\":2,\"355\":1,\"692\":2,\"696\":1,\"899\":2,\"903\":1}}],[\"zxvf\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"zertifikatprofile\",{\"1\":{\"74\":1}}],[\"zone\",{\"1\":{\"52\":1}}],[\"z\",{\"1\":{\"32\":2}}],[\"ziel\",{\"1\":{\"29\":1}}],[\"zilske\",{\"1\":{\"18\":1,\"39\":3}}],[\"zugriff\",{\"1\":{\"31\":1}}],[\"zum\",{\"1\":{\"31\":1,\"32\":1,\"37\":1}}],[\"zur\",{\"1\":{\"31\":1,\"32\":2}}],[\"zu\",{\"1\":{\"29\":4,\"31\":1,\"32\":1}}],[\"zusammenfassung\",{\"1\":{\"29\":1}}],[\"zulip\",{\"1\":{\"6\":1,\"37\":1,\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"305\":2,\"313\":1,\"355\":2,\"359\":1,\"696\":2,\"704\":1,\"903\":2,\"927\":1}}],[\"klicken\",{\"1\":{\"103\":1}}],[\"kindly\",{\"1\":{\"98\":1,\"99\":1}}],[\"kiel\",{\"1\":{\"18\":1}}],[\"knowledge\",{\"1\":{\"57\":1,\"84\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"known\",{\"1\":{\"1\":1}}],[\"k\",{\"1\":{\"39\":1}}],[\"kussel\",{\"1\":{\"39\":1}}],[\"kurscheidt\",{\"1\":{\"18\":1,\"39\":3}}],[\"kann\",{\"1\":{\"32\":3}}],[\"keep\",{\"1\":{\"95\":1,\"100\":1}}],[\"keiner\",{\"1\":{\"30\":1}}],[\"keycloak\",{\"1\":{\"457\":1,\"525\":1,\"664\":1,\"678\":5,\"743\":1,\"871\":1,\"885\":5,\"966\":1,\"1094\":1,\"1108\":5,\"1127\":1,\"1271\":1,\"1285\":5,\"1320\":1,\"1464\":1,\"1478\":5,\"1507\":1,\"1589\":5,\"1667\":1,\"1681\":5,\"1716\":1,\"1844\":1,\"1858\":5,\"1903\":1,\"1985\":5,\"2063\":1,\"2077\":5,\"2122\":1,\"2204\":5,\"2282\":1,\"2296\":5}}],[\"keys\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"keyring\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"keyrings\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"key\",{\"0\":{\"22\":1,\"398\":1,\"399\":2,\"414\":1,\"415\":2,\"452\":1,\"453\":2,\"461\":1,\"462\":2,\"468\":1,\"469\":2,\"508\":1,\"520\":1,\"521\":2,\"529\":1,\"530\":2,\"549\":1,\"550\":2,\"565\":1,\"566\":2,\"605\":1,\"621\":1,\"622\":2,\"659\":1,\"660\":2,\"668\":1,\"669\":2,\"738\":1,\"739\":2,\"747\":1,\"748\":2,\"768\":1,\"769\":2,\"783\":1,\"784\":2,\"828\":1,\"829\":2,\"866\":1,\"867\":2,\"875\":1,\"876\":2,\"920\":1,\"961\":1,\"962\":2,\"970\":1,\"971\":2,\"991\":1,\"992\":2,\"1006\":1,\"1007\":2,\"1051\":1,\"1052\":2,\"1089\":1,\"1090\":2,\"1098\":1,\"1099\":2,\"1122\":1,\"1123\":2,\"1131\":1,\"1132\":2,\"1152\":1,\"1153\":2,\"1167\":1,\"1168\":2,\"1212\":1,\"1228\":1,\"1229\":2,\"1266\":1,\"1267\":2,\"1275\":1,\"1276\":2,\"1300\":1,\"1315\":1,\"1316\":2,\"1324\":1,\"1325\":2,\"1345\":1,\"1346\":2,\"1360\":1,\"1361\":2,\"1405\":1,\"1421\":1,\"1422\":2,\"1459\":1,\"1460\":2,\"1468\":1,\"1469\":2,\"1502\":1,\"1503\":2,\"1511\":1,\"1512\":2,\"1535\":1,\"1536\":2,\"1550\":1,\"1551\":2,\"1604\":1,\"1620\":1,\"1621\":2,\"1662\":1,\"1663\":2,\"1671\":1,\"1672\":2,\"1696\":1,\"1711\":1,\"1712\":2,\"1720\":1,\"1721\":2,\"1741\":1,\"1742\":2,\"1756\":1,\"1757\":2,\"1801\":1,\"1802\":2,\"1839\":1,\"1840\":2,\"1848\":1,\"1849\":2,\"1873\":1,\"1898\":1,\"1899\":2,\"1907\":1,\"1908\":2,\"1931\":1,\"1932\":2,\"1946\":1,\"1947\":2,\"2000\":1,\"2016\":1,\"2017\":2,\"2058\":1,\"2059\":2,\"2067\":1,\"2068\":2,\"2092\":1,\"2117\":1,\"2118\":2,\"2126\":1,\"2127\":2,\"2150\":1,\"2151\":2,\"2165\":1,\"2166\":2,\"2219\":1,\"2235\":1,\"2236\":2,\"2277\":1,\"2278\":2,\"2286\":1,\"2287\":2,\"2311\":1},\"1\":{\"80\":1,\"81\":1,\"84\":1,\"133\":1,\"136\":7,\"137\":12,\"138\":10,\"156\":1,\"159\":7,\"160\":12,\"161\":10,\"180\":1,\"183\":7,\"184\":12,\"185\":10,\"216\":1,\"219\":7,\"220\":12,\"221\":10,\"246\":1,\"249\":7,\"250\":12,\"251\":10,\"276\":1,\"279\":7,\"280\":12,\"281\":10,\"322\":1,\"325\":7,\"326\":12,\"327\":10,\"368\":1,\"371\":7,\"372\":12,\"373\":10,\"398\":6,\"399\":4,\"414\":6,\"415\":4,\"425\":1,\"452\":6,\"453\":4,\"461\":2,\"462\":2,\"468\":6,\"469\":4,\"508\":2,\"520\":6,\"521\":4,\"529\":2,\"530\":2,\"549\":6,\"550\":4,\"565\":6,\"566\":4,\"576\":1,\"605\":2,\"621\":6,\"622\":4,\"659\":6,\"660\":4,\"668\":2,\"669\":2,\"713\":1,\"716\":7,\"717\":12,\"718\":10,\"738\":6,\"739\":4,\"747\":2,\"748\":2,\"768\":6,\"769\":4,\"783\":6,\"784\":4,\"794\":1,\"828\":6,\"829\":4,\"866\":6,\"867\":4,\"875\":2,\"876\":2,\"920\":2,\"936\":1,\"939\":7,\"940\":12,\"941\":10,\"961\":6,\"962\":4,\"970\":2,\"971\":2,\"991\":6,\"992\":4,\"1006\":6,\"1007\":4,\"1017\":1,\"1051\":6,\"1052\":4,\"1089\":6,\"1090\":4,\"1098\":2,\"1099\":2,\"1122\":6,\"1123\":4,\"1131\":2,\"1132\":2,\"1152\":6,\"1153\":4,\"1167\":6,\"1168\":4,\"1178\":1,\"1212\":2,\"1228\":6,\"1229\":4,\"1266\":6,\"1267\":4,\"1275\":2,\"1276\":2,\"1300\":2,\"1315\":6,\"1316\":4,\"1324\":2,\"1325\":2,\"1345\":6,\"1346\":4,\"1360\":6,\"1361\":4,\"1371\":1,\"1405\":2,\"1421\":6,\"1422\":4,\"1459\":6,\"1460\":4,\"1468\":2,\"1469\":2,\"1502\":6,\"1503\":4,\"1511\":2,\"1512\":2,\"1535\":6,\"1536\":4,\"1550\":6,\"1551\":4,\"1561\":1,\"1604\":2,\"1620\":6,\"1621\":4,\"1662\":6,\"1663\":4,\"1671\":2,\"1672\":2,\"1696\":2,\"1711\":6,\"1712\":4,\"1720\":2,\"1721\":2,\"1741\":6,\"1742\":4,\"1756\":6,\"1757\":4,\"1767\":1,\"1801\":6,\"1802\":4,\"1839\":6,\"1840\":4,\"1848\":2,\"1849\":2,\"1873\":2,\"1898\":6,\"1899\":4,\"1907\":2,\"1908\":2,\"1931\":6,\"1932\":4,\"1946\":6,\"1947\":4,\"1957\":1,\"2000\":2,\"2016\":6,\"2017\":4,\"2058\":6,\"2059\":4,\"2067\":2,\"2068\":2,\"2092\":2,\"2117\":6,\"2118\":4,\"2126\":2,\"2127\":2,\"2150\":6,\"2151\":4,\"2165\":6,\"2166\":4,\"2176\":1,\"2219\":2,\"2235\":6,\"2236\":4,\"2277\":6,\"2278\":4,\"2286\":2,\"2287\":2,\"2311\":2}}],[\"kds\",{\"1\":{\"29\":2,\"210\":1,\"240\":1,\"270\":1,\"316\":1,\"362\":1,\"707\":1}}],[\"können\",{\"1\":{\"29\":1}}],[\"kobylinski\",{\"1\":{\"39\":1}}],[\"kontext\",{\"1\":{\"31\":1,\"32\":1}}],[\"konferenz\",{\"1\":{\"29\":1}}],[\"komponenten\",{\"1\":{\"29\":2}}],[\"kommenden\",{\"1\":{\"29\":1}}],[\"|\",{\"0\":{\"13\":1,\"14\":1,\"15\":1},\"1\":{\"91\":1,\"132\":2,\"139\":2,\"155\":2,\"160\":1,\"162\":2,\"169\":2,\"179\":2,\"184\":1,\"186\":2,\"192\":1,\"193\":2,\"215\":2,\"220\":1,\"222\":2,\"229\":2,\"245\":2,\"250\":1,\"252\":2,\"259\":2,\"275\":2,\"280\":1,\"282\":2,\"289\":2,\"321\":2,\"326\":1,\"328\":2,\"335\":2,\"367\":2,\"372\":1,\"374\":2,\"381\":2,\"610\":3,\"618\":3,\"643\":1,\"712\":2,\"717\":1,\"719\":2,\"726\":2,\"817\":3,\"825\":3,\"935\":2,\"940\":1,\"942\":2,\"949\":2,\"1040\":3,\"1048\":3,\"1217\":3,\"1225\":3,\"1410\":3,\"1418\":3,\"1482\":3,\"1490\":3,\"1609\":3,\"1617\":3,\"1790\":3,\"1798\":3,\"1878\":3,\"1886\":3,\"2005\":3,\"2013\":3,\"2097\":3,\"2105\":3,\"2224\":3,\"2232\":3}}],[\"3drequested\",{\"1\":{\"412\":1,\"563\":1,\"781\":1,\"1004\":1,\"1165\":1,\"1358\":1,\"1548\":1,\"1754\":1,\"1944\":1,\"2163\":1}}],[\"3dcompleted\",{\"1\":{\"407\":1,\"558\":1,\"777\":1,\"1000\":1,\"1161\":1,\"1354\":1,\"1544\":1,\"1750\":1,\"1940\":1,\"2159\":1}}],[\"3fstatus\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"37\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"719\":2,\"942\":2}}],[\"36\",{\"1\":{\"91\":2}}],[\"32\",{\"1\":{\"39\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"3233\",{\"1\":{\"1\":1,\"39\":9}}],[\"310\",{\"1\":{\"39\":1}}],[\"30000\",{\"1\":{\"455\":1,\"523\":1,\"662\":1,\"741\":1,\"869\":1,\"964\":1,\"1092\":1,\"1125\":1,\"1269\":1,\"1318\":1,\"1462\":1,\"1505\":1,\"1665\":1,\"1714\":1,\"1842\":1,\"1901\":1,\"2061\":1,\"2120\":1,\"2280\":1}}],[\"302\",{\"1\":{\"39\":2}}],[\"30\",{\"1\":{\"29\":1,\"500\":1,\"501\":1,\"597\":1,\"598\":1,\"911\":1,\"912\":1,\"1203\":1,\"1204\":1,\"1291\":1,\"1292\":1,\"1396\":1,\"1397\":1,\"1595\":1,\"1596\":1,\"1687\":1,\"1688\":1,\"1864\":1,\"1865\":1,\"1991\":1,\"1992\":1,\"2083\":1,\"2084\":1,\"2210\":1,\"2211\":1,\"2302\":1,\"2303\":1}}],[\"3\",{\"0\":{\"111\":1,\"113\":1,\"115\":1,\"212\":1,\"242\":1,\"257\":1,\"272\":1,\"287\":1,\"379\":1},\"1\":{\"10\":1,\"62\":1,\"63\":1,\"68\":1,\"111\":1,\"113\":2,\"115\":2,\"123\":1,\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"220\":2,\"221\":2,\"225\":1,\"227\":1,\"228\":5,\"229\":8,\"250\":2,\"251\":2,\"255\":1,\"257\":2,\"258\":7,\"259\":9,\"280\":2,\"281\":2,\"285\":1,\"287\":2,\"288\":7,\"289\":9,\"334\":1,\"335\":1,\"379\":1,\"380\":3,\"381\":2,\"498\":1,\"595\":1,\"725\":1,\"726\":1,\"909\":1,\"930\":1,\"948\":1,\"949\":1,\"1108\":1,\"1201\":1,\"1285\":1,\"1289\":1,\"1394\":1,\"1478\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"uac\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"uuid2\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"uuid1\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"uri\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2}}],[\"url|code\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"url\",{\"0\":{\"387\":1,\"408\":1,\"439\":1,\"457\":1,\"478\":1,\"485\":1,\"493\":1,\"525\":1,\"538\":1,\"559\":1,\"590\":1,\"631\":1,\"638\":1,\"647\":1,\"664\":1,\"743\":1,\"756\":1,\"778\":1,\"812\":1,\"838\":1,\"845\":1,\"854\":1,\"871\":1,\"966\":1,\"979\":1,\"1001\":1,\"1035\":1,\"1061\":1,\"1068\":1,\"1077\":1,\"1094\":1,\"1127\":1,\"1140\":1,\"1162\":1,\"1196\":1,\"1238\":1,\"1245\":1,\"1254\":1,\"1271\":1,\"1320\":1,\"1333\":1,\"1355\":1,\"1389\":1,\"1431\":1,\"1438\":1,\"1447\":1,\"1464\":1,\"1507\":1,\"1520\":1,\"1545\":1,\"1577\":1,\"1583\":1,\"1630\":1,\"1640\":1,\"1650\":1,\"1667\":1,\"1716\":1,\"1729\":1,\"1751\":1,\"1785\":1,\"1811\":1,\"1818\":1,\"1827\":1,\"1844\":1,\"1903\":1,\"1916\":1,\"1941\":1,\"1973\":1,\"1979\":1,\"2026\":1,\"2036\":1,\"2046\":1,\"2063\":1,\"2122\":1,\"2135\":1,\"2160\":1,\"2192\":1,\"2198\":1,\"2245\":1,\"2255\":1,\"2265\":1,\"2282\":1},\"1\":{\"127\":1,\"137\":1,\"138\":1,\"150\":1,\"160\":1,\"161\":1,\"174\":1,\"184\":1,\"185\":1,\"206\":1,\"220\":1,\"221\":1,\"236\":1,\"250\":1,\"251\":1,\"266\":1,\"280\":1,\"281\":1,\"312\":1,\"326\":1,\"327\":1,\"358\":1,\"372\":1,\"373\":1,\"387\":1,\"408\":1,\"439\":2,\"445\":1,\"448\":1,\"457\":2,\"478\":1,\"485\":1,\"493\":2,\"513\":1,\"516\":1,\"525\":2,\"538\":1,\"559\":1,\"590\":2,\"631\":1,\"638\":1,\"647\":2,\"652\":1,\"655\":1,\"664\":2,\"675\":2,\"676\":1,\"678\":1,\"703\":1,\"717\":1,\"718\":1,\"731\":1,\"734\":1,\"743\":2,\"756\":1,\"778\":1,\"812\":2,\"838\":1,\"845\":1,\"854\":2,\"859\":1,\"862\":1,\"871\":2,\"882\":2,\"883\":1,\"885\":1,\"926\":1,\"940\":1,\"941\":1,\"954\":1,\"957\":1,\"966\":2,\"979\":1,\"1001\":1,\"1035\":2,\"1061\":1,\"1068\":1,\"1077\":2,\"1082\":1,\"1085\":1,\"1094\":2,\"1105\":2,\"1106\":1,\"1108\":1,\"1115\":1,\"1118\":1,\"1127\":2,\"1140\":1,\"1162\":1,\"1196\":2,\"1238\":1,\"1245\":1,\"1254\":2,\"1259\":1,\"1262\":1,\"1271\":2,\"1282\":2,\"1283\":1,\"1285\":1,\"1308\":1,\"1311\":1,\"1320\":2,\"1333\":1,\"1355\":1,\"1389\":2,\"1431\":1,\"1438\":1,\"1447\":2,\"1452\":1,\"1455\":1,\"1464\":2,\"1475\":2,\"1476\":1,\"1478\":1,\"1495\":1,\"1498\":1,\"1507\":2,\"1520\":1,\"1545\":1,\"1577\":1,\"1583\":2,\"1587\":2,\"1589\":1,\"1630\":1,\"1640\":1,\"1650\":2,\"1655\":1,\"1658\":1,\"1667\":2,\"1678\":2,\"1679\":1,\"1681\":1,\"1704\":1,\"1707\":1,\"1716\":2,\"1729\":1,\"1751\":1,\"1785\":2,\"1811\":1,\"1818\":1,\"1827\":2,\"1832\":1,\"1835\":1,\"1844\":2,\"1855\":2,\"1856\":1,\"1858\":1,\"1891\":1,\"1894\":1,\"1903\":2,\"1916\":1,\"1941\":1,\"1973\":1,\"1979\":2,\"1983\":2,\"1985\":1,\"2026\":1,\"2036\":1,\"2046\":2,\"2051\":1,\"2054\":1,\"2063\":2,\"2074\":2,\"2075\":1,\"2077\":1,\"2110\":1,\"2113\":1,\"2122\":2,\"2135\":1,\"2160\":1,\"2192\":1,\"2198\":2,\"2202\":2,\"2204\":1,\"2245\":1,\"2255\":1,\"2265\":2,\"2270\":1,\"2273\":1,\"2282\":2,\"2293\":2,\"2294\":1,\"2296\":1}}],[\"ubuntu\",{\"1\":{\"132\":2,\"137\":1,\"138\":1,\"155\":2,\"160\":1,\"161\":1,\"179\":2,\"184\":1,\"185\":1,\"215\":2,\"220\":1,\"221\":1,\"245\":2,\"250\":1,\"251\":1,\"275\":2,\"280\":1,\"281\":1,\"321\":2,\"326\":1,\"327\":1,\"367\":2,\"372\":1,\"373\":1,\"712\":2,\"717\":1,\"718\":1,\"935\":2,\"940\":1,\"941\":1}}],[\"uid\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"ui\",{\"0\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1},\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"192\":1,\"203\":1,\"1577\":1,\"1580\":3,\"1647\":3,\"1973\":1,\"1976\":3,\"2043\":3,\"2192\":1,\"2195\":3,\"2262\":3}}],[\"u\",{\"1\":{\"39\":1}}],[\"um\",{\"1\":{\"29\":1,\"103\":1}}],[\"uhr\",{\"1\":{\"29\":6,\"103\":1}}],[\"unlock\",{\"1\":{\"383\":2,\"474\":2,\"534\":2,\"627\":2,\"752\":2,\"834\":2,\"975\":2,\"1057\":2,\"1136\":2,\"1234\":2,\"1329\":2,\"1427\":2,\"1516\":2,\"1626\":2,\"1725\":2,\"1807\":2,\"1912\":2,\"2022\":2,\"2131\":2,\"2241\":2}}],[\"unless\",{\"1\":{\"143\":2,\"166\":2,\"190\":2}}],[\"uncomment\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"unclear\",{\"1\":{\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"303\":1,\"313\":1,\"329\":1,\"353\":1,\"359\":1,\"375\":1,\"694\":1,\"704\":1,\"720\":1,\"901\":1,\"927\":1,\"943\":1}}],[\"unpack\",{\"1\":{\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"184\":2,\"185\":1,\"220\":2,\"221\":1,\"250\":2,\"251\":1,\"280\":2,\"281\":1,\"326\":2,\"327\":1,\"372\":2,\"373\":1,\"717\":2,\"718\":1,\"940\":2,\"941\":1}}],[\"unencrypted\",{\"1\":{\"136\":1,\"159\":1,\"183\":1,\"219\":1,\"249\":1,\"279\":1,\"325\":1,\"371\":1,\"508\":1,\"605\":1,\"716\":1,\"920\":1,\"939\":1,\"1212\":1,\"1300\":1,\"1405\":1,\"1604\":1,\"1696\":1,\"1873\":1,\"2000\":1,\"2092\":1,\"2219\":1,\"2311\":1}}],[\"unused\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"until\",{\"1\":{\"99\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"410\":1,\"433\":1,\"470\":1,\"471\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"561\":1,\"584\":1,\"623\":1,\"624\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"779\":1,\"802\":1,\"805\":1,\"830\":1,\"831\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1002\":1,\"1025\":1,\"1028\":1,\"1053\":1,\"1054\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1163\":1,\"1186\":1,\"1189\":1,\"1230\":1,\"1231\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1356\":1,\"1379\":1,\"1382\":1,\"1423\":1,\"1424\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1546\":1,\"1569\":1,\"1572\":1,\"1622\":1,\"1623\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1752\":1,\"1775\":1,\"1778\":1,\"1803\":1,\"1804\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1942\":1,\"1965\":1,\"1968\":1,\"2018\":1,\"2019\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2161\":1,\"2184\":1,\"2187\":1,\"2237\":1,\"2238\":1}}],[\"unter\",{\"1\":{\"31\":1}}],[\"unserer\",{\"1\":{\"29\":2}}],[\"unserem\",{\"1\":{\"29\":1}}],[\"unified\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"129\":1,\"152\":1,\"171\":1,\"176\":1,\"203\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"932\":1}}],[\"uniform\",{\"1\":{\"91\":1}}],[\"unique\",{\"1\":{\"84\":1}}],[\"unit\",{\"1\":{\"62\":1}}],[\"units\",{\"1\":{\"59\":1}}],[\"uni\",{\"1\":{\"29\":1}}],[\"university\",{\"0\":{\"11\":2,\"13\":1,\"14\":1,\"15\":1,\"91\":1},\"1\":{\"10\":4,\"11\":1,\"13\":1,\"14\":1,\"15\":1,\"20\":1,\"26\":1,\"39\":1,\"62\":2,\"91\":3,\"94\":1,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"under\",{\"1\":{\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"932\":1}}],[\"underlying\",{\"1\":{\"89\":1}}],[\"understood\",{\"1\":{\"59\":1}}],[\"understanding\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"understand\",{\"1\":{\"53\":1,\"61\":2,\"66\":1,\"84\":2,\"97\":1}}],[\"und\",{\"1\":{\"29\":6,\"30\":1,\"31\":1,\"103\":1}}],[\"utilizes\",{\"1\":{\"21\":1}}],[\"upgrading\",{\"1\":{\"167\":1,\"191\":1,\"227\":2,\"257\":2,\"287\":2,\"333\":2,\"379\":2,\"724\":2,\"947\":2}}],[\"upgraded\",{\"1\":{\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"upgrade\",{\"0\":{\"122\":1,\"143\":1,\"147\":1,\"166\":1,\"167\":1,\"190\":1,\"191\":1,\"197\":1,\"201\":1,\"226\":1,\"227\":1,\"233\":1,\"256\":1,\"257\":1,\"263\":1,\"286\":1,\"287\":1,\"309\":1,\"332\":1,\"333\":1,\"339\":1,\"378\":1,\"379\":1,\"700\":1,\"723\":1,\"724\":1,\"907\":1,\"946\":1,\"947\":1},\"1\":{\"95\":1,\"105\":2,\"107\":3,\"109\":3,\"111\":3,\"113\":3,\"115\":3,\"117\":3,\"121\":1,\"122\":1,\"123\":3,\"142\":1,\"143\":3,\"146\":1,\"147\":1,\"165\":1,\"166\":3,\"167\":1,\"168\":3,\"169\":4,\"170\":3,\"189\":1,\"190\":3,\"191\":1,\"192\":3,\"193\":6,\"196\":1,\"197\":1,\"200\":1,\"201\":1,\"202\":3,\"225\":1,\"226\":1,\"227\":1,\"228\":3,\"229\":4,\"232\":1,\"233\":1,\"255\":1,\"256\":1,\"258\":3,\"259\":4,\"262\":1,\"263\":1,\"285\":1,\"286\":1,\"288\":3,\"289\":4,\"308\":1,\"309\":1,\"331\":1,\"332\":1,\"334\":3,\"335\":4,\"338\":1,\"339\":1,\"377\":1,\"378\":1,\"380\":3,\"381\":4,\"699\":1,\"700\":1,\"722\":1,\"723\":1,\"725\":3,\"726\":4,\"906\":1,\"907\":1,\"945\":1,\"946\":1,\"948\":3,\"949\":4}}],[\"updating\",{\"1\":{\"63\":1,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"305\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"355\":1,\"696\":1,\"697\":1,\"700\":1,\"903\":1,\"904\":1,\"907\":1}}],[\"updateallowlist|1\",{\"1\":{\"804\":1,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1}}],[\"updated\",{\"1\":{\"54\":1,\"929\":1}}],[\"update\",{\"1\":{\"34\":1,\"50\":1,\"119\":1,\"122\":1,\"126\":1,\"132\":2,\"143\":1,\"144\":1,\"147\":1,\"149\":1,\"155\":2,\"166\":1,\"173\":1,\"179\":2,\"190\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"205\":1,\"215\":2,\"226\":1,\"227\":1,\"230\":1,\"233\":1,\"235\":1,\"245\":2,\"256\":1,\"257\":1,\"260\":1,\"263\":1,\"265\":1,\"275\":2,\"286\":1,\"287\":1,\"306\":1,\"309\":1,\"311\":1,\"321\":2,\"332\":1,\"333\":1,\"336\":1,\"339\":1,\"357\":1,\"367\":2,\"378\":1,\"379\":1,\"616\":1,\"618\":2,\"697\":1,\"700\":1,\"702\":1,\"712\":2,\"723\":1,\"724\":1,\"823\":1,\"825\":2,\"904\":1,\"907\":1,\"925\":1,\"931\":1,\"935\":2,\"946\":1,\"947\":1,\"1046\":1,\"1048\":2,\"1223\":1,\"1225\":2,\"1416\":1,\"1418\":2,\"1615\":1,\"1617\":2,\"1796\":1,\"1798\":2,\"2011\":1,\"2013\":2,\"2230\":1,\"2232\":2}}],[\"updates\",{\"1\":{\"29\":2,\"100\":1}}],[\"upstream\",{\"1\":{\"55\":1}}],[\"up\",{\"0\":{\"6\":1,\"296\":1,\"346\":1,\"687\":1,\"894\":1},\"1\":{\"90\":1,\"95\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"168\":1,\"169\":1,\"171\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"203\":1,\"220\":1,\"221\":1,\"228\":1,\"229\":1,\"250\":1,\"251\":1,\"258\":1,\"259\":1,\"280\":1,\"281\":1,\"288\":1,\"289\":1,\"326\":1,\"327\":1,\"334\":1,\"335\":1,\"372\":1,\"373\":1,\"380\":1,\"381\":1,\"717\":1,\"718\":1,\"725\":1,\"726\":1,\"940\":1,\"941\":1,\"948\":1,\"949\":1}}],[\"usr\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"usually\",{\"1\":{\"100\":1}}],[\"usages\",{\"1\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"usage\",{\"1\":{\"81\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"using\",{\"0\":{\"61\":1},\"1\":{\"57\":1,\"62\":1,\"63\":1,\"64\":2,\"80\":1,\"81\":3,\"99\":1,\"102\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"168\":1,\"169\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"220\":1,\"221\":1,\"228\":1,\"229\":1,\"250\":1,\"251\":1,\"258\":1,\"259\":1,\"280\":1,\"281\":1,\"288\":1,\"289\":1,\"302\":1,\"326\":1,\"327\":1,\"334\":1,\"335\":1,\"352\":1,\"372\":1,\"373\":1,\"380\":1,\"381\":1,\"385\":1,\"389\":1,\"392\":1,\"399\":1,\"415\":1,\"420\":1,\"426\":1,\"438\":1,\"453\":1,\"469\":1,\"476\":1,\"480\":1,\"482\":1,\"492\":1,\"521\":1,\"536\":1,\"540\":1,\"543\":1,\"550\":1,\"566\":1,\"571\":1,\"577\":1,\"589\":1,\"606\":1,\"610\":3,\"613\":1,\"622\":1,\"629\":1,\"633\":1,\"635\":1,\"646\":1,\"660\":1,\"674\":1,\"693\":1,\"717\":1,\"718\":1,\"725\":1,\"726\":1,\"739\":1,\"754\":1,\"758\":1,\"761\":1,\"769\":1,\"784\":1,\"789\":1,\"795\":1,\"811\":1,\"817\":3,\"820\":1,\"829\":1,\"836\":1,\"840\":1,\"842\":1,\"853\":1,\"867\":1,\"881\":1,\"900\":1,\"921\":1,\"940\":1,\"941\":1,\"948\":1,\"949\":1,\"962\":1,\"977\":1,\"981\":1,\"984\":1,\"992\":1,\"1007\":1,\"1012\":1,\"1018\":1,\"1034\":1,\"1040\":3,\"1043\":1,\"1052\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1076\":1,\"1090\":1,\"1104\":1,\"1123\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1153\":1,\"1168\":1,\"1173\":1,\"1179\":1,\"1195\":1,\"1213\":1,\"1217\":3,\"1220\":1,\"1229\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1253\":1,\"1267\":1,\"1281\":1,\"1301\":1,\"1316\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1346\":1,\"1361\":1,\"1366\":1,\"1372\":1,\"1388\":1,\"1406\":1,\"1410\":3,\"1413\":1,\"1422\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1446\":1,\"1460\":1,\"1474\":1,\"1482\":3,\"1485\":1,\"1503\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1536\":1,\"1551\":1,\"1556\":1,\"1562\":1,\"1582\":1,\"1586\":1,\"1605\":1,\"1609\":3,\"1612\":1,\"1621\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1649\":1,\"1663\":1,\"1677\":1,\"1697\":1,\"1712\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1742\":1,\"1757\":1,\"1762\":1,\"1768\":1,\"1784\":1,\"1790\":3,\"1793\":1,\"1802\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1826\":1,\"1840\":1,\"1854\":1,\"1874\":1,\"1878\":3,\"1881\":1,\"1899\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1932\":1,\"1947\":1,\"1952\":1,\"1958\":1,\"1978\":1,\"1982\":1,\"2001\":1,\"2005\":3,\"2008\":1,\"2017\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2045\":1,\"2059\":1,\"2073\":1,\"2093\":1,\"2097\":3,\"2100\":1,\"2118\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2151\":1,\"2166\":1,\"2171\":1,\"2177\":1,\"2197\":1,\"2201\":1,\"2220\":1,\"2224\":3,\"2227\":1,\"2236\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2264\":1,\"2278\":1,\"2292\":1,\"2312\":1}}],[\"us\",{\"0\":{\"16\":1},\"1\":{\"4\":1,\"6\":1,\"28\":1,\"95\":1,\"98\":2,\"99\":2,\"102\":2,\"126\":2,\"128\":2,\"140\":1,\"149\":2,\"151\":2,\"163\":1,\"173\":2,\"175\":2,\"187\":1,\"205\":1,\"207\":2,\"223\":1,\"235\":1,\"237\":2,\"253\":1,\"265\":1,\"267\":2,\"283\":1,\"291\":1,\"301\":1,\"303\":5,\"305\":3,\"311\":1,\"313\":2,\"329\":1,\"341\":1,\"351\":1,\"353\":5,\"355\":3,\"357\":1,\"359\":2,\"375\":1,\"682\":1,\"692\":1,\"694\":5,\"696\":3,\"702\":1,\"704\":2,\"720\":1,\"889\":1,\"899\":1,\"901\":5,\"903\":3,\"925\":1,\"927\":2,\"943\":1}}],[\"useful\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"username\",{\"0\":{\"386\":1,\"390\":1,\"393\":1,\"430\":1,\"440\":1,\"477\":1,\"483\":1,\"484\":1,\"494\":1,\"537\":1,\"541\":1,\"544\":1,\"581\":1,\"591\":1,\"630\":1,\"636\":1,\"637\":1,\"648\":1,\"755\":1,\"759\":1,\"762\":1,\"799\":1,\"813\":1,\"837\":1,\"843\":1,\"844\":1,\"855\":1,\"978\":1,\"982\":1,\"985\":1,\"1022\":1,\"1036\":1,\"1060\":1,\"1066\":1,\"1067\":1,\"1078\":1,\"1139\":1,\"1143\":1,\"1146\":1,\"1183\":1,\"1197\":1,\"1237\":1,\"1243\":1,\"1244\":1,\"1255\":1,\"1332\":1,\"1336\":1,\"1339\":1,\"1376\":1,\"1390\":1,\"1430\":1,\"1436\":1,\"1437\":1,\"1448\":1,\"1519\":1,\"1523\":1,\"1526\":1,\"1566\":1,\"1584\":1,\"1629\":1,\"1635\":1,\"1636\":1,\"1651\":1,\"1728\":1,\"1732\":1,\"1735\":1,\"1772\":1,\"1786\":1,\"1810\":1,\"1816\":1,\"1817\":1,\"1828\":1,\"1915\":1,\"1919\":1,\"1922\":1,\"1962\":1,\"1980\":1,\"2025\":1,\"2031\":1,\"2032\":1,\"2047\":1,\"2134\":1,\"2138\":1,\"2141\":1,\"2181\":1,\"2199\":1,\"2244\":1,\"2250\":1,\"2251\":1,\"2266\":1},\"1\":{\"386\":1,\"390\":2,\"393\":1,\"420\":1,\"430\":3,\"440\":3,\"477\":1,\"483\":2,\"484\":1,\"494\":3,\"537\":1,\"541\":2,\"544\":1,\"571\":1,\"581\":3,\"591\":3,\"630\":1,\"636\":2,\"637\":1,\"648\":3,\"755\":1,\"759\":2,\"762\":1,\"789\":1,\"799\":3,\"813\":3,\"837\":1,\"843\":2,\"844\":1,\"855\":3,\"978\":1,\"982\":2,\"985\":1,\"1012\":1,\"1022\":3,\"1036\":3,\"1060\":1,\"1066\":2,\"1067\":1,\"1078\":3,\"1139\":1,\"1143\":2,\"1146\":1,\"1173\":1,\"1183\":3,\"1197\":3,\"1237\":1,\"1243\":2,\"1244\":1,\"1255\":3,\"1332\":1,\"1336\":2,\"1339\":1,\"1366\":1,\"1376\":3,\"1390\":3,\"1430\":1,\"1436\":2,\"1437\":1,\"1448\":3,\"1519\":1,\"1523\":3,\"1526\":2,\"1556\":1,\"1566\":3,\"1584\":3,\"1629\":1,\"1635\":3,\"1636\":2,\"1651\":3,\"1728\":1,\"1732\":2,\"1735\":1,\"1762\":1,\"1772\":3,\"1786\":3,\"1810\":1,\"1816\":2,\"1817\":1,\"1828\":3,\"1915\":1,\"1919\":3,\"1922\":2,\"1952\":1,\"1962\":3,\"1980\":3,\"2025\":1,\"2031\":3,\"2032\":2,\"2047\":3,\"2134\":1,\"2138\":3,\"2141\":2,\"2171\":1,\"2181\":3,\"2199\":3,\"2244\":1,\"2250\":3,\"2251\":2,\"2266\":3}}],[\"useradd\",{\"1\":{\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"users\",{\"0\":{\"611\":1,\"818\":1,\"1041\":1,\"1218\":1,\"1411\":1,\"1483\":1,\"1610\":1,\"1791\":1,\"1879\":1,\"2006\":1,\"2098\":1,\"2225\":1},\"1\":{\"80\":1,\"81\":1,\"98\":1,\"137\":1,\"160\":1,\"184\":1,\"192\":1,\"220\":1,\"250\":1,\"280\":1,\"290\":1,\"305\":2,\"326\":1,\"340\":1,\"355\":2,\"372\":1,\"388\":1,\"391\":1,\"479\":1,\"481\":1,\"539\":1,\"542\":1,\"610\":2,\"611\":1,\"613\":1,\"615\":1,\"617\":1,\"632\":1,\"634\":1,\"674\":2,\"681\":1,\"696\":2,\"717\":1,\"757\":1,\"760\":1,\"817\":2,\"818\":1,\"820\":1,\"822\":1,\"824\":1,\"839\":1,\"841\":1,\"881\":2,\"888\":1,\"903\":2,\"940\":1,\"980\":1,\"983\":1,\"1040\":2,\"1041\":1,\"1043\":1,\"1045\":1,\"1047\":1,\"1062\":1,\"1064\":1,\"1104\":2,\"1141\":1,\"1144\":1,\"1217\":2,\"1218\":1,\"1220\":1,\"1222\":1,\"1224\":1,\"1239\":1,\"1241\":1,\"1281\":2,\"1334\":1,\"1337\":1,\"1410\":2,\"1411\":1,\"1413\":1,\"1415\":1,\"1417\":1,\"1432\":1,\"1434\":1,\"1474\":2,\"1482\":2,\"1483\":1,\"1485\":1,\"1487\":1,\"1490\":1,\"1521\":1,\"1524\":1,\"1586\":2,\"1609\":2,\"1610\":1,\"1612\":1,\"1614\":1,\"1616\":1,\"1631\":1,\"1633\":1,\"1677\":2,\"1730\":1,\"1733\":1,\"1790\":2,\"1791\":1,\"1793\":1,\"1795\":1,\"1797\":1,\"1812\":1,\"1814\":1,\"1854\":2,\"1878\":2,\"1879\":1,\"1881\":1,\"1883\":1,\"1886\":1,\"1917\":1,\"1920\":1,\"1982\":2,\"2005\":2,\"2006\":1,\"2008\":1,\"2010\":1,\"2012\":1,\"2027\":1,\"2029\":1,\"2073\":2,\"2097\":2,\"2098\":1,\"2100\":1,\"2102\":1,\"2105\":1,\"2136\":1,\"2139\":1,\"2201\":2,\"2224\":2,\"2225\":1,\"2227\":1,\"2229\":1,\"2231\":1,\"2246\":1,\"2248\":1,\"2292\":2}}],[\"user\",{\"0\":{\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1},\"1\":{\"41\":1,\"58\":1,\"62\":1,\"99\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"137\":6,\"138\":5,\"160\":6,\"161\":5,\"171\":1,\"184\":6,\"185\":5,\"203\":1,\"220\":6,\"221\":5,\"250\":6,\"251\":5,\"280\":6,\"281\":5,\"303\":1,\"305\":2,\"326\":6,\"327\":5,\"353\":1,\"355\":2,\"372\":6,\"373\":5,\"386\":2,\"388\":2,\"389\":3,\"390\":5,\"391\":2,\"392\":3,\"393\":3,\"477\":2,\"479\":2,\"480\":3,\"481\":2,\"482\":3,\"483\":5,\"484\":3,\"537\":2,\"539\":2,\"540\":3,\"541\":5,\"542\":2,\"543\":3,\"544\":3,\"610\":7,\"612\":1,\"613\":1,\"616\":1,\"617\":10,\"618\":2,\"630\":2,\"632\":2,\"633\":3,\"634\":2,\"635\":3,\"636\":5,\"637\":3,\"674\":2,\"694\":1,\"696\":2,\"717\":6,\"718\":5,\"755\":2,\"757\":2,\"758\":3,\"759\":5,\"760\":2,\"761\":3,\"762\":3,\"817\":7,\"819\":1,\"820\":1,\"823\":1,\"824\":10,\"825\":2,\"837\":2,\"839\":2,\"840\":3,\"841\":2,\"842\":3,\"843\":5,\"844\":3,\"881\":2,\"901\":1,\"903\":2,\"931\":1,\"940\":6,\"941\":5,\"978\":2,\"980\":2,\"981\":3,\"982\":5,\"983\":2,\"984\":3,\"985\":3,\"1040\":7,\"1042\":1,\"1043\":1,\"1046\":1,\"1047\":10,\"1048\":2,\"1060\":2,\"1062\":2,\"1063\":3,\"1064\":2,\"1065\":3,\"1066\":5,\"1067\":3,\"1104\":2,\"1139\":2,\"1141\":2,\"1142\":3,\"1143\":5,\"1144\":2,\"1145\":3,\"1146\":3,\"1217\":7,\"1219\":1,\"1220\":1,\"1223\":1,\"1224\":10,\"1225\":2,\"1237\":2,\"1239\":2,\"1240\":3,\"1241\":2,\"1242\":3,\"1243\":5,\"1244\":3,\"1281\":2,\"1332\":2,\"1334\":2,\"1335\":3,\"1336\":5,\"1337\":2,\"1338\":3,\"1339\":3,\"1410\":7,\"1412\":1,\"1413\":1,\"1416\":1,\"1417\":10,\"1418\":2,\"1430\":2,\"1432\":2,\"1433\":3,\"1434\":2,\"1435\":3,\"1436\":5,\"1437\":3,\"1474\":2,\"1482\":8,\"1484\":1,\"1485\":1,\"1488\":1,\"1490\":2,\"1519\":2,\"1521\":2,\"1522\":3,\"1523\":4,\"1524\":2,\"1525\":3,\"1526\":2,\"1527\":1,\"1586\":2,\"1609\":7,\"1611\":1,\"1612\":1,\"1615\":1,\"1616\":10,\"1617\":2,\"1629\":2,\"1631\":2,\"1632\":3,\"1633\":2,\"1634\":3,\"1635\":4,\"1636\":2,\"1637\":1,\"1677\":2,\"1728\":2,\"1730\":2,\"1731\":3,\"1732\":5,\"1733\":2,\"1734\":3,\"1735\":3,\"1790\":7,\"1792\":1,\"1793\":1,\"1796\":1,\"1797\":10,\"1798\":2,\"1810\":2,\"1812\":2,\"1813\":3,\"1814\":2,\"1815\":3,\"1816\":5,\"1817\":3,\"1854\":2,\"1878\":8,\"1880\":1,\"1881\":1,\"1884\":1,\"1886\":2,\"1915\":2,\"1917\":2,\"1918\":3,\"1919\":4,\"1920\":2,\"1921\":3,\"1922\":2,\"1923\":1,\"1982\":2,\"2005\":7,\"2007\":1,\"2008\":1,\"2011\":1,\"2012\":10,\"2013\":2,\"2025\":2,\"2027\":2,\"2028\":3,\"2029\":2,\"2030\":3,\"2031\":4,\"2032\":2,\"2033\":1,\"2073\":2,\"2097\":8,\"2099\":1,\"2100\":1,\"2103\":1,\"2105\":2,\"2134\":2,\"2136\":2,\"2137\":3,\"2138\":4,\"2139\":2,\"2140\":3,\"2141\":2,\"2142\":1,\"2201\":2,\"2224\":7,\"2226\":1,\"2227\":1,\"2230\":1,\"2231\":10,\"2232\":2,\"2244\":2,\"2246\":2,\"2247\":3,\"2248\":2,\"2249\":3,\"2250\":4,\"2251\":2,\"2252\":1,\"2292\":2}}],[\"usesmtps\",{\"0\":{\"431\":1,\"582\":1,\"800\":1,\"1023\":1,\"1184\":1,\"1377\":1,\"1567\":1,\"1773\":1,\"1963\":1,\"2182\":1},\"1\":{\"413\":1,\"414\":1,\"420\":1,\"429\":1,\"430\":1,\"431\":1,\"564\":1,\"565\":1,\"571\":1,\"580\":1,\"581\":1,\"582\":1,\"782\":1,\"783\":1,\"789\":1,\"798\":1,\"799\":1,\"800\":1,\"1005\":1,\"1006\":1,\"1012\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1166\":1,\"1167\":1,\"1173\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1359\":1,\"1360\":1,\"1366\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1549\":1,\"1550\":1,\"1556\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1755\":1,\"1756\":1,\"1762\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1945\":1,\"1946\":1,\"1952\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"2164\":1,\"2165\":1,\"2171\":1,\"2180\":1,\"2181\":1,\"2182\":1}}],[\"uses\",{\"1\":{\"24\":1,\"54\":1,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"297\":1,\"311\":1,\"347\":1,\"357\":1,\"617\":1,\"688\":1,\"702\":1,\"824\":1,\"895\":1,\"925\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"use\",{\"0\":{\"28\":1,\"93\":1},\"1\":{\"0\":1,\"1\":1,\"10\":1,\"11\":1,\"20\":1,\"27\":1,\"28\":1,\"35\":1,\"39\":2,\"49\":1,\"52\":1,\"58\":1,\"59\":1,\"61\":2,\"62\":1,\"66\":3,\"74\":1,\"76\":1,\"80\":1,\"81\":3,\"92\":1,\"95\":2,\"99\":2,\"104\":1,\"125\":2,\"126\":1,\"129\":1,\"133\":1,\"137\":2,\"138\":1,\"139\":1,\"148\":2,\"149\":1,\"152\":1,\"156\":1,\"160\":2,\"161\":1,\"162\":1,\"172\":2,\"173\":1,\"176\":1,\"180\":1,\"184\":2,\"185\":1,\"186\":1,\"192\":1,\"205\":1,\"207\":1,\"212\":1,\"216\":1,\"220\":2,\"221\":1,\"222\":1,\"226\":7,\"235\":1,\"237\":1,\"242\":1,\"246\":1,\"250\":2,\"251\":1,\"252\":1,\"256\":7,\"265\":1,\"267\":1,\"272\":1,\"276\":1,\"280\":2,\"281\":1,\"282\":1,\"286\":7,\"293\":1,\"302\":1,\"311\":1,\"313\":1,\"318\":1,\"322\":1,\"326\":2,\"327\":1,\"328\":1,\"332\":7,\"343\":1,\"352\":1,\"357\":1,\"359\":1,\"364\":1,\"368\":1,\"372\":2,\"373\":1,\"374\":1,\"378\":7,\"383\":1,\"385\":1,\"387\":1,\"389\":1,\"390\":1,\"392\":1,\"397\":1,\"398\":2,\"399\":1,\"406\":1,\"413\":1,\"414\":2,\"415\":1,\"420\":1,\"425\":1,\"426\":1,\"429\":1,\"435\":1,\"438\":1,\"439\":1,\"451\":1,\"452\":2,\"453\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":2,\"469\":1,\"472\":1,\"474\":1,\"476\":1,\"478\":1,\"480\":1,\"482\":1,\"483\":1,\"486\":1,\"492\":1,\"493\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":2,\"521\":1,\"524\":1,\"526\":1,\"534\":1,\"536\":1,\"538\":1,\"540\":1,\"541\":1,\"543\":1,\"548\":1,\"549\":2,\"550\":1,\"557\":1,\"564\":1,\"565\":2,\"566\":1,\"571\":1,\"576\":1,\"577\":1,\"580\":1,\"586\":1,\"589\":1,\"590\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"610\":1,\"617\":1,\"620\":1,\"621\":2,\"622\":1,\"625\":1,\"627\":1,\"629\":1,\"631\":1,\"633\":1,\"635\":1,\"636\":1,\"639\":1,\"643\":1,\"646\":1,\"647\":1,\"658\":1,\"659\":2,\"660\":1,\"663\":1,\"665\":1,\"674\":1,\"684\":1,\"693\":1,\"702\":1,\"704\":1,\"709\":1,\"713\":1,\"717\":2,\"718\":1,\"719\":1,\"723\":7,\"737\":1,\"738\":2,\"739\":1,\"742\":1,\"744\":1,\"752\":1,\"754\":1,\"756\":1,\"758\":1,\"759\":1,\"761\":1,\"767\":1,\"768\":2,\"769\":1,\"776\":1,\"782\":1,\"783\":2,\"784\":1,\"789\":1,\"794\":1,\"795\":1,\"798\":1,\"807\":1,\"811\":1,\"812\":1,\"817\":1,\"824\":1,\"827\":1,\"828\":2,\"829\":1,\"832\":1,\"834\":1,\"836\":1,\"838\":1,\"840\":1,\"842\":1,\"843\":1,\"846\":1,\"853\":1,\"854\":1,\"865\":1,\"866\":2,\"867\":1,\"870\":1,\"872\":1,\"881\":1,\"891\":1,\"900\":1,\"915\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"925\":1,\"927\":1,\"932\":1,\"936\":1,\"940\":2,\"941\":1,\"942\":1,\"946\":7,\"960\":1,\"961\":2,\"962\":1,\"965\":1,\"967\":1,\"975\":1,\"977\":1,\"979\":1,\"981\":1,\"982\":1,\"984\":1,\"990\":1,\"991\":2,\"992\":1,\"999\":1,\"1005\":1,\"1006\":2,\"1007\":1,\"1012\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1030\":1,\"1034\":1,\"1035\":1,\"1040\":1,\"1047\":1,\"1050\":1,\"1051\":2,\"1052\":1,\"1055\":1,\"1057\":1,\"1059\":1,\"1061\":1,\"1063\":1,\"1065\":1,\"1066\":1,\"1069\":1,\"1076\":1,\"1077\":1,\"1088\":1,\"1089\":2,\"1090\":1,\"1093\":1,\"1095\":1,\"1104\":1,\"1121\":1,\"1122\":2,\"1123\":1,\"1126\":1,\"1128\":1,\"1136\":1,\"1138\":1,\"1140\":1,\"1142\":1,\"1143\":1,\"1145\":1,\"1151\":1,\"1152\":2,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":2,\"1168\":1,\"1173\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1191\":1,\"1195\":1,\"1196\":1,\"1207\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1217\":1,\"1224\":1,\"1227\":1,\"1228\":2,\"1229\":1,\"1232\":1,\"1234\":1,\"1236\":1,\"1238\":1,\"1240\":1,\"1242\":1,\"1243\":1,\"1246\":1,\"1253\":1,\"1254\":1,\"1265\":1,\"1266\":2,\"1267\":1,\"1270\":1,\"1272\":1,\"1281\":1,\"1295\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":2,\"1316\":1,\"1319\":1,\"1321\":1,\"1329\":1,\"1331\":1,\"1333\":1,\"1335\":1,\"1336\":1,\"1338\":1,\"1344\":1,\"1345\":2,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":2,\"1361\":1,\"1366\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1384\":1,\"1388\":1,\"1389\":1,\"1400\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1410\":1,\"1417\":1,\"1420\":1,\"1421\":2,\"1422\":1,\"1425\":1,\"1427\":1,\"1429\":1,\"1431\":1,\"1433\":1,\"1435\":1,\"1436\":1,\"1439\":1,\"1446\":1,\"1447\":1,\"1458\":1,\"1459\":2,\"1460\":1,\"1463\":1,\"1465\":1,\"1474\":1,\"1482\":1,\"1501\":1,\"1502\":2,\"1503\":1,\"1506\":1,\"1508\":1,\"1516\":1,\"1518\":1,\"1520\":1,\"1522\":1,\"1523\":1,\"1525\":1,\"1534\":1,\"1535\":2,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":2,\"1551\":1,\"1556\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1574\":1,\"1582\":1,\"1583\":1,\"1586\":1,\"1599\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1609\":1,\"1616\":1,\"1619\":1,\"1620\":2,\"1621\":1,\"1624\":1,\"1626\":1,\"1628\":1,\"1630\":1,\"1632\":1,\"1634\":1,\"1635\":1,\"1641\":1,\"1649\":1,\"1650\":1,\"1661\":1,\"1662\":2,\"1663\":1,\"1666\":1,\"1668\":1,\"1677\":1,\"1691\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":2,\"1712\":1,\"1715\":1,\"1717\":1,\"1725\":1,\"1727\":1,\"1729\":1,\"1731\":1,\"1732\":1,\"1734\":1,\"1740\":1,\"1741\":2,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":2,\"1757\":1,\"1762\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1780\":1,\"1784\":1,\"1785\":1,\"1790\":1,\"1797\":1,\"1800\":1,\"1801\":2,\"1802\":1,\"1805\":1,\"1807\":1,\"1809\":1,\"1811\":1,\"1813\":1,\"1815\":1,\"1816\":1,\"1819\":1,\"1826\":1,\"1827\":1,\"1838\":1,\"1839\":2,\"1840\":1,\"1843\":1,\"1845\":1,\"1854\":1,\"1868\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1878\":1,\"1897\":1,\"1898\":2,\"1899\":1,\"1902\":1,\"1904\":1,\"1912\":1,\"1914\":1,\"1916\":1,\"1918\":1,\"1919\":1,\"1921\":1,\"1930\":1,\"1931\":2,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":2,\"1947\":1,\"1952\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1970\":1,\"1978\":1,\"1979\":1,\"1982\":1,\"1995\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2005\":1,\"2012\":1,\"2015\":1,\"2016\":2,\"2017\":1,\"2020\":1,\"2022\":1,\"2024\":1,\"2026\":1,\"2028\":1,\"2030\":1,\"2031\":1,\"2037\":1,\"2045\":1,\"2046\":1,\"2057\":1,\"2058\":2,\"2059\":1,\"2062\":1,\"2064\":1,\"2073\":1,\"2087\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2097\":1,\"2116\":1,\"2117\":2,\"2118\":1,\"2121\":1,\"2123\":1,\"2131\":1,\"2133\":1,\"2135\":1,\"2137\":1,\"2138\":1,\"2140\":1,\"2149\":1,\"2150\":2,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":2,\"2166\":1,\"2171\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2189\":1,\"2197\":1,\"2198\":1,\"2201\":1,\"2214\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2224\":1,\"2231\":1,\"2234\":1,\"2235\":2,\"2236\":1,\"2239\":1,\"2241\":1,\"2243\":1,\"2245\":1,\"2247\":1,\"2249\":1,\"2250\":1,\"2256\":1,\"2264\":1,\"2265\":1,\"2276\":1,\"2277\":2,\"2278\":1,\"2281\":1,\"2283\":1,\"2292\":1,\"2306\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"used\",{\"1\":{\"0\":1,\"52\":1,\"53\":1,\"54\":1,\"57\":1,\"58\":3,\"59\":2,\"60\":2,\"62\":1,\"63\":4,\"68\":1,\"69\":1,\"70\":1,\"71\":1,\"73\":1,\"74\":1,\"76\":3,\"77\":3,\"81\":1,\"92\":1,\"95\":1,\"126\":1,\"134\":1,\"136\":2,\"137\":1,\"138\":1,\"149\":1,\"157\":1,\"159\":2,\"160\":1,\"161\":1,\"173\":1,\"181\":1,\"183\":2,\"184\":1,\"185\":1,\"205\":1,\"217\":1,\"219\":2,\"220\":1,\"221\":1,\"235\":1,\"247\":1,\"249\":2,\"250\":1,\"251\":1,\"265\":1,\"277\":1,\"279\":2,\"280\":1,\"281\":1,\"294\":1,\"298\":1,\"299\":1,\"302\":1,\"311\":1,\"323\":1,\"325\":2,\"326\":1,\"327\":1,\"344\":1,\"348\":1,\"349\":1,\"352\":1,\"357\":1,\"369\":1,\"371\":2,\"372\":1,\"373\":1,\"387\":1,\"409\":1,\"413\":1,\"478\":1,\"487\":1,\"504\":1,\"505\":2,\"538\":1,\"560\":1,\"564\":1,\"601\":1,\"602\":2,\"612\":1,\"617\":1,\"618\":1,\"631\":1,\"640\":1,\"677\":3,\"685\":1,\"689\":1,\"690\":1,\"693\":1,\"702\":1,\"714\":1,\"716\":2,\"717\":1,\"718\":1,\"756\":1,\"782\":1,\"819\":1,\"824\":1,\"825\":1,\"838\":1,\"847\":1,\"884\":3,\"892\":1,\"896\":1,\"897\":1,\"900\":1,\"916\":1,\"917\":2,\"925\":1,\"937\":1,\"939\":2,\"940\":1,\"941\":1,\"979\":1,\"1005\":1,\"1042\":1,\"1047\":1,\"1048\":1,\"1061\":1,\"1070\":1,\"1107\":3,\"1140\":1,\"1166\":1,\"1208\":1,\"1209\":2,\"1219\":1,\"1224\":1,\"1225\":1,\"1238\":1,\"1247\":1,\"1284\":3,\"1296\":1,\"1297\":2,\"1333\":1,\"1359\":1,\"1401\":1,\"1402\":2,\"1412\":1,\"1417\":1,\"1418\":1,\"1431\":1,\"1440\":1,\"1477\":3,\"1482\":1,\"1484\":1,\"1520\":1,\"1549\":1,\"1588\":3,\"1600\":1,\"1601\":2,\"1609\":1,\"1611\":1,\"1616\":1,\"1617\":1,\"1630\":1,\"1642\":1,\"1680\":3,\"1692\":1,\"1693\":2,\"1729\":1,\"1755\":1,\"1792\":1,\"1797\":1,\"1798\":1,\"1811\":1,\"1820\":1,\"1857\":3,\"1869\":1,\"1870\":2,\"1878\":1,\"1880\":1,\"1916\":1,\"1945\":1,\"1984\":3,\"1996\":1,\"1997\":2,\"2005\":1,\"2007\":1,\"2012\":1,\"2013\":1,\"2026\":1,\"2038\":1,\"2076\":3,\"2088\":1,\"2089\":2,\"2097\":1,\"2099\":1,\"2135\":1,\"2164\":1,\"2203\":3,\"2215\":1,\"2216\":2,\"2224\":1,\"2226\":1,\"2231\":1,\"2232\":1,\"2245\":1,\"2257\":1,\"2295\":3,\"2307\":1,\"2308\":2}}],[\"🔒\",{\"0\":{\"75\":1}}],[\"🔥\",{\"0\":{\"59\":1}}],[\"📫\",{\"0\":{\"53\":1}}],[\"🚀\",{\"1\":{\"5\":1}}],[\"👥\",{\"0\":{\"5\":1}}],[\"128\",{\"1\":{\"610\":2,\"817\":2,\"1040\":2,\"1217\":2,\"1410\":2,\"1482\":2,\"1609\":2,\"1790\":2,\"1878\":2,\"2005\":2,\"2097\":2,\"2224\":2}}],[\"127\",{\"1\":{\"442\":1,\"464\":1,\"510\":1,\"532\":1,\"649\":1,\"671\":1,\"728\":1,\"750\":1,\"856\":1,\"878\":1,\"951\":1,\"973\":1,\"1079\":1,\"1101\":1,\"1112\":1,\"1134\":1,\"1256\":1,\"1278\":1,\"1305\":1,\"1327\":1,\"1449\":1,\"1471\":1,\"1492\":1,\"1514\":1,\"1652\":1,\"1674\":1,\"1701\":1,\"1723\":1,\"1829\":1,\"1851\":1,\"1888\":1,\"1910\":1,\"2048\":1,\"2070\":1,\"2107\":1,\"2129\":1,\"2267\":1,\"2289\":1}}],[\"126\",{\"1\":{\"39\":1}}],[\"172\",{\"1\":{\"498\":1,\"595\":1,\"909\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"17\",{\"1\":{\"297\":1,\"347\":1,\"688\":1,\"895\":1}}],[\"16\",{\"1\":{\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"184\":2,\"185\":2,\"220\":2,\"221\":2,\"250\":2,\"251\":2,\"280\":2,\"281\":2,\"326\":2,\"327\":2,\"372\":2,\"373\":2,\"717\":2,\"718\":2,\"940\":2,\"941\":2}}],[\"1x\",{\"1\":{\"74\":1,\"77\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"1\",{\"0\":{\"105\":1,\"107\":2,\"109\":1,\"111\":1,\"113\":2,\"115\":1,\"117\":1,\"123\":1,\"129\":1,\"152\":2,\"167\":1,\"170\":2,\"176\":1,\"191\":2,\"202\":1,\"212\":1,\"227\":1,\"242\":2,\"257\":1,\"272\":1,\"287\":2,\"318\":1,\"333\":1,\"364\":1,\"379\":1,\"709\":2,\"724\":1,\"932\":1,\"947\":2},\"1\":{\"35\":12,\"36\":1,\"62\":1,\"105\":2,\"107\":4,\"108\":1,\"109\":3,\"110\":1,\"111\":3,\"112\":1,\"113\":4,\"114\":1,\"115\":3,\"116\":1,\"117\":3,\"118\":1,\"122\":1,\"123\":3,\"124\":1,\"127\":3,\"137\":2,\"138\":2,\"139\":2,\"142\":1,\"143\":2,\"147\":1,\"150\":3,\"160\":4,\"161\":4,\"162\":2,\"165\":2,\"166\":2,\"167\":3,\"168\":10,\"169\":15,\"170\":4,\"171\":1,\"174\":3,\"184\":2,\"185\":2,\"186\":2,\"189\":1,\"190\":2,\"191\":3,\"192\":8,\"193\":13,\"197\":1,\"201\":1,\"202\":4,\"203\":1,\"206\":3,\"220\":2,\"221\":2,\"222\":2,\"225\":1,\"226\":3,\"227\":7,\"228\":6,\"229\":8,\"233\":1,\"236\":3,\"250\":4,\"251\":4,\"252\":2,\"255\":2,\"256\":3,\"257\":8,\"258\":10,\"259\":15,\"263\":1,\"266\":3,\"280\":2,\"281\":2,\"282\":2,\"285\":2,\"286\":3,\"287\":8,\"288\":8,\"289\":9,\"309\":1,\"312\":3,\"326\":2,\"327\":2,\"328\":2,\"331\":1,\"332\":3,\"333\":7,\"334\":6,\"335\":8,\"339\":1,\"358\":3,\"372\":2,\"373\":2,\"374\":2,\"377\":1,\"378\":3,\"379\":7,\"380\":6,\"381\":8,\"410\":2,\"433\":2,\"442\":1,\"464\":1,\"498\":1,\"510\":1,\"532\":1,\"561\":2,\"584\":2,\"595\":1,\"613\":3,\"649\":1,\"671\":1,\"678\":2,\"700\":1,\"703\":3,\"717\":4,\"718\":4,\"719\":4,\"722\":2,\"723\":3,\"724\":8,\"725\":10,\"726\":15,\"728\":1,\"750\":1,\"779\":2,\"805\":2,\"809\":1,\"820\":3,\"856\":1,\"878\":1,\"885\":1,\"907\":1,\"909\":1,\"926\":3,\"929\":18,\"930\":1,\"931\":7,\"940\":2,\"941\":2,\"942\":4,\"945\":1,\"946\":3,\"947\":8,\"948\":8,\"949\":9,\"951\":1,\"973\":1,\"1002\":2,\"1028\":2,\"1032\":1,\"1043\":3,\"1079\":1,\"1101\":1,\"1108\":1,\"1112\":1,\"1134\":1,\"1163\":2,\"1189\":2,\"1193\":1,\"1201\":1,\"1220\":3,\"1256\":1,\"1278\":1,\"1285\":2,\"1289\":1,\"1305\":1,\"1327\":1,\"1356\":2,\"1382\":2,\"1386\":1,\"1394\":1,\"1413\":3,\"1449\":1,\"1471\":1,\"1478\":1,\"1485\":3,\"1492\":1,\"1514\":1,\"1546\":2,\"1572\":2,\"1576\":1,\"1589\":1,\"1593\":1,\"1612\":3,\"1652\":1,\"1674\":1,\"1681\":1,\"1685\":1,\"1701\":1,\"1723\":1,\"1752\":2,\"1778\":2,\"1782\":1,\"1793\":3,\"1829\":1,\"1851\":1,\"1858\":1,\"1862\":1,\"1881\":3,\"1888\":1,\"1910\":1,\"1942\":2,\"1968\":2,\"1972\":1,\"1985\":2,\"1989\":1,\"2008\":3,\"2048\":1,\"2070\":1,\"2077\":2,\"2081\":1,\"2100\":3,\"2107\":1,\"2129\":1,\"2161\":2,\"2187\":2,\"2191\":1,\"2204\":1,\"2208\":1,\"2227\":3,\"2267\":1,\"2289\":1,\"2296\":1,\"2300\":1}}],[\"113549\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"118\",{\"1\":{\"39\":1}}],[\"111\",{\"1\":{\"39\":1}}],[\"11\",{\"1\":{\"29\":2}}],[\"15s\",{\"1\":{\"192\":1,\"193\":1}}],[\"150\",{\"1\":{\"59\":1,\"61\":1}}],[\"15\",{\"1\":{\"29\":2}}],[\"18\",{\"1\":{\"29\":1}}],[\"149\",{\"1\":{\"39\":1}}],[\"142\",{\"1\":{\"39\":1}}],[\"141\",{\"1\":{\"39\":1}}],[\"14\",{\"1\":{\"29\":2,\"103\":1,\"929\":1}}],[\"137\",{\"1\":{\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"726\":2,\"949\":2}}],[\"134\",{\"1\":{\"39\":1}}],[\"133\",{\"1\":{\"39\":1}}],[\"13\",{\"1\":{\"29\":1,\"103\":1}}],[\"10000\",{\"1\":{\"465\":1,\"471\":1,\"533\":1,\"624\":1,\"672\":1,\"751\":1,\"831\":1,\"879\":1,\"974\":1,\"1054\":1,\"1102\":1,\"1135\":1,\"1231\":1,\"1279\":1,\"1328\":1,\"1424\":1,\"1472\":1,\"1515\":1,\"1623\":1,\"1675\":1,\"1724\":1,\"1804\":1,\"1852\":1,\"1911\":1,\"2019\":1,\"2071\":1,\"2130\":1,\"2238\":1,\"2290\":1}}],[\"10s\",{\"1\":{\"192\":1,\"193\":1}}],[\"10\",{\"1\":{\"1\":1,\"29\":2,\"39\":9,\"802\":1,\"1025\":1,\"1186\":1,\"1379\":1,\"1569\":1,\"1775\":1,\"1965\":1,\"2184\":1}}],[\"19\",{\"1\":{\"39\":1,\"91\":5}}],[\"1993\",{\"1\":{\"1\":1}}],[\"1931\",{\"1\":{\"1\":1}}],[\"v1\",{\"1\":{\"193\":6,\"929\":14,\"931\":1}}],[\"vcpu\",{\"1\":{\"131\":2,\"154\":2,\"178\":2,\"214\":2,\"244\":2,\"274\":2,\"320\":2,\"366\":2,\"711\":2,\"934\":2}}],[\"vms\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"vm\",{\"1\":{\"131\":2,\"154\":2,\"178\":2,\"214\":2,\"244\":2,\"274\":2,\"320\":2,\"366\":2,\"711\":2,\"934\":2}}],[\"vulnerabilities\",{\"1\":{\"97\":2,\"98\":1,\"101\":1}}],[\"vulnerability\",{\"0\":{\"96\":1,\"99\":1},\"1\":{\"98\":1,\"99\":4,\"100\":3}}],[\"v\",{\"1\":{\"74\":1,\"76\":3,\"77\":3,\"85\":1,\"133\":2,\"156\":2,\"180\":2,\"216\":2,\"246\":2,\"276\":2,\"322\":2,\"368\":2,\"713\":2,\"936\":2}}],[\"vectors\",{\"1\":{\"63\":1}}],[\"verbose\",{\"0\":{\"402\":1,\"405\":1,\"473\":1,\"553\":1,\"556\":1,\"626\":1,\"772\":1,\"775\":1,\"833\":1,\"995\":1,\"998\":1,\"1056\":1,\"1156\":1,\"1159\":1,\"1233\":1,\"1349\":1,\"1352\":1,\"1426\":1,\"1539\":1,\"1542\":1,\"1625\":1,\"1745\":1,\"1748\":1,\"1806\":1,\"1935\":1,\"1938\":1,\"2021\":1,\"2154\":1,\"2157\":1,\"2240\":1},\"1\":{\"402\":2,\"405\":2,\"473\":2,\"553\":2,\"556\":2,\"626\":2,\"772\":2,\"775\":2,\"833\":2,\"995\":2,\"998\":2,\"1056\":2,\"1156\":2,\"1159\":2,\"1233\":2,\"1349\":2,\"1352\":2,\"1426\":2,\"1539\":2,\"1542\":2,\"1625\":2,\"1745\":2,\"1748\":2,\"1806\":2,\"1935\":2,\"1938\":2,\"2021\":2,\"2154\":2,\"2157\":2,\"2240\":2}}],[\"verbesserungen\",{\"1\":{\"29\":1}}],[\"versatile\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"versiongpg\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"versioning\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"versions\",{\"1\":{\"66\":1,\"95\":1}}],[\"version\",{\"1\":{\"7\":1,\"63\":1,\"95\":3,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"119\":1,\"123\":1,\"125\":3,\"129\":1,\"132\":2,\"144\":1,\"148\":3,\"152\":1,\"155\":2,\"168\":2,\"169\":6,\"170\":1,\"172\":3,\"176\":1,\"179\":2,\"192\":2,\"193\":7,\"194\":1,\"198\":1,\"202\":1,\"215\":2,\"226\":1,\"228\":2,\"229\":6,\"230\":1,\"245\":2,\"256\":1,\"258\":2,\"259\":6,\"260\":1,\"275\":2,\"286\":1,\"288\":2,\"289\":6,\"306\":1,\"321\":2,\"332\":1,\"334\":2,\"335\":6,\"336\":1,\"367\":2,\"378\":1,\"380\":2,\"381\":6,\"697\":1,\"712\":2,\"723\":1,\"725\":2,\"726\":6,\"904\":1,\"930\":1,\"935\":2,\"946\":1,\"948\":2,\"949\":6}}],[\"verein\",{\"1\":{\"137\":2,\"160\":2,\"184\":2,\"220\":2,\"250\":2,\"280\":2,\"326\":2,\"372\":2,\"717\":2,\"940\":2}}],[\"verification\",{\"1\":{\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"703\":1,\"926\":1}}],[\"verify\",{\"0\":{\"606\":1,\"921\":1,\"1213\":1,\"1301\":1,\"1406\":1,\"1605\":1,\"1697\":1,\"1874\":1,\"2001\":1,\"2093\":1,\"2220\":1,\"2312\":1},\"1\":{\"95\":1,\"99\":1,\"100\":1,\"137\":1,\"138\":2,\"160\":1,\"161\":2,\"169\":7,\"184\":1,\"185\":2,\"193\":7,\"220\":1,\"221\":2,\"229\":7,\"250\":1,\"251\":2,\"259\":7,\"280\":1,\"281\":2,\"289\":7,\"326\":1,\"327\":2,\"335\":7,\"372\":1,\"373\":2,\"381\":7,\"674\":1,\"717\":1,\"718\":2,\"726\":7,\"881\":1,\"931\":1,\"940\":1,\"941\":2,\"949\":7,\"1104\":1,\"1281\":1,\"1474\":1,\"1586\":1,\"1677\":1,\"1854\":1,\"1982\":1,\"2073\":1,\"2201\":1,\"2292\":1}}],[\"verwendet\",{\"1\":{\"32\":2}}],[\"verwenden\",{\"1\":{\"31\":1}}],[\"verfügung\",{\"1\":{\"32\":1}}],[\"verlängerter\",{\"1\":{\"29\":1}}],[\"vertraut\",{\"1\":{\"29\":1}}],[\"veranstaltung\",{\"1\":{\"29\":2}}],[\"very\",{\"1\":{\"1\":1,\"95\":1,\"97\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"313\":1,\"329\":1,\"359\":1,\"375\":1,\"704\":1,\"720\":1,\"927\":1,\"943\":1}}],[\"vocabulary\",{\"1\":{\"59\":1}}],[\"vom\",{\"1\":{\"31\":1}}],[\"vorhanden\",{\"1\":{\"31\":1}}],[\"vor\",{\"1\":{\"30\":1,\"32\":1}}],[\"voraussetzungen\",{\"1\":{\"30\":1}}],[\"vorbereitung\",{\"0\":{\"30\":1},\"1\":{\"29\":1,\"30\":1}}],[\"von\",{\"1\":{\"29\":2}}],[\"view\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"virtual\",{\"0\":{\"131\":1,\"154\":1,\"178\":1,\"214\":1,\"244\":1,\"274\":1,\"320\":1,\"366\":1,\"711\":1,\"934\":1},\"1\":{\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"723\":2,\"946\":2}}],[\"visiting\",{\"1\":{\"57\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"visit\",{\"1\":{\"27\":1,\"28\":1,\"140\":1,\"163\":1,\"187\":1,\"223\":1,\"253\":1,\"283\":1,\"301\":1,\"303\":1,\"306\":1,\"329\":1,\"336\":1,\"351\":1,\"353\":1,\"375\":1,\"692\":1,\"694\":1,\"697\":1,\"720\":1,\"899\":1,\"901\":1,\"904\":1,\"928\":1,\"943\":1}}],[\"via\",{\"1\":{\"4\":1,\"49\":1,\"54\":3,\"73\":1,\"74\":2,\"76\":3,\"77\":3,\"92\":1,\"133\":2,\"134\":2,\"156\":2,\"157\":2,\"169\":1,\"180\":2,\"181\":2,\"192\":1,\"193\":1,\"216\":2,\"217\":2,\"229\":1,\"237\":1,\"246\":2,\"247\":2,\"259\":1,\"267\":1,\"276\":2,\"277\":2,\"289\":1,\"305\":1,\"313\":1,\"322\":2,\"323\":2,\"335\":1,\"355\":1,\"359\":1,\"368\":2,\"369\":2,\"381\":1,\"396\":1,\"413\":1,\"414\":1,\"420\":1,\"429\":1,\"430\":1,\"506\":1,\"547\":1,\"564\":1,\"565\":1,\"571\":1,\"580\":1,\"581\":1,\"603\":1,\"610\":3,\"611\":1,\"613\":2,\"616\":1,\"641\":1,\"674\":2,\"675\":2,\"696\":1,\"704\":1,\"713\":2,\"714\":2,\"726\":1,\"765\":1,\"766\":1,\"782\":1,\"783\":1,\"789\":1,\"798\":1,\"799\":1,\"817\":3,\"818\":1,\"820\":2,\"823\":1,\"848\":1,\"881\":2,\"882\":2,\"903\":1,\"918\":1,\"927\":1,\"936\":2,\"937\":2,\"949\":1,\"988\":1,\"989\":1,\"1005\":1,\"1006\":1,\"1012\":1,\"1021\":1,\"1022\":1,\"1040\":3,\"1041\":1,\"1043\":2,\"1046\":1,\"1071\":1,\"1104\":2,\"1105\":2,\"1149\":1,\"1150\":1,\"1166\":1,\"1167\":1,\"1173\":1,\"1182\":1,\"1183\":1,\"1210\":1,\"1217\":3,\"1218\":1,\"1220\":2,\"1223\":1,\"1248\":1,\"1281\":2,\"1282\":2,\"1298\":1,\"1342\":1,\"1343\":1,\"1359\":1,\"1360\":1,\"1366\":1,\"1375\":1,\"1376\":1,\"1403\":1,\"1410\":3,\"1411\":1,\"1413\":2,\"1416\":1,\"1441\":1,\"1474\":2,\"1475\":2,\"1482\":2,\"1483\":1,\"1485\":2,\"1488\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1549\":1,\"1550\":1,\"1556\":1,\"1565\":1,\"1566\":1,\"1586\":2,\"1587\":2,\"1602\":1,\"1609\":3,\"1610\":1,\"1612\":2,\"1615\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1643\":1,\"1677\":2,\"1678\":2,\"1694\":1,\"1738\":1,\"1739\":1,\"1755\":1,\"1756\":1,\"1762\":1,\"1771\":1,\"1772\":1,\"1790\":3,\"1791\":1,\"1793\":2,\"1796\":1,\"1821\":1,\"1854\":2,\"1855\":2,\"1871\":1,\"1878\":2,\"1879\":1,\"1881\":2,\"1884\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1945\":1,\"1946\":1,\"1952\":1,\"1961\":1,\"1962\":1,\"1982\":2,\"1983\":2,\"1998\":1,\"2005\":3,\"2006\":1,\"2008\":2,\"2011\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2039\":1,\"2073\":2,\"2074\":2,\"2090\":1,\"2097\":2,\"2098\":1,\"2100\":2,\"2103\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2164\":1,\"2165\":1,\"2171\":1,\"2180\":1,\"2181\":1,\"2201\":2,\"2202\":2,\"2217\":1,\"2224\":3,\"2225\":1,\"2227\":2,\"2230\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2258\":1,\"2292\":2,\"2293\":2,\"2309\":1}}],[\"varying\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"variable\",{\"1\":{\"137\":1,\"610\":1,\"817\":1,\"929\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"variableslocal\",{\"0\":{\"766\":1,\"989\":1,\"1150\":1,\"1343\":1,\"1532\":1,\"1739\":1,\"1928\":1,\"2147\":1},\"1\":{\"766\":1,\"989\":1,\"1150\":1,\"1343\":1,\"1532\":1,\"1739\":1,\"1928\":1,\"2147\":1}}],[\"variables\",{\"0\":{\"396\":1,\"547\":1,\"765\":1,\"988\":1,\"1149\":1,\"1342\":1,\"1531\":1,\"1738\":1,\"1927\":1,\"2146\":1},\"1\":{\"137\":3,\"138\":2,\"160\":3,\"161\":2,\"184\":3,\"185\":2,\"220\":3,\"221\":2,\"250\":3,\"251\":2,\"280\":3,\"281\":2,\"326\":3,\"327\":2,\"372\":3,\"373\":2,\"396\":2,\"547\":2,\"717\":3,\"718\":2,\"765\":2,\"766\":1,\"940\":3,\"941\":2,\"988\":2,\"989\":1,\"1149\":2,\"1150\":1,\"1342\":2,\"1343\":1,\"1531\":2,\"1532\":1,\"1738\":2,\"1739\":1,\"1927\":2,\"1928\":1,\"2146\":2,\"2147\":1}}],[\"various\",{\"1\":{\"20\":1,\"84\":2}}],[\"valuable\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"valued\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"value\",{\"0\":{\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"847\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1},\"1\":{\"100\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"409\":2,\"470\":1,\"471\":1,\"487\":2,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"560\":2,\"610\":2,\"611\":1,\"623\":1,\"624\":1,\"640\":2,\"717\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"809\":1,\"817\":2,\"818\":1,\"830\":1,\"831\":1,\"847\":2,\"940\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1032\":1,\"1040\":2,\"1041\":1,\"1053\":1,\"1054\":1,\"1070\":2,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1193\":1,\"1217\":2,\"1218\":1,\"1230\":1,\"1231\":1,\"1247\":2,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1386\":1,\"1410\":2,\"1411\":1,\"1423\":1,\"1424\":1,\"1440\":2,\"1482\":2,\"1483\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1576\":1,\"1609\":2,\"1610\":1,\"1622\":1,\"1623\":1,\"1642\":2,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1782\":1,\"1790\":2,\"1791\":1,\"1803\":1,\"1804\":1,\"1820\":2,\"1878\":2,\"1879\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1972\":1,\"2005\":2,\"2006\":1,\"2018\":1,\"2019\":1,\"2038\":2,\"2097\":2,\"2098\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2191\":1,\"2224\":2,\"2225\":1,\"2237\":1,\"2238\":1,\"2257\":2}}],[\"values\",{\"1\":{\"88\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"611\":1,\"613\":2,\"616\":1,\"717\":1,\"718\":1,\"818\":1,\"820\":2,\"823\":1,\"940\":1,\"941\":1,\"1041\":1,\"1043\":2,\"1046\":1,\"1218\":1,\"1220\":2,\"1223\":1,\"1411\":1,\"1413\":2,\"1416\":1,\"1483\":1,\"1485\":2,\"1488\":1,\"1580\":1,\"1610\":1,\"1612\":2,\"1615\":1,\"1647\":1,\"1791\":1,\"1793\":2,\"1796\":1,\"1879\":1,\"1881\":2,\"1884\":1,\"1976\":1,\"2006\":1,\"2008\":2,\"2011\":1,\"2043\":1,\"2098\":1,\"2100\":2,\"2103\":1,\"2195\":1,\"2225\":1,\"2227\":2,\"2230\":1,\"2262\":1}}],[\"valueset\",{\"1\":{\"61\":1}}],[\"valid\",{\"1\":{\"74\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"validate\",{\"1\":{\"63\":1,\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"504\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"601\":1,\"625\":1,\"663\":1,\"665\":1,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"916\":1,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1208\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1296\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1401\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1600\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1692\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1869\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"1996\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2088\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2215\":1,\"2239\":1,\"2281\":1,\"2283\":1,\"2307\":1}}],[\"validated\",{\"1\":{\"20\":1,\"59\":1}}],[\"validation\",{\"1\":{\"1\":1,\"39\":1}}],[\"hrp\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"hdd\",{\"1\":{\"131\":2,\"154\":2,\"178\":2,\"214\":2,\"244\":2,\"274\":2,\"320\":2,\"366\":2,\"711\":2,\"934\":2}}],[\"hl7\",{\"0\":{\"59\":1},\"1\":{\"57\":1,\"59\":1,\"80\":1,\"81\":1,\"89\":1}}],[\"hub\",{\"1\":{\"55\":1,\"92\":1}}],[\"hund\",{\"1\":{\"1\":1,\"18\":1,\"39\":9}}],[\"httpd\",{\"1\":{\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"http\",{\"0\":{\"500\":1,\"502\":1,\"597\":1,\"599\":1,\"911\":1,\"913\":1,\"1203\":1,\"1205\":1,\"1291\":1,\"1293\":1,\"1396\":1,\"1398\":1,\"1595\":1,\"1597\":1,\"1687\":1,\"1689\":1,\"1864\":1,\"1866\":1,\"1991\":1,\"1993\":1,\"2083\":1,\"2085\":1,\"2210\":1,\"2212\":1,\"2302\":1,\"2304\":1},\"1\":{\"54\":1,\"63\":1,\"134\":2,\"157\":2,\"181\":2,\"217\":2,\"247\":2,\"277\":2,\"323\":2,\"369\":2,\"439\":2,\"444\":1,\"493\":2,\"500\":1,\"502\":1,\"512\":1,\"590\":2,\"597\":1,\"599\":1,\"617\":1,\"618\":2,\"647\":2,\"651\":1,\"714\":2,\"730\":1,\"812\":2,\"824\":1,\"825\":2,\"854\":2,\"858\":1,\"911\":1,\"913\":1,\"937\":2,\"953\":1,\"1035\":2,\"1047\":1,\"1048\":2,\"1077\":2,\"1081\":1,\"1114\":1,\"1196\":2,\"1203\":1,\"1205\":1,\"1224\":1,\"1225\":2,\"1254\":2,\"1258\":1,\"1291\":1,\"1293\":1,\"1307\":1,\"1389\":2,\"1396\":1,\"1398\":1,\"1417\":1,\"1418\":2,\"1447\":2,\"1451\":1,\"1494\":1,\"1583\":2,\"1595\":1,\"1597\":1,\"1616\":1,\"1617\":2,\"1650\":2,\"1654\":1,\"1687\":1,\"1689\":1,\"1703\":1,\"1785\":2,\"1797\":1,\"1798\":2,\"1827\":2,\"1831\":1,\"1864\":1,\"1866\":1,\"1890\":1,\"1979\":2,\"1991\":1,\"1993\":1,\"2012\":1,\"2013\":2,\"2046\":2,\"2050\":1,\"2083\":1,\"2085\":1,\"2109\":1,\"2198\":2,\"2210\":1,\"2212\":1,\"2231\":1,\"2232\":2,\"2265\":2,\"2269\":1,\"2302\":1,\"2304\":1}}],[\"https\",{\"0\":{\"499\":1,\"596\":1,\"910\":1,\"1202\":1,\"1290\":1,\"1395\":1,\"1594\":1,\"1686\":1,\"1863\":1,\"1990\":1,\"2082\":1,\"2209\":1,\"2301\":1},\"1\":{\"29\":2,\"32\":1,\"37\":1,\"54\":1,\"58\":1,\"63\":2,\"80\":2,\"103\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"127\":1,\"132\":4,\"134\":5,\"137\":4,\"138\":3,\"150\":1,\"155\":4,\"157\":5,\"160\":4,\"161\":3,\"169\":2,\"170\":1,\"174\":1,\"179\":4,\"181\":5,\"184\":4,\"185\":3,\"193\":2,\"202\":1,\"206\":1,\"209\":2,\"210\":2,\"211\":1,\"215\":4,\"217\":5,\"220\":4,\"221\":3,\"229\":2,\"236\":1,\"239\":2,\"240\":2,\"241\":1,\"245\":4,\"247\":5,\"250\":4,\"251\":3,\"259\":2,\"266\":1,\"269\":2,\"270\":3,\"271\":1,\"275\":4,\"277\":5,\"280\":4,\"281\":3,\"289\":2,\"312\":1,\"315\":2,\"316\":3,\"317\":1,\"321\":4,\"323\":5,\"326\":4,\"327\":3,\"335\":2,\"358\":1,\"361\":2,\"362\":3,\"363\":1,\"367\":4,\"369\":5,\"372\":4,\"373\":3,\"381\":2,\"397\":1,\"406\":1,\"408\":1,\"439\":1,\"451\":1,\"456\":1,\"457\":1,\"458\":1,\"467\":1,\"472\":1,\"485\":1,\"493\":1,\"519\":1,\"524\":1,\"525\":1,\"526\":1,\"548\":1,\"557\":1,\"559\":1,\"590\":1,\"620\":1,\"625\":1,\"638\":1,\"647\":1,\"658\":1,\"663\":1,\"664\":1,\"665\":1,\"678\":1,\"703\":1,\"706\":2,\"707\":4,\"708\":1,\"712\":4,\"714\":5,\"717\":4,\"718\":3,\"726\":2,\"737\":1,\"742\":1,\"743\":1,\"744\":1,\"767\":1,\"776\":1,\"778\":1,\"812\":1,\"827\":1,\"832\":1,\"845\":1,\"854\":1,\"865\":1,\"870\":1,\"871\":1,\"872\":1,\"885\":1,\"926\":1,\"931\":1,\"935\":4,\"937\":5,\"940\":4,\"941\":3,\"949\":2,\"960\":1,\"965\":1,\"966\":1,\"967\":1,\"990\":1,\"999\":1,\"1001\":1,\"1035\":1,\"1050\":1,\"1055\":1,\"1068\":1,\"1077\":1,\"1088\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1108\":1,\"1121\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1151\":1,\"1160\":1,\"1162\":1,\"1196\":1,\"1227\":1,\"1232\":1,\"1245\":1,\"1254\":1,\"1265\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1285\":1,\"1314\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1344\":1,\"1353\":1,\"1355\":1,\"1389\":1,\"1420\":1,\"1425\":1,\"1438\":1,\"1447\":1,\"1458\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1478\":1,\"1501\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1534\":1,\"1543\":1,\"1545\":1,\"1577\":2,\"1583\":1,\"1589\":1,\"1619\":1,\"1624\":1,\"1640\":1,\"1650\":1,\"1661\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1681\":1,\"1710\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1740\":1,\"1749\":1,\"1751\":1,\"1785\":1,\"1800\":1,\"1805\":1,\"1818\":1,\"1827\":1,\"1838\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1858\":1,\"1897\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1930\":1,\"1939\":1,\"1941\":1,\"1973\":2,\"1979\":1,\"1985\":1,\"2015\":1,\"2020\":1,\"2036\":1,\"2046\":1,\"2057\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2077\":1,\"2116\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2149\":1,\"2158\":1,\"2160\":1,\"2192\":2,\"2198\":1,\"2204\":1,\"2234\":1,\"2239\":1,\"2255\":1,\"2265\":1,\"2276\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2296\":1}}],[\"h\",{\"1\":{\"39\":10,\"69\":1}}],[\"hostname\",{\"1\":{\"417\":1,\"498\":1,\"568\":1,\"595\":1,\"786\":1,\"909\":1,\"1009\":1,\"1170\":1,\"1201\":1,\"1289\":1,\"1363\":1,\"1394\":1,\"1553\":1,\"1593\":1,\"1685\":1,\"1759\":1,\"1862\":1,\"1949\":1,\"1989\":1,\"2081\":1,\"2168\":1,\"2208\":1,\"2300\":1}}],[\"host\",{\"0\":{\"417\":1,\"442\":1,\"464\":1,\"510\":1,\"532\":1,\"568\":1,\"649\":1,\"671\":1,\"728\":1,\"750\":1,\"786\":1,\"856\":1,\"878\":1,\"951\":1,\"973\":1,\"1009\":1,\"1079\":1,\"1101\":1,\"1112\":1,\"1134\":1,\"1170\":1,\"1256\":1,\"1278\":1,\"1305\":1,\"1327\":1,\"1363\":1,\"1449\":1,\"1471\":1,\"1492\":1,\"1514\":1,\"1553\":1,\"1652\":1,\"1674\":1,\"1701\":1,\"1723\":1,\"1759\":1,\"1829\":1,\"1851\":1,\"1888\":1,\"1910\":1,\"1949\":1,\"2048\":1,\"2070\":1,\"2107\":1,\"2129\":1,\"2168\":1,\"2267\":1,\"2289\":1},\"1\":{\"417\":1,\"442\":2,\"464\":2,\"510\":2,\"532\":2,\"568\":1,\"649\":2,\"671\":2,\"728\":2,\"750\":2,\"786\":1,\"856\":2,\"878\":2,\"951\":2,\"973\":2,\"1009\":1,\"1079\":2,\"1101\":2,\"1112\":2,\"1134\":2,\"1170\":1,\"1256\":2,\"1278\":2,\"1305\":2,\"1327\":2,\"1363\":1,\"1449\":2,\"1471\":2,\"1492\":2,\"1514\":2,\"1553\":1,\"1652\":2,\"1674\":2,\"1701\":2,\"1723\":2,\"1759\":1,\"1829\":2,\"1851\":2,\"1888\":2,\"1910\":2,\"1949\":1,\"2048\":2,\"2070\":2,\"2107\":2,\"2129\":2,\"2168\":1,\"2267\":2,\"2289\":2}}],[\"hospital\",{\"1\":{\"236\":2,\"266\":2,\"312\":2,\"358\":2,\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"703\":2,\"847\":1,\"926\":2,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"hospitalizations\",{\"1\":{\"88\":1}}],[\"hospitals\",{\"1\":{\"20\":1,\"26\":1,\"62\":2,\"91\":2}}],[\"hold\",{\"1\":{\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"holds\",{\"1\":{\"89\":1}}],[\"hotfix\",{\"1\":{\"294\":1,\"295\":1,\"344\":1,\"345\":1,\"685\":1,\"686\":1,\"892\":1,\"893\":1}}],[\"home\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"homepage\",{\"1\":{\"18\":1,\"99\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"717\":1,\"847\":1,\"940\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"hours\",{\"1\":{\"100\":1}}],[\"hoffmann\",{\"1\":{\"39\":1}}],[\"however\",{\"1\":{\"66\":1,\"89\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"how\",{\"0\":{\"28\":1,\"99\":1},\"1\":{\"20\":1,\"27\":2,\"28\":1,\"57\":1,\"84\":1,\"99\":1,\"119\":1,\"122\":1,\"126\":1,\"129\":1,\"137\":1,\"144\":1,\"147\":1,\"149\":1,\"152\":1,\"160\":1,\"173\":1,\"176\":1,\"184\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"205\":1,\"212\":1,\"220\":1,\"230\":1,\"233\":1,\"242\":1,\"250\":1,\"260\":1,\"263\":1,\"272\":1,\"280\":1,\"301\":2,\"306\":2,\"309\":1,\"318\":1,\"326\":1,\"336\":2,\"339\":1,\"351\":2,\"364\":1,\"372\":1,\"692\":2,\"697\":2,\"700\":1,\"709\":1,\"717\":1,\"899\":2,\"904\":2,\"907\":1,\"932\":1,\"940\":1}}],[\"hier\",{\"1\":{\"32\":1,\"103\":1}}],[\"higher\",{\"1\":{\"930\":1}}],[\"highest\",{\"1\":{\"73\":1}}],[\"highly\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"highlight\",{\"1\":{\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"high\",{\"1\":{\"24\":1,\"95\":1}}],[\"highmed\",{\"0\":{\"11\":1},\"1\":{\"11\":2,\"39\":4,\"42\":2,\"62\":1,\"80\":2,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"129\":1,\"152\":1,\"170\":2,\"176\":1,\"202\":2,\"212\":1,\"226\":1,\"242\":1,\"256\":1,\"272\":1,\"286\":1,\"318\":1,\"332\":1,\"364\":1,\"378\":1,\"709\":1,\"723\":1,\"932\":1,\"946\":1}}],[\"history\",{\"1\":{\"610\":1,\"616\":1,\"618\":3,\"817\":1,\"823\":1,\"825\":3,\"1040\":1,\"1046\":1,\"1048\":3,\"1217\":1,\"1223\":1,\"1225\":3,\"1410\":1,\"1416\":1,\"1418\":3,\"1609\":1,\"1615\":1,\"1617\":3,\"1790\":1,\"1796\":1,\"1798\":3,\"2005\":1,\"2011\":1,\"2013\":3,\"2224\":1,\"2230\":1,\"2232\":3}}],[\"his\",{\"1\":{\"1\":1,\"62\":1}}],[\"hhn\",{\"1\":{\"10\":1,\"11\":1,\"31\":1}}],[\"he\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"hex\",{\"1\":{\"137\":2,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":1,\"717\":1,\"817\":1,\"940\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"hear\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"header\",{\"0\":{\"444\":1,\"512\":1,\"651\":1,\"730\":1,\"858\":1,\"953\":1,\"1081\":1,\"1114\":1,\"1258\":1,\"1307\":1,\"1451\":1,\"1494\":1,\"1654\":1,\"1703\":1,\"1831\":1,\"1890\":1,\"2050\":1,\"2109\":1,\"2269\":1},\"1\":{\"444\":2,\"512\":2,\"651\":2,\"730\":2,\"858\":2,\"953\":2,\"1081\":2,\"1114\":2,\"1258\":2,\"1307\":2,\"1451\":2,\"1494\":2,\"1654\":2,\"1703\":2,\"1831\":2,\"1890\":2,\"2050\":2,\"2109\":2,\"2269\":2}}],[\"head\",{\"1\":{\"134\":2,\"157\":2,\"181\":2,\"217\":2,\"247\":2,\"277\":2,\"303\":1,\"323\":2,\"353\":1,\"369\":2,\"694\":1,\"714\":2,\"901\":1,\"937\":2}}],[\"healthcheck\",{\"1\":{\"192\":3,\"193\":3}}],[\"healthcare\",{\"1\":{\"39\":1,\"42\":1,\"80\":1,\"81\":2}}],[\"health\",{\"1\":{\"10\":1,\"13\":2,\"15\":1,\"39\":9,\"59\":1}}],[\"hello\",{\"1\":{\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"helpful\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"help\",{\"1\":{\"305\":5,\"306\":1,\"336\":1,\"355\":5,\"696\":5,\"697\":1,\"903\":5,\"904\":1}}],[\"helping\",{\"1\":{\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"helper\",{\"1\":{\"66\":1}}],[\"helps\",{\"1\":{\"52\":1,\"98\":1,\"291\":1,\"301\":1,\"303\":1,\"341\":1,\"351\":1,\"353\":1,\"682\":1,\"692\":1,\"694\":1,\"889\":1,\"899\":1,\"901\":1}}],[\"heterogeny\",{\"1\":{\"62\":1}}],[\"heterogeneous\",{\"1\":{\"62\":1}}],[\"her\",{\"1\":{\"62\":1}}],[\"herzlich\",{\"1\":{\"29\":1}}],[\"here\",{\"0\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1},\"1\":{\"7\":1,\"27\":1,\"50\":1,\"52\":1,\"55\":2,\"56\":1,\"57\":2,\"74\":1,\"99\":1,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"119\":1,\"123\":1,\"125\":1,\"126\":1,\"127\":2,\"134\":1,\"144\":1,\"148\":1,\"149\":1,\"150\":2,\"157\":1,\"170\":1,\"172\":1,\"173\":1,\"174\":2,\"181\":1,\"194\":1,\"198\":1,\"202\":1,\"205\":1,\"207\":2,\"217\":1,\"230\":1,\"247\":1,\"260\":1,\"277\":1,\"301\":1,\"304\":1,\"306\":1,\"323\":1,\"336\":1,\"351\":1,\"354\":1,\"369\":1,\"617\":1,\"692\":1,\"695\":1,\"697\":1,\"714\":1,\"824\":1,\"899\":1,\"902\":1,\"904\":1,\"928\":1,\"929\":1,\"930\":1,\"937\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"hesitate\",{\"1\":{\"27\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"heinze\",{\"1\":{\"39\":2}}],[\"heidt\",{\"1\":{\"39\":2}}],[\"heidelberg\",{\"0\":{\"11\":1,\"14\":1},\"1\":{\"10\":1,\"11\":1,\"14\":1,\"29\":1}}],[\"heiconf\",{\"1\":{\"29\":1}}],[\"heilbronn\",{\"0\":{\"11\":1,\"13\":1},\"1\":{\"4\":1,\"10\":1,\"13\":1,\"27\":1,\"31\":3,\"37\":1,\"99\":1,\"102\":1,\"126\":1,\"127\":2,\"128\":1,\"137\":1,\"138\":1,\"140\":1,\"149\":1,\"150\":2,\"151\":1,\"160\":1,\"161\":1,\"163\":1,\"173\":1,\"174\":2,\"175\":1,\"184\":1,\"185\":1,\"187\":1,\"205\":1,\"206\":2,\"207\":1,\"220\":1,\"221\":1,\"223\":1,\"235\":1,\"237\":1,\"250\":1,\"253\":1,\"265\":1,\"267\":1,\"280\":1,\"283\":1,\"311\":1,\"313\":1,\"326\":1,\"329\":1,\"357\":1,\"359\":1,\"372\":1,\"375\":1,\"702\":1,\"704\":1,\"717\":1,\"720\":1,\"925\":1,\"927\":1,\"940\":1,\"943\":1}}],[\"hs\",{\"1\":{\"4\":1,\"27\":1,\"31\":2,\"37\":1,\"99\":1,\"102\":1,\"127\":2,\"128\":1,\"137\":1,\"138\":1,\"140\":1,\"150\":2,\"151\":1,\"160\":1,\"161\":1,\"163\":1,\"174\":2,\"175\":1,\"184\":1,\"185\":1,\"187\":1,\"206\":2,\"207\":1,\"220\":1,\"221\":1,\"223\":1,\"237\":1,\"250\":1,\"253\":1,\"267\":1,\"280\":1,\"283\":1,\"313\":1,\"326\":1,\"329\":1,\"359\":1,\"372\":1,\"375\":1,\"704\":1,\"717\":1,\"720\":1,\"927\":1,\"940\":1,\"943\":1}}],[\"had\",{\"1\":{\"99\":1}}],[\"harden\",{\"1\":{\"95\":1}}],[\"haproxy\",{\"1\":{\"64\":1}}],[\"happen\",{\"1\":{\"53\":1}}],[\"hapi\",{\"1\":{\"32\":1}}],[\"hash=sha512\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":1,\"641\":1,\"717\":1,\"817\":1,\"848\":1,\"940\":1,\"1040\":1,\"1071\":1,\"1217\":1,\"1248\":1,\"1410\":1,\"1441\":1,\"1482\":1,\"1609\":1,\"1643\":1,\"1790\":1,\"1821\":1,\"1878\":1,\"2005\":1,\"2039\":1,\"2097\":1,\"2224\":1,\"2258\":1}}],[\"hash\",{\"1\":{\"137\":3,\"160\":2,\"184\":2,\"220\":2,\"250\":2,\"280\":2,\"326\":2,\"372\":2,\"717\":2,\"940\":2}}],[\"has\",{\"1\":{\"52\":2,\"54\":2,\"62\":1,\"300\":1,\"350\":1,\"617\":2,\"691\":1,\"824\":2,\"898\":1,\"1047\":2,\"1224\":2,\"1417\":2,\"1616\":2,\"1797\":2,\"2012\":2,\"2231\":2}}],[\"handled\",{\"1\":{\"74\":1}}],[\"hand\",{\"1\":{\"61\":2}}],[\"handshake\",{\"1\":{\"505\":1,\"602\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1}}],[\"hands\",{\"1\":{\"41\":1,\"80\":1,\"81\":1,\"83\":1}}],[\"hansen\",{\"1\":{\"1\":3}}],[\"hamacher\",{\"1\":{\"39\":1}}],[\"hampf\",{\"1\":{\"39\":2}}],[\"haarbrandt\",{\"1\":{\"39\":1}}],[\"haben\",{\"1\":{\"31\":1,\"37\":1}}],[\"hackathons\",{\"1\":{\"32\":1}}],[\"hackathon\",{\"0\":{\"29\":1},\"1\":{\"29\":1,\"30\":1,\"31\":1,\"37\":1}}],[\"hauke\",{\"1\":{\"1\":1,\"18\":1}}],[\"have\",{\"1\":{\"1\":1,\"8\":1,\"27\":1,\"49\":1,\"53\":1,\"61\":1,\"62\":2,\"80\":1,\"81\":1,\"88\":1,\"89\":1,\"91\":1,\"99\":2,\"102\":1,\"126\":1,\"128\":4,\"137\":1,\"139\":1,\"140\":1,\"149\":1,\"151\":4,\"162\":1,\"163\":1,\"173\":1,\"175\":4,\"186\":1,\"187\":1,\"193\":1,\"205\":1,\"207\":4,\"222\":1,\"223\":1,\"226\":2,\"235\":1,\"237\":3,\"252\":1,\"253\":1,\"256\":2,\"265\":1,\"267\":3,\"282\":1,\"283\":1,\"286\":2,\"297\":1,\"303\":1,\"305\":2,\"311\":1,\"313\":3,\"328\":1,\"329\":1,\"332\":2,\"347\":1,\"353\":1,\"355\":2,\"357\":1,\"359\":3,\"374\":1,\"375\":1,\"378\":2,\"418\":1,\"419\":1,\"486\":1,\"569\":1,\"570\":1,\"639\":1,\"688\":1,\"694\":1,\"696\":2,\"702\":1,\"704\":3,\"719\":1,\"720\":1,\"723\":2,\"787\":1,\"788\":1,\"846\":1,\"895\":1,\"901\":1,\"903\":2,\"925\":1,\"927\":3,\"942\":1,\"943\":1,\"946\":2,\"1010\":1,\"1011\":1,\"1069\":1,\"1171\":1,\"1172\":1,\"1246\":1,\"1364\":1,\"1365\":1,\"1439\":1,\"1554\":1,\"1555\":1,\"1641\":1,\"1760\":1,\"1761\":1,\"1819\":1,\"1950\":1,\"1951\":1,\"2037\":1,\"2169\":1,\"2170\":1,\"2256\":1}}],[\"n9bcmtjugv3y\",{\"1\":{\"678\":1,\"885\":1,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"null\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"number>\",{\"1\":{\"295\":1,\"345\":1,\"686\":1,\"893\":1}}],[\"number\",{\"1\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"410\":2,\"418\":1,\"433\":2,\"561\":2,\"569\":1,\"584\":2,\"677\":1,\"725\":1,\"726\":1,\"779\":2,\"787\":1,\"805\":2,\"809\":2,\"884\":1,\"948\":1,\"949\":1,\"1002\":2,\"1010\":1,\"1028\":2,\"1032\":2,\"1107\":1,\"1163\":2,\"1171\":1,\"1189\":2,\"1193\":2,\"1284\":1,\"1356\":2,\"1364\":1,\"1382\":2,\"1386\":2,\"1477\":1,\"1546\":2,\"1554\":1,\"1572\":2,\"1576\":2,\"1588\":1,\"1680\":1,\"1752\":2,\"1760\":1,\"1778\":2,\"1782\":2,\"1857\":1,\"1942\":2,\"1950\":1,\"1968\":2,\"1972\":2,\"1984\":1,\"2076\":1,\"2161\":2,\"2169\":1,\"2187\":2,\"2191\":2,\"2203\":1,\"2295\":1}}],[\"num\",{\"0\":{\"211\":1,\"241\":1,\"271\":1,\"317\":1,\"363\":1,\"708\":1},\"1\":{\"10\":1,\"29\":1,\"91\":2,\"92\":1,\"129\":2,\"152\":2,\"176\":2,\"211\":2,\"212\":1,\"241\":2,\"242\":1,\"271\":2,\"272\":1,\"317\":2,\"318\":1,\"363\":2,\"364\":1,\"708\":2,\"709\":1,\"929\":1,\"932\":1}}],[\"nationwide\",{\"1\":{\"91\":1}}],[\"naming\",{\"0\":{\"295\":1,\"345\":1,\"686\":1,\"893\":1}}],[\"namingsystem\",{\"1\":{\"61\":1}}],[\"name>\",{\"1\":{\"295\":1,\"345\":1,\"686\":1,\"893\":1}}],[\"names\",{\"1\":{\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"432\":1,\"436\":1,\"505\":1,\"583\":1,\"587\":1,\"602\":1,\"614\":1,\"723\":2,\"804\":1,\"808\":1,\"821\":1,\"917\":1,\"946\":2,\"1027\":1,\"1031\":1,\"1044\":1,\"1188\":1,\"1192\":1,\"1209\":1,\"1221\":1,\"1297\":1,\"1381\":1,\"1385\":1,\"1402\":1,\"1414\":1,\"1486\":1,\"1571\":1,\"1575\":1,\"1601\":1,\"1613\":1,\"1693\":1,\"1777\":1,\"1781\":1,\"1794\":1,\"1870\":1,\"1882\":1,\"1967\":1,\"1971\":1,\"1997\":1,\"2009\":1,\"2089\":1,\"2101\":1,\"2186\":1,\"2190\":1,\"2216\":1,\"2228\":1,\"2308\":1}}],[\"name\",{\"0\":{\"499\":1,\"596\":1,\"910\":1,\"1202\":1,\"1290\":1,\"1395\":1,\"1594\":1,\"1686\":1,\"1863\":1,\"1990\":1,\"2082\":1,\"2209\":1,\"2301\":1},\"1\":{\"59\":1,\"63\":2,\"76\":2,\"77\":1,\"133\":2,\"137\":1,\"156\":2,\"160\":1,\"180\":2,\"184\":1,\"216\":2,\"220\":1,\"246\":2,\"250\":1,\"276\":2,\"280\":1,\"295\":1,\"322\":2,\"326\":1,\"345\":1,\"368\":2,\"372\":1,\"386\":1,\"388\":1,\"390\":1,\"391\":1,\"393\":1,\"444\":1,\"457\":1,\"477\":1,\"479\":1,\"481\":1,\"483\":1,\"484\":1,\"512\":1,\"525\":1,\"537\":1,\"539\":1,\"541\":1,\"542\":1,\"544\":1,\"613\":2,\"630\":1,\"632\":1,\"634\":1,\"636\":1,\"637\":1,\"651\":1,\"664\":1,\"686\":1,\"713\":2,\"717\":1,\"730\":1,\"743\":1,\"755\":1,\"757\":1,\"759\":1,\"760\":1,\"762\":1,\"820\":2,\"837\":1,\"839\":1,\"841\":1,\"843\":1,\"844\":1,\"858\":1,\"871\":1,\"893\":1,\"931\":2,\"936\":2,\"940\":1,\"953\":1,\"966\":1,\"978\":1,\"980\":1,\"982\":1,\"983\":1,\"985\":1,\"1043\":2,\"1060\":1,\"1062\":1,\"1064\":1,\"1066\":1,\"1067\":1,\"1081\":1,\"1094\":1,\"1114\":1,\"1127\":1,\"1139\":1,\"1141\":1,\"1143\":1,\"1144\":1,\"1146\":1,\"1220\":2,\"1237\":1,\"1239\":1,\"1241\":1,\"1243\":1,\"1244\":1,\"1258\":1,\"1271\":1,\"1307\":1,\"1320\":1,\"1332\":1,\"1334\":1,\"1336\":1,\"1337\":1,\"1339\":1,\"1413\":2,\"1430\":1,\"1432\":1,\"1434\":1,\"1436\":1,\"1437\":1,\"1451\":1,\"1464\":1,\"1482\":1,\"1485\":2,\"1494\":1,\"1507\":1,\"1519\":1,\"1521\":1,\"1524\":1,\"1609\":1,\"1612\":2,\"1629\":1,\"1631\":1,\"1633\":1,\"1654\":1,\"1667\":1,\"1703\":1,\"1716\":1,\"1728\":1,\"1730\":1,\"1732\":1,\"1733\":1,\"1735\":1,\"1793\":2,\"1810\":1,\"1812\":1,\"1814\":1,\"1816\":1,\"1817\":1,\"1831\":1,\"1844\":1,\"1878\":1,\"1881\":2,\"1890\":1,\"1903\":1,\"1915\":1,\"1917\":1,\"1920\":1,\"2005\":1,\"2008\":2,\"2025\":1,\"2027\":1,\"2029\":1,\"2050\":1,\"2063\":1,\"2097\":1,\"2100\":2,\"2109\":1,\"2122\":1,\"2134\":1,\"2136\":1,\"2139\":1,\"2224\":1,\"2227\":2,\"2244\":1,\"2246\":1,\"2248\":1,\"2269\":1,\"2282\":1}}],[\"named\",{\"1\":{\"1\":1}}],[\"nginx\",{\"1\":{\"64\":1}}],[\"noproxy\",{\"0\":{\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"810\":1,\"852\":1,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1},\"1\":{\"437\":1,\"439\":1,\"491\":1,\"493\":1,\"588\":1,\"590\":1,\"645\":1,\"647\":1,\"810\":1,\"812\":1,\"852\":1,\"854\":1,\"1033\":1,\"1035\":1,\"1075\":1,\"1077\":1,\"1194\":1,\"1196\":1,\"1252\":1,\"1254\":1,\"1387\":1,\"1389\":1,\"1445\":1,\"1447\":1,\"1581\":1,\"1583\":1,\"1648\":1,\"1650\":1,\"1783\":1,\"1785\":1,\"1825\":1,\"1827\":1,\"1977\":1,\"1979\":1,\"2044\":1,\"2046\":1,\"2196\":1,\"2198\":1,\"2263\":1,\"2265\":1}}],[\"none\",{\"1\":{\"127\":2,\"150\":2,\"174\":2,\"206\":2,\"236\":2,\"266\":2,\"312\":2,\"358\":2,\"703\":2,\"926\":2}}],[\"nodes\",{\"1\":{\"55\":2}}],[\"node\",{\"1\":{\"55\":3}}],[\"notifications\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"noticed\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"notice\",{\"1\":{\"294\":1,\"305\":1,\"344\":1,\"355\":1,\"685\":1,\"696\":1,\"892\":1,\"903\":1}}],[\"note\",{\"1\":{\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1}}],[\"notes\",{\"1\":{\"35\":2,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"notation\",{\"1\":{\"60\":1}}],[\"not\",{\"1\":{\"53\":1,\"54\":2,\"61\":2,\"63\":2,\"64\":1,\"81\":1,\"99\":3,\"101\":2,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"134\":1,\"136\":1,\"137\":2,\"138\":2,\"139\":1,\"143\":4,\"157\":1,\"159\":1,\"160\":2,\"161\":2,\"162\":1,\"166\":4,\"170\":1,\"181\":1,\"183\":1,\"184\":2,\"185\":2,\"186\":1,\"190\":4,\"193\":1,\"202\":1,\"217\":1,\"219\":1,\"220\":2,\"221\":2,\"222\":1,\"226\":4,\"247\":1,\"249\":1,\"250\":2,\"251\":2,\"252\":1,\"256\":4,\"277\":1,\"279\":1,\"280\":2,\"281\":2,\"282\":1,\"286\":4,\"299\":2,\"300\":1,\"302\":1,\"303\":1,\"323\":1,\"325\":1,\"326\":2,\"327\":2,\"328\":1,\"332\":4,\"349\":2,\"350\":1,\"352\":1,\"353\":1,\"369\":1,\"371\":1,\"372\":2,\"373\":2,\"374\":1,\"378\":4,\"419\":1,\"436\":1,\"439\":1,\"493\":1,\"570\":1,\"587\":1,\"590\":1,\"647\":1,\"677\":1,\"690\":2,\"691\":1,\"693\":1,\"694\":1,\"714\":1,\"716\":1,\"717\":2,\"718\":2,\"719\":1,\"723\":4,\"788\":1,\"808\":1,\"812\":1,\"854\":1,\"884\":1,\"897\":2,\"898\":1,\"900\":1,\"901\":1,\"937\":1,\"939\":1,\"940\":2,\"941\":2,\"942\":1,\"946\":4,\"1011\":1,\"1031\":1,\"1035\":1,\"1077\":1,\"1107\":1,\"1172\":1,\"1192\":1,\"1196\":1,\"1254\":1,\"1284\":1,\"1365\":1,\"1385\":1,\"1389\":1,\"1447\":1,\"1477\":1,\"1482\":1,\"1489\":1,\"1555\":1,\"1575\":1,\"1583\":1,\"1588\":1,\"1650\":1,\"1680\":1,\"1761\":1,\"1781\":1,\"1785\":1,\"1827\":1,\"1857\":1,\"1878\":1,\"1885\":1,\"1951\":1,\"1971\":1,\"1979\":1,\"1984\":1,\"2046\":1,\"2076\":1,\"2097\":1,\"2104\":1,\"2170\":1,\"2190\":1,\"2198\":1,\"2203\":1,\"2265\":1,\"2295\":1,\"2315\":1}}],[\"now\",{\"1\":{\"35\":1,\"61\":1,\"62\":1,\"129\":1,\"152\":1,\"176\":1,\"192\":1,\"212\":1,\"242\":1,\"272\":1,\"291\":1,\"318\":1,\"341\":1,\"364\":1,\"682\":1,\"709\":1,\"889\":1,\"932\":1}}],[\"no\",{\"1\":{\"1\":1,\"39\":1,\"54\":1,\"133\":1,\"137\":1,\"138\":1,\"156\":1,\"160\":1,\"161\":1,\"180\":1,\"184\":1,\"185\":1,\"216\":1,\"220\":1,\"221\":1,\"246\":1,\"250\":1,\"251\":1,\"276\":1,\"280\":1,\"281\":1,\"302\":4,\"322\":1,\"326\":1,\"327\":1,\"352\":4,\"368\":1,\"372\":1,\"373\":1,\"383\":1,\"384\":1,\"386\":1,\"388\":1,\"390\":1,\"391\":1,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"399\":1,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"407\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":1,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":1,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":1,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":3,\"438\":1,\"439\":1,\"440\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":1,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"469\":1,\"470\":1,\"471\":1,\"473\":1,\"474\":1,\"475\":1,\"477\":1,\"479\":1,\"481\":1,\"483\":1,\"484\":1,\"486\":1,\"488\":1,\"490\":1,\"491\":3,\"492\":1,\"493\":1,\"494\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"505\":1,\"506\":2,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":1,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"534\":1,\"535\":1,\"537\":1,\"539\":1,\"541\":1,\"542\":1,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"550\":1,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"558\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":1,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":1,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":1,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":3,\"589\":1,\"590\":1,\"591\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"602\":1,\"603\":2,\"606\":1,\"610\":1,\"622\":1,\"623\":1,\"624\":1,\"626\":1,\"627\":1,\"628\":1,\"630\":1,\"632\":1,\"634\":1,\"636\":1,\"637\":1,\"639\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":3,\"646\":1,\"647\":1,\"648\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":1,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"693\":4,\"713\":1,\"717\":1,\"718\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":1,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"752\":1,\"753\":1,\"755\":1,\"757\":1,\"759\":1,\"760\":1,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"769\":1,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"777\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":1,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":1,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":1,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":3,\"811\":1,\"812\":1,\"813\":1,\"817\":1,\"829\":1,\"830\":1,\"831\":1,\"833\":1,\"834\":1,\"835\":1,\"837\":1,\"839\":1,\"841\":1,\"843\":1,\"844\":1,\"846\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":3,\"853\":1,\"854\":1,\"855\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":1,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"900\":4,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":2,\"917\":1,\"918\":2,\"921\":1,\"936\":1,\"940\":1,\"941\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":1,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"975\":1,\"976\":1,\"978\":1,\"980\":1,\"982\":1,\"983\":1,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"992\":1,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"1000\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":1,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":3,\"1034\":1,\"1035\":1,\"1036\":1,\"1040\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1060\":1,\"1062\":1,\"1064\":1,\"1066\":1,\"1067\":1,\"1069\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":3,\"1076\":1,\"1077\":1,\"1078\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1136\":1,\"1137\":1,\"1139\":1,\"1141\":1,\"1143\":1,\"1144\":1,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1153\":1,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1161\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":1,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":3,\"1195\":1,\"1196\":1,\"1197\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":2,\"1209\":1,\"1210\":2,\"1213\":1,\"1217\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1237\":1,\"1239\":1,\"1241\":1,\"1243\":1,\"1244\":1,\"1246\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":3,\"1253\":1,\"1254\":1,\"1255\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":2,\"1297\":1,\"1298\":2,\"1301\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1329\":1,\"1330\":1,\"1332\":1,\"1334\":1,\"1336\":1,\"1337\":1,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1346\":1,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1354\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":1,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":3,\"1388\":1,\"1389\":1,\"1390\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":2,\"1402\":1,\"1403\":2,\"1406\":1,\"1410\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1430\":1,\"1432\":1,\"1434\":1,\"1436\":1,\"1437\":1,\"1439\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":3,\"1446\":1,\"1447\":1,\"1448\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1482\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1516\":1,\"1517\":1,\"1519\":1,\"1521\":1,\"1523\":1,\"1524\":1,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1544\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":1,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":3,\"1582\":1,\"1583\":1,\"1584\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":2,\"1601\":1,\"1602\":2,\"1605\":1,\"1609\":1,\"1621\":1,\"1622\":1,\"1623\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1629\":1,\"1631\":1,\"1633\":1,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1641\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":3,\"1649\":1,\"1650\":1,\"1651\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":2,\"1693\":1,\"1694\":2,\"1697\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1725\":1,\"1726\":1,\"1728\":1,\"1730\":1,\"1732\":1,\"1733\":1,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1742\":1,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1750\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":1,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":3,\"1784\":1,\"1785\":1,\"1786\":1,\"1790\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1810\":1,\"1812\":1,\"1814\":1,\"1816\":1,\"1817\":1,\"1819\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":3,\"1826\":1,\"1827\":1,\"1828\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":2,\"1870\":1,\"1871\":2,\"1874\":1,\"1878\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1912\":1,\"1913\":1,\"1915\":1,\"1917\":1,\"1919\":1,\"1920\":1,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1940\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":1,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":3,\"1978\":1,\"1979\":1,\"1980\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":2,\"1997\":1,\"1998\":2,\"2001\":1,\"2005\":1,\"2017\":1,\"2018\":1,\"2019\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2025\":1,\"2027\":1,\"2029\":1,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2037\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":3,\"2045\":1,\"2046\":1,\"2047\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":2,\"2089\":1,\"2090\":2,\"2093\":1,\"2097\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2131\":1,\"2132\":1,\"2134\":1,\"2136\":1,\"2138\":1,\"2139\":1,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2159\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":1,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":3,\"2197\":1,\"2198\":1,\"2199\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":2,\"2216\":1,\"2217\":2,\"2220\":1,\"2224\":1,\"2236\":1,\"2237\":1,\"2238\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2244\":1,\"2246\":1,\"2248\":1,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2256\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":3,\"2264\":1,\"2265\":1,\"2266\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":2,\"2308\":1,\"2309\":2,\"2312\":1}}],[\"norwegian\",{\"1\":{\"1\":1}}],[\"next\",{\"1\":{\"67\":1,\"73\":1}}],[\"never\",{\"1\":{\"55\":1}}],[\"neben\",{\"1\":{\"31\":1}}],[\"net\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"netzwerkfreigaben\",{\"0\":{\"31\":1}}],[\"networking\",{\"1\":{\"387\":1,\"478\":1,\"538\":1,\"631\":1,\"756\":1,\"838\":1,\"979\":1,\"1061\":1,\"1140\":1,\"1238\":1,\"1333\":1,\"1431\":1,\"1520\":1,\"1630\":1,\"1729\":1,\"1811\":1,\"1916\":1,\"2026\":1,\"2135\":1,\"2245\":1}}],[\"networks\",{\"1\":{\"129\":1,\"152\":1,\"176\":1}}],[\"network\",{\"0\":{\"56\":1,\"63\":1,\"91\":1,\"134\":2,\"157\":2,\"181\":2,\"217\":2,\"247\":2,\"277\":2,\"323\":2,\"369\":2,\"714\":2,\"937\":2},\"1\":{\"0\":1,\"10\":1,\"52\":1,\"54\":2,\"56\":1,\"59\":1,\"63\":2,\"64\":1,\"73\":1,\"76\":2,\"77\":2,\"91\":1,\"94\":1,\"129\":2,\"134\":2,\"140\":1,\"152\":2,\"157\":2,\"163\":1,\"176\":2,\"181\":2,\"187\":1,\"212\":1,\"217\":2,\"223\":1,\"242\":1,\"247\":2,\"253\":1,\"272\":1,\"277\":2,\"283\":1,\"318\":1,\"323\":2,\"329\":1,\"364\":1,\"369\":2,\"375\":1,\"709\":1,\"714\":2,\"720\":1,\"932\":1,\"937\":2,\"943\":1}}],[\"neusten\",{\"1\":{\"29\":1}}],[\"neuer\",{\"1\":{\"29\":1}}],[\"neuerungen\",{\"1\":{\"29\":1}}],[\"neuen\",{\"1\":{\"29\":1}}],[\"neuesten\",{\"1\":{\"29\":1}}],[\"needed\",{\"1\":{\"49\":1,\"61\":1,\"64\":1,\"74\":1,\"100\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"506\":1,\"603\":1,\"713\":1,\"918\":1,\"936\":1,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"need\",{\"0\":{\"83\":1},\"1\":{\"27\":1,\"49\":2,\"61\":2,\"81\":1,\"83\":1,\"89\":1,\"132\":1,\"138\":1,\"155\":1,\"161\":1,\"179\":1,\"185\":1,\"215\":1,\"221\":1,\"245\":1,\"251\":1,\"275\":1,\"281\":1,\"301\":1,\"321\":1,\"327\":1,\"351\":1,\"367\":1,\"373\":1,\"692\":1,\"712\":1,\"718\":1,\"899\":1,\"935\":1,\"941\":1}}],[\"needs\",{\"1\":{\"27\":1,\"63\":1,\"126\":1,\"134\":1,\"149\":1,\"157\":1,\"173\":1,\"181\":1,\"205\":1,\"217\":1,\"235\":1,\"247\":1,\"265\":1,\"277\":1,\"303\":1,\"311\":1,\"323\":1,\"353\":1,\"357\":1,\"369\":1,\"674\":1,\"694\":1,\"702\":1,\"714\":1,\"881\":1,\"901\":1,\"925\":1,\"937\":1,\"1104\":1,\"1281\":1,\"1474\":1,\"1586\":1,\"1677\":1,\"1854\":1,\"1982\":1,\"2073\":1,\"2201\":1,\"2292\":1}}],[\"new\",{\"0\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"119\":1,\"124\":1,\"144\":1,\"171\":1,\"194\":1,\"198\":1,\"203\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1},\"1\":{\"10\":2,\"11\":1,\"20\":1,\"54\":1,\"81\":2,\"105\":2,\"106\":1,\"107\":2,\"108\":1,\"109\":2,\"110\":1,\"111\":2,\"112\":1,\"113\":2,\"114\":1,\"115\":2,\"116\":1,\"117\":2,\"118\":1,\"121\":1,\"123\":2,\"124\":1,\"133\":1,\"138\":1,\"143\":4,\"146\":1,\"156\":1,\"161\":1,\"166\":4,\"170\":2,\"171\":1,\"180\":1,\"185\":1,\"190\":4,\"192\":2,\"193\":4,\"196\":1,\"200\":1,\"202\":2,\"203\":1,\"216\":1,\"221\":1,\"226\":14,\"232\":1,\"246\":1,\"251\":1,\"256\":14,\"262\":1,\"276\":1,\"281\":1,\"286\":14,\"301\":1,\"303\":1,\"305\":1,\"308\":1,\"322\":1,\"327\":1,\"332\":14,\"338\":1,\"351\":1,\"353\":1,\"355\":1,\"368\":1,\"373\":1,\"378\":14,\"692\":1,\"694\":1,\"696\":1,\"699\":1,\"713\":1,\"718\":1,\"723\":14,\"809\":1,\"899\":1,\"901\":1,\"903\":1,\"906\":1,\"936\":1,\"941\":1,\"946\":14,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"necessary\",{\"1\":{\"0\":1,\"58\":1,\"89\":1,\"90\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"gaps\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"gain\",{\"1\":{\"57\":1,\"80\":2,\"81\":1,\"84\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"ghcr\",{\"1\":{\"168\":4,\"169\":2,\"192\":4,\"193\":2,\"228\":4,\"229\":2,\"258\":4,\"259\":2,\"288\":4,\"289\":2,\"334\":4,\"335\":2,\"380\":4,\"381\":2,\"678\":1,\"725\":4,\"726\":2,\"885\":1,\"948\":4,\"949\":2,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"gz\",{\"1\":{\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"184\":2,\"185\":2,\"220\":2,\"221\":2,\"250\":2,\"251\":2,\"280\":2,\"281\":2,\"326\":2,\"327\":2,\"372\":2,\"373\":2,\"717\":2,\"718\":2,\"940\":2,\"941\":2}}],[\"gid\",{\"1\":{\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"184\":2,\"185\":2,\"220\":2,\"221\":2,\"250\":2,\"251\":2,\"280\":2,\"281\":2,\"326\":2,\"327\":2,\"372\":2,\"373\":2,\"717\":2,\"718\":2,\"940\":2,\"941\":2}}],[\"git\",{\"1\":{\"7\":1,\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"github\",{\"1\":{\"6\":2,\"7\":1,\"8\":1,\"18\":8,\"32\":1,\"37\":1,\"80\":1,\"92\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1,\"209\":2,\"210\":2,\"211\":1,\"239\":2,\"240\":2,\"241\":1,\"269\":2,\"270\":3,\"271\":1,\"293\":1,\"303\":2,\"305\":3,\"315\":2,\"316\":3,\"317\":1,\"343\":1,\"353\":2,\"355\":3,\"361\":2,\"362\":3,\"363\":1,\"684\":1,\"694\":2,\"696\":3,\"706\":2,\"707\":4,\"708\":1,\"891\":1,\"901\":2,\"903\":3,\"931\":1}}],[\"gpg\",{\"1\":{\"132\":4,\"155\":4,\"179\":4,\"215\":4,\"245\":4,\"275\":4,\"299\":1,\"321\":4,\"349\":1,\"367\":4,\"690\":1,\"712\":4,\"897\":1,\"935\":4}}],[\"gnupg\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"gb\",{\"1\":{\"131\":4,\"154\":4,\"178\":4,\"214\":4,\"244\":4,\"274\":4,\"320\":4,\"366\":4,\"711\":4,\"934\":4}}],[\"gth\",{\"1\":{\"92\":1,\"127\":1,\"128\":1,\"140\":1,\"150\":1,\"151\":1,\"163\":1,\"174\":1,\"175\":1,\"187\":1,\"206\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"313\":1,\"329\":1,\"359\":1,\"375\":1,\"704\":1,\"720\":1,\"927\":1,\"943\":1}}],[\"géant\",{\"1\":{\"74\":1,\"76\":1,\"77\":1,\"133\":2,\"156\":2,\"180\":2,\"216\":2,\"246\":2,\"276\":2,\"322\":2,\"368\":2,\"713\":2,\"936\":2}}],[\"g2\",{\"1\":{\"74\":1,\"76\":1,\"77\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"global\",{\"1\":{\"74\":2,\"76\":1,\"77\":1,\"133\":1,\"137\":1,\"156\":1,\"160\":1,\"180\":1,\"184\":1,\"216\":1,\"220\":1,\"246\":1,\"250\":1,\"276\":1,\"280\":1,\"322\":1,\"326\":1,\"368\":1,\"372\":1,\"713\":1,\"717\":1,\"936\":1,\"940\":1}}],[\"guarantee\",{\"1\":{\"73\":1}}],[\"guidance\",{\"1\":{\"20\":1,\"80\":1,\"81\":1}}],[\"guidelines\",{\"1\":{\"302\":1,\"305\":1,\"352\":1,\"355\":1,\"693\":1,\"696\":1,\"900\":1,\"903\":1}}],[\"guide\",{\"1\":{\"17\":1,\"132\":1,\"155\":1,\"179\":1,\"206\":1,\"215\":1,\"236\":1,\"245\":1,\"266\":1,\"275\":1,\"305\":3,\"312\":1,\"321\":1,\"355\":3,\"358\":1,\"367\":1,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"696\":3,\"703\":1,\"712\":1,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"903\":3,\"926\":1,\"930\":1,\"935\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"gdpr\",{\"1\":{\"73\":1}}],[\"gmds2022\",{\"0\":{\"78\":1}}],[\"gmds\",{\"0\":{\"41\":1,\"42\":1},\"1\":{\"85\":1}}],[\"graphical\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"grateful\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"granted\",{\"1\":{\"63\":1}}],[\"grizzly\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"719\":4,\"942\":4}}],[\"greatly\",{\"1\":{\"303\":1,\"304\":1,\"353\":1,\"354\":1,\"694\":1,\"695\":1,\"901\":1,\"902\":1}}],[\"great\",{\"1\":{\"61\":2,\"89\":1}}],[\"green\",{\"1\":{\"52\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"growth\",{\"1\":{\"291\":1,\"305\":1,\"341\":1,\"355\":1,\"682\":1,\"696\":1,\"889\":1,\"903\":1}}],[\"growing\",{\"1\":{\"5\":1}}],[\"groupadd\",{\"1\":{\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"group\",{\"0\":{\"82\":1,\"388\":1,\"391\":1,\"479\":1,\"481\":1,\"539\":1,\"542\":1,\"614\":1,\"632\":1,\"634\":1,\"757\":1,\"760\":1,\"821\":1,\"839\":1,\"841\":1,\"980\":1,\"983\":1,\"1044\":1,\"1062\":1,\"1064\":1,\"1141\":1,\"1144\":1,\"1221\":1,\"1239\":1,\"1241\":1,\"1334\":1,\"1337\":1,\"1414\":1,\"1432\":1,\"1434\":1,\"1486\":1,\"1521\":1,\"1524\":1,\"1613\":1,\"1631\":1,\"1633\":1,\"1730\":1,\"1733\":1,\"1794\":1,\"1812\":1,\"1814\":1,\"1882\":1,\"1917\":1,\"1920\":1,\"2009\":1,\"2027\":1,\"2029\":1,\"2101\":1,\"2136\":1,\"2139\":1,\"2228\":1,\"2246\":1,\"2248\":1},\"1\":{\"61\":1,\"137\":5,\"138\":3,\"160\":5,\"161\":3,\"184\":5,\"185\":3,\"220\":5,\"221\":3,\"250\":5,\"251\":3,\"280\":5,\"281\":3,\"326\":5,\"327\":3,\"372\":5,\"373\":3,\"388\":2,\"391\":2,\"479\":2,\"481\":2,\"539\":2,\"542\":2,\"611\":1,\"614\":3,\"618\":2,\"632\":2,\"634\":2,\"717\":5,\"718\":3,\"757\":2,\"760\":2,\"818\":1,\"821\":3,\"825\":2,\"839\":2,\"841\":2,\"931\":1,\"940\":5,\"941\":3,\"980\":2,\"983\":2,\"1041\":1,\"1044\":3,\"1048\":2,\"1062\":2,\"1064\":2,\"1141\":2,\"1144\":2,\"1218\":1,\"1221\":3,\"1225\":2,\"1239\":2,\"1241\":2,\"1334\":2,\"1337\":2,\"1411\":1,\"1414\":3,\"1418\":2,\"1432\":2,\"1434\":2,\"1483\":1,\"1486\":3,\"1490\":2,\"1521\":2,\"1524\":2,\"1610\":1,\"1613\":3,\"1617\":2,\"1631\":2,\"1633\":2,\"1730\":2,\"1733\":2,\"1791\":1,\"1794\":3,\"1798\":2,\"1812\":2,\"1814\":2,\"1879\":1,\"1882\":3,\"1886\":2,\"1917\":2,\"1920\":2,\"2006\":1,\"2009\":3,\"2013\":2,\"2027\":2,\"2029\":2,\"2098\":1,\"2101\":3,\"2105\":2,\"2136\":2,\"2139\":2,\"2225\":1,\"2228\":3,\"2232\":2,\"2246\":2,\"2248\":2}}],[\"groups\",{\"1\":{\"49\":1}}],[\"gruendner\",{\"1\":{\"39\":1}}],[\"g\",{\"1\":{\"14\":1,\"49\":1,\"52\":1,\"63\":2,\"73\":1,\"127\":2,\"129\":2,\"134\":1,\"137\":5,\"138\":2,\"143\":2,\"150\":2,\"152\":2,\"157\":1,\"160\":4,\"161\":2,\"166\":2,\"174\":2,\"176\":2,\"181\":1,\"184\":4,\"185\":2,\"190\":2,\"206\":2,\"212\":1,\"217\":1,\"220\":4,\"221\":2,\"226\":2,\"236\":2,\"242\":1,\"247\":1,\"250\":4,\"251\":1,\"256\":2,\"266\":2,\"272\":1,\"277\":1,\"280\":4,\"281\":1,\"286\":2,\"312\":2,\"318\":1,\"323\":1,\"326\":4,\"327\":1,\"332\":2,\"358\":2,\"364\":1,\"369\":1,\"372\":4,\"373\":1,\"378\":2,\"703\":2,\"709\":1,\"714\":1,\"717\":4,\"718\":1,\"723\":2,\"926\":2,\"932\":1,\"937\":1,\"940\":4,\"941\":1,\"946\":2}}],[\"good\",{\"1\":{\"101\":1}}],[\"go\",{\"1\":{\"57\":1}}],[\"goal\",{\"0\":{\"49\":1}}],[\"goals\",{\"1\":{\"11\":1}}],[\"gothenburg\",{\"1\":{\"1\":1}}],[\"gecco\",{\"1\":{\"92\":1}}],[\"gecko\",{\"0\":{\"13\":1},\"1\":{\"4\":1,\"11\":1,\"13\":1,\"27\":1,\"31\":2,\"37\":1,\"126\":1,\"127\":1,\"128\":1,\"140\":1,\"149\":1,\"150\":1,\"151\":1,\"163\":1,\"173\":1,\"174\":1,\"175\":1,\"187\":1,\"205\":1,\"206\":1,\"207\":1,\"223\":1,\"235\":1,\"237\":1,\"253\":1,\"265\":1,\"267\":1,\"283\":1,\"311\":1,\"313\":1,\"329\":1,\"357\":1,\"359\":1,\"375\":1,\"702\":1,\"704\":1,\"720\":1,\"925\":1,\"927\":1,\"943\":1}}],[\"gesundheit\",{\"1\":{\"88\":1}}],[\"gespeichert\",{\"1\":{\"32\":1}}],[\"generate\",{\"1\":{\"137\":4,\"138\":3,\"160\":4,\"161\":3,\"184\":4,\"185\":3,\"220\":4,\"221\":3,\"250\":4,\"251\":3,\"280\":4,\"281\":3,\"326\":4,\"327\":3,\"372\":4,\"373\":3,\"717\":4,\"718\":3,\"940\":4,\"941\":3}}],[\"general\",{\"0\":{\"63\":1,\"292\":1,\"342\":1,\"683\":1,\"890\":1},\"1\":{\"98\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1,\"616\":1,\"823\":1,\"1046\":1,\"1223\":1,\"1416\":1,\"1488\":1,\"1615\":1,\"1796\":1,\"1884\":1,\"2011\":1,\"2103\":1,\"2230\":1}}],[\"gender\",{\"1\":{\"59\":1}}],[\"genutzt\",{\"1\":{\"32\":1}}],[\"gerne\",{\"1\":{\"37\":1}}],[\"germany\",{\"1\":{\"91\":1}}],[\"german\",{\"1\":{\"0\":1,\"20\":1,\"21\":1,\"26\":1,\"39\":1,\"62\":2,\"80\":1,\"81\":1,\"84\":1,\"88\":1,\"129\":1,\"143\":1,\"152\":1,\"166\":1,\"176\":1,\"190\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"gelegenheit\",{\"1\":{\"29\":1}}],[\"gemeinsame\",{\"1\":{\"29\":1,\"103\":1}}],[\"gets\",{\"1\":{\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"getting\",{\"0\":{\"27\":1},\"1\":{\"28\":1,\"305\":4,\"355\":4,\"696\":4,\"903\":4}}],[\"get\",{\"0\":{\"8\":1},\"1\":{\"7\":1,\"126\":1,\"132\":4,\"149\":1,\"155\":4,\"173\":1,\"179\":4,\"205\":1,\"215\":4,\"235\":1,\"245\":4,\"265\":1,\"275\":4,\"296\":1,\"306\":1,\"311\":1,\"321\":4,\"336\":1,\"346\":1,\"357\":1,\"367\":4,\"687\":1,\"697\":1,\"702\":1,\"712\":4,\"894\":1,\"904\":1,\"925\":1,\"935\":4}}],[\"ws\",{\"0\":{\"501\":1,\"503\":1,\"598\":1,\"600\":1,\"912\":1,\"914\":1,\"1204\":1,\"1206\":1,\"1292\":1,\"1294\":1,\"1397\":1,\"1399\":1,\"1596\":1,\"1598\":1,\"1688\":1,\"1690\":1,\"1865\":1,\"1867\":1,\"1992\":1,\"1994\":1,\"2084\":1,\"2086\":1,\"2211\":1,\"2213\":1,\"2303\":1,\"2305\":1},\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"501\":1,\"503\":1,\"598\":1,\"600\":1,\"912\":1,\"914\":1,\"1204\":1,\"1206\":1,\"1292\":1,\"1294\":1,\"1397\":1,\"1399\":1,\"1596\":1,\"1598\":1,\"1688\":1,\"1690\":1,\"1865\":1,\"1867\":1,\"1992\":1,\"1994\":1,\"2084\":1,\"2086\":1,\"2211\":1,\"2213\":1,\"2303\":1,\"2305\":1}}],[\"wss\",{\"1\":{\"54\":1,\"73\":1,\"134\":1,\"139\":2,\"157\":1,\"162\":2,\"181\":1,\"186\":2,\"217\":1,\"222\":2,\"247\":1,\"252\":2,\"277\":1,\"282\":2,\"323\":1,\"328\":2,\"369\":1,\"374\":2,\"714\":1,\"937\":1}}],[\"wget\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"931\":2,\"940\":1,\"941\":1}}],[\"written\",{\"1\":{\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"write\",{\"1\":{\"6\":1,\"126\":1,\"128\":1,\"137\":2,\"138\":1,\"140\":1,\"149\":1,\"151\":1,\"160\":2,\"161\":1,\"163\":1,\"173\":1,\"175\":1,\"184\":2,\"185\":1,\"187\":1,\"207\":1,\"220\":2,\"221\":1,\"223\":1,\"237\":1,\"250\":2,\"251\":1,\"253\":1,\"267\":1,\"280\":2,\"281\":1,\"283\":1,\"300\":1,\"313\":1,\"326\":2,\"327\":1,\"329\":1,\"350\":1,\"359\":1,\"372\":2,\"373\":1,\"375\":1,\"691\":1,\"704\":1,\"717\":2,\"718\":1,\"720\":1,\"898\":1,\"927\":1,\"940\":2,\"941\":1,\"943\":1}}],[\"www\",{\"1\":{\"80\":1}}],[\"warn\",{\"1\":{\"418\":1,\"569\":1,\"787\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\"warnning\",{\"1\":{\"396\":1,\"547\":1,\"765\":1,\"766\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"warning\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"waits\",{\"1\":{\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1}}],[\"wait\",{\"1\":{\"384\":1,\"475\":1,\"535\":1,\"628\":1,\"753\":1,\"835\":1,\"976\":1,\"1058\":1,\"1137\":1,\"1235\":1,\"1330\":1,\"1428\":1,\"1517\":1,\"1627\":1,\"1726\":1,\"1808\":1,\"1913\":1,\"2023\":1,\"2132\":1,\"2242\":1}}],[\"was\",{\"1\":{\"62\":1,\"81\":1,\"91\":2,\"138\":3,\"161\":3,\"185\":3,\"221\":3,\"251\":3,\"281\":3,\"327\":3,\"373\":3,\"718\":3,\"941\":3}}],[\"ways\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"way\",{\"1\":{\"49\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"want\",{\"1\":{\"28\":1,\"49\":1,\"50\":1,\"57\":1,\"99\":1,\"137\":1,\"167\":1,\"191\":1,\"226\":1,\"227\":1,\"256\":1,\"286\":1,\"300\":1,\"301\":1,\"303\":1,\"332\":1,\"350\":1,\"351\":1,\"353\":1,\"378\":1,\"691\":1,\"692\":1,\"694\":1,\"723\":1,\"898\":1,\"899\":1,\"901\":1,\"946\":1}}],[\"w\",{\"1\":{\"39\":1}}],[\"während\",{\"1\":{\"31\":1,\"32\":1}}],[\"whether\",{\"1\":{\"303\":1,\"304\":1,\"353\":1,\"354\":1,\"694\":1,\"695\":1,\"901\":1,\"902\":1}}],[\"where\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"193\":1,\"207\":1,\"436\":1,\"587\":1,\"808\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"when\",{\"1\":{\"54\":1,\"61\":2,\"77\":1,\"81\":1,\"84\":1,\"98\":1,\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"227\":1,\"237\":1,\"257\":1,\"267\":1,\"287\":1,\"299\":1,\"313\":1,\"333\":1,\"349\":1,\"359\":1,\"379\":1,\"396\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"488\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"547\":1,\"606\":1,\"610\":1,\"642\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"677\":1,\"690\":1,\"704\":1,\"724\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"765\":1,\"766\":1,\"817\":1,\"849\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"884\":1,\"897\":1,\"921\":1,\"927\":1,\"947\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"988\":1,\"989\":1,\"1040\":1,\"1072\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1107\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1149\":1,\"1150\":1,\"1213\":1,\"1217\":1,\"1249\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1284\":1,\"1301\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1342\":1,\"1343\":1,\"1406\":1,\"1410\":1,\"1442\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1477\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1531\":1,\"1532\":1,\"1577\":1,\"1588\":1,\"1605\":1,\"1609\":1,\"1644\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1680\":1,\"1697\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1738\":1,\"1739\":1,\"1790\":1,\"1822\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1857\":1,\"1874\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1927\":1,\"1928\":1,\"1973\":1,\"1984\":1,\"2001\":1,\"2005\":1,\"2040\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2076\":1,\"2093\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2146\":1,\"2147\":1,\"2192\":1,\"2203\":1,\"2220\":1,\"2224\":1,\"2259\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2295\":1,\"2312\":1}}],[\"why\",{\"0\":{\"61\":1},\"1\":{\"61\":1}}],[\"while\",{\"1\":{\"24\":1,\"76\":2,\"77\":1,\"81\":1}}],[\"which\",{\"1\":{\"11\":1,\"25\":1,\"52\":1,\"54\":2,\"55\":2,\"58\":1,\"59\":4,\"73\":1,\"84\":1,\"92\":1,\"95\":2,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"what\",{\"0\":{\"83\":1,\"84\":1},\"1\":{\"8\":1,\"49\":1,\"61\":2,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"who\",{\"1\":{\"5\":1,\"61\":1,\"101\":1,\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"worry\",{\"1\":{\"61\":1}}],[\"workflow\",{\"0\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"workflows\",{\"1\":{\"58\":1}}],[\"working\",{\"1\":{\"80\":1,\"81\":1}}],[\"work\",{\"1\":{\"28\":2,\"58\":1,\"61\":3,\"91\":1,\"100\":2,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"301\":1,\"304\":1,\"305\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"351\":1,\"354\":1,\"355\":1,\"692\":1,\"695\":1,\"696\":1,\"697\":1,\"700\":1,\"899\":1,\"902\":1,\"903\":1,\"904\":1,\"907\":1}}],[\"world\",{\"1\":{\"20\":1,\"26\":1,\"81\":3,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"would\",{\"1\":{\"5\":1,\"6\":1,\"59\":1}}],[\"won\",{\"1\":{\"1\":1}}],[\"wiki\",{\"1\":{\"32\":1,\"63\":1}}],[\"wird\",{\"1\":{\"32\":1}}],[\"wir\",{\"1\":{\"29\":1,\"31\":3,\"32\":1}}],[\"wide\",{\"1\":{\"24\":1}}],[\"willingness\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"will\",{\"0\":{\"2\":1,\"51\":1,\"84\":1},\"1\":{\"4\":1,\"10\":1,\"11\":3,\"63\":2,\"67\":1,\"80\":5,\"81\":7,\"84\":1,\"100\":5,\"126\":2,\"128\":2,\"129\":1,\"136\":2,\"137\":2,\"138\":2,\"139\":2,\"143\":2,\"149\":2,\"151\":2,\"152\":1,\"159\":2,\"160\":2,\"161\":2,\"162\":2,\"166\":2,\"173\":2,\"175\":2,\"176\":1,\"183\":2,\"184\":2,\"185\":2,\"186\":2,\"190\":2,\"205\":2,\"207\":2,\"212\":1,\"219\":2,\"220\":2,\"221\":2,\"222\":2,\"226\":5,\"235\":2,\"237\":1,\"242\":1,\"249\":2,\"250\":2,\"251\":2,\"252\":2,\"256\":5,\"265\":2,\"267\":1,\"272\":1,\"279\":2,\"280\":2,\"281\":2,\"282\":2,\"286\":5,\"293\":1,\"294\":1,\"300\":1,\"305\":1,\"311\":2,\"313\":1,\"318\":1,\"325\":2,\"326\":2,\"327\":2,\"328\":2,\"332\":5,\"343\":1,\"344\":1,\"350\":1,\"355\":1,\"357\":2,\"359\":1,\"364\":1,\"371\":2,\"372\":2,\"373\":2,\"374\":2,\"378\":5,\"437\":1,\"491\":1,\"505\":1,\"588\":1,\"602\":1,\"610\":1,\"613\":2,\"645\":1,\"684\":1,\"685\":1,\"691\":1,\"696\":1,\"702\":2,\"704\":1,\"709\":1,\"716\":2,\"717\":2,\"718\":2,\"719\":2,\"723\":5,\"810\":1,\"817\":1,\"820\":2,\"852\":1,\"891\":1,\"892\":1,\"898\":1,\"903\":1,\"917\":1,\"925\":2,\"927\":1,\"932\":1,\"939\":2,\"940\":2,\"941\":2,\"942\":2,\"946\":5,\"1033\":1,\"1040\":1,\"1043\":2,\"1075\":1,\"1194\":1,\"1209\":1,\"1217\":1,\"1220\":2,\"1252\":1,\"1297\":1,\"1387\":1,\"1402\":1,\"1410\":1,\"1413\":2,\"1445\":1,\"1482\":1,\"1485\":2,\"1581\":1,\"1601\":1,\"1609\":1,\"1612\":2,\"1648\":1,\"1693\":1,\"1783\":1,\"1790\":1,\"1793\":2,\"1825\":1,\"1870\":1,\"1878\":1,\"1881\":2,\"1977\":1,\"1997\":1,\"2005\":1,\"2008\":2,\"2044\":1,\"2089\":1,\"2097\":1,\"2100\":2,\"2196\":1,\"2216\":1,\"2224\":1,\"2227\":2,\"2263\":1,\"2308\":1}}],[\"without\",{\"1\":{\"1\":1,\"39\":1,\"99\":1,\"134\":2,\"138\":1,\"157\":2,\"161\":1,\"169\":2,\"181\":2,\"185\":1,\"193\":2,\"217\":2,\"221\":1,\"229\":2,\"247\":2,\"251\":1,\"259\":2,\"277\":2,\"281\":1,\"289\":2,\"301\":1,\"323\":2,\"327\":1,\"335\":2,\"351\":1,\"369\":2,\"373\":1,\"381\":2,\"610\":1,\"692\":1,\"714\":2,\"718\":1,\"726\":2,\"817\":1,\"899\":1,\"937\":2,\"941\":1,\"949\":2,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"within\",{\"1\":{\"0\":1,\"57\":2,\"58\":1,\"59\":1,\"62\":2,\"74\":1,\"91\":1,\"100\":1,\"614\":1,\"617\":2,\"821\":1,\"824\":2,\"1044\":1,\"1047\":2,\"1221\":1,\"1224\":2,\"1414\":1,\"1417\":2,\"1486\":1,\"1613\":1,\"1616\":2,\"1794\":1,\"1797\":2,\"1882\":1,\"2009\":1,\"2012\":2,\"2101\":1,\"2228\":1,\"2231\":2}}],[\"with\",{\"0\":{\"24\":1,\"27\":1},\"1\":{\"0\":1,\"7\":1,\"8\":1,\"10\":3,\"11\":3,\"23\":1,\"49\":1,\"52\":1,\"54\":4,\"55\":1,\"59\":1,\"61\":3,\"62\":3,\"63\":2,\"66\":1,\"67\":1,\"69\":1,\"73\":1,\"80\":4,\"81\":2,\"82\":2,\"83\":1,\"88\":1,\"90\":1,\"99\":1,\"101\":1,\"105\":1,\"106\":1,\"107\":1,\"108\":1,\"109\":1,\"110\":1,\"111\":1,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"123\":1,\"124\":1,\"126\":1,\"132\":1,\"133\":1,\"137\":1,\"138\":2,\"139\":1,\"149\":1,\"155\":1,\"156\":1,\"160\":1,\"161\":2,\"162\":1,\"168\":2,\"169\":4,\"170\":1,\"171\":1,\"173\":1,\"179\":1,\"180\":1,\"184\":1,\"185\":2,\"186\":1,\"192\":2,\"193\":7,\"202\":1,\"203\":1,\"215\":1,\"216\":1,\"220\":1,\"221\":2,\"222\":1,\"226\":1,\"228\":2,\"229\":4,\"237\":1,\"245\":1,\"246\":1,\"250\":1,\"251\":2,\"252\":1,\"256\":1,\"258\":2,\"259\":4,\"267\":1,\"275\":1,\"276\":1,\"280\":1,\"281\":2,\"282\":1,\"286\":1,\"288\":2,\"289\":4,\"293\":1,\"299\":1,\"300\":1,\"301\":1,\"302\":1,\"303\":2,\"305\":1,\"313\":1,\"321\":1,\"322\":1,\"326\":1,\"327\":2,\"328\":1,\"332\":1,\"334\":2,\"335\":4,\"343\":1,\"349\":1,\"350\":1,\"351\":1,\"352\":1,\"353\":2,\"355\":1,\"359\":1,\"367\":1,\"368\":1,\"372\":1,\"373\":2,\"374\":1,\"378\":1,\"380\":2,\"381\":4,\"397\":1,\"400\":1,\"403\":1,\"406\":1,\"410\":1,\"411\":1,\"413\":1,\"425\":1,\"429\":1,\"433\":1,\"434\":1,\"444\":1,\"451\":1,\"456\":1,\"458\":1,\"467\":1,\"472\":1,\"499\":1,\"512\":1,\"519\":1,\"524\":1,\"526\":1,\"548\":1,\"551\":1,\"554\":1,\"557\":1,\"561\":1,\"562\":1,\"564\":1,\"576\":1,\"580\":1,\"584\":1,\"585\":1,\"596\":1,\"610\":3,\"614\":1,\"617\":1,\"620\":1,\"625\":1,\"651\":1,\"658\":1,\"663\":1,\"665\":1,\"677\":1,\"684\":1,\"690\":1,\"691\":1,\"692\":1,\"693\":1,\"694\":2,\"696\":1,\"704\":1,\"712\":1,\"713\":1,\"717\":1,\"718\":2,\"719\":1,\"723\":1,\"725\":2,\"726\":4,\"730\":1,\"737\":1,\"742\":1,\"744\":1,\"767\":1,\"770\":1,\"773\":1,\"776\":1,\"779\":1,\"780\":1,\"782\":1,\"794\":1,\"798\":1,\"805\":1,\"806\":1,\"817\":3,\"821\":1,\"824\":1,\"827\":1,\"832\":1,\"858\":1,\"865\":1,\"870\":1,\"872\":1,\"884\":1,\"891\":1,\"897\":1,\"898\":1,\"899\":1,\"900\":1,\"901\":2,\"903\":1,\"910\":1,\"927\":1,\"935\":1,\"936\":1,\"940\":1,\"941\":2,\"942\":1,\"946\":1,\"948\":2,\"949\":4,\"953\":1,\"960\":1,\"965\":1,\"967\":1,\"990\":1,\"993\":1,\"996\":1,\"999\":1,\"1002\":1,\"1003\":1,\"1005\":1,\"1017\":1,\"1021\":1,\"1028\":1,\"1029\":1,\"1040\":3,\"1044\":1,\"1047\":1,\"1050\":1,\"1055\":1,\"1081\":1,\"1088\":1,\"1093\":1,\"1095\":1,\"1107\":1,\"1114\":1,\"1121\":1,\"1126\":1,\"1128\":1,\"1151\":1,\"1154\":1,\"1157\":1,\"1160\":1,\"1163\":1,\"1164\":1,\"1166\":1,\"1178\":1,\"1182\":1,\"1189\":1,\"1190\":1,\"1202\":1,\"1217\":3,\"1221\":1,\"1224\":1,\"1227\":1,\"1232\":1,\"1258\":1,\"1265\":1,\"1270\":1,\"1272\":1,\"1284\":1,\"1290\":1,\"1307\":1,\"1314\":1,\"1319\":1,\"1321\":1,\"1344\":1,\"1347\":1,\"1350\":1,\"1353\":1,\"1356\":1,\"1357\":1,\"1359\":1,\"1371\":1,\"1375\":1,\"1382\":1,\"1383\":1,\"1395\":1,\"1410\":3,\"1414\":1,\"1417\":1,\"1420\":1,\"1425\":1,\"1451\":1,\"1458\":1,\"1463\":1,\"1465\":1,\"1477\":1,\"1482\":2,\"1486\":1,\"1494\":1,\"1501\":1,\"1506\":1,\"1508\":1,\"1534\":1,\"1537\":1,\"1540\":1,\"1543\":1,\"1546\":1,\"1547\":1,\"1549\":1,\"1561\":1,\"1565\":1,\"1572\":1,\"1573\":1,\"1588\":1,\"1594\":1,\"1609\":3,\"1613\":1,\"1616\":1,\"1619\":1,\"1624\":1,\"1654\":1,\"1661\":1,\"1666\":1,\"1668\":1,\"1680\":1,\"1686\":1,\"1703\":1,\"1710\":1,\"1715\":1,\"1717\":1,\"1740\":1,\"1743\":1,\"1746\":1,\"1749\":1,\"1752\":1,\"1753\":1,\"1755\":1,\"1767\":1,\"1771\":1,\"1778\":1,\"1779\":1,\"1790\":3,\"1794\":1,\"1797\":1,\"1800\":1,\"1805\":1,\"1831\":1,\"1838\":1,\"1843\":1,\"1845\":1,\"1857\":1,\"1863\":1,\"1878\":2,\"1882\":1,\"1890\":1,\"1897\":1,\"1902\":1,\"1904\":1,\"1930\":1,\"1933\":1,\"1936\":1,\"1939\":1,\"1942\":1,\"1943\":1,\"1945\":1,\"1957\":1,\"1961\":1,\"1968\":1,\"1969\":1,\"1984\":1,\"1990\":1,\"2005\":3,\"2009\":1,\"2012\":1,\"2015\":1,\"2020\":1,\"2050\":1,\"2057\":1,\"2062\":1,\"2064\":1,\"2076\":1,\"2082\":1,\"2097\":2,\"2101\":1,\"2109\":1,\"2116\":1,\"2121\":1,\"2123\":1,\"2149\":1,\"2152\":1,\"2155\":1,\"2158\":1,\"2161\":1,\"2162\":1,\"2164\":1,\"2176\":1,\"2180\":1,\"2187\":1,\"2188\":1,\"2203\":1,\"2209\":1,\"2224\":3,\"2228\":1,\"2231\":1,\"2234\":1,\"2239\":1,\"2269\":1,\"2276\":1,\"2281\":1,\"2283\":1,\"2295\":1,\"2301\":1}}],[\"were\",{\"1\":{\"57\":1}}],[\"werden\",{\"1\":{\"31\":1,\"32\":5}}],[\"webuser\",{\"1\":{\"137\":1}}],[\"webbrowser\",{\"1\":{\"126\":1,\"149\":1,\"173\":1,\"205\":1}}],[\"webpage\",{\"1\":{\"78\":1,\"86\":1}}],[\"web\",{\"1\":{\"59\":1,\"73\":1,\"76\":2,\"77\":1,\"83\":1,\"106\":2,\"108\":2,\"110\":2,\"112\":2,\"114\":2,\"116\":2,\"118\":2,\"124\":2,\"133\":5,\"156\":5,\"171\":2,\"180\":5,\"192\":1,\"203\":2,\"216\":5,\"235\":1,\"237\":1,\"246\":5,\"265\":1,\"267\":1,\"276\":5,\"311\":1,\"313\":1,\"322\":5,\"357\":1,\"359\":1,\"368\":5,\"463\":1,\"531\":1,\"610\":1,\"670\":1,\"702\":1,\"704\":1,\"713\":5,\"749\":1,\"817\":1,\"877\":1,\"925\":1,\"927\":1,\"936\":5,\"972\":1,\"1040\":1,\"1100\":1,\"1133\":1,\"1217\":1,\"1277\":1,\"1326\":1,\"1410\":1,\"1470\":1,\"1513\":1,\"1577\":1,\"1609\":1,\"1673\":1,\"1722\":1,\"1790\":1,\"1850\":1,\"1909\":1,\"1973\":1,\"2005\":1,\"2069\":1,\"2128\":1,\"2192\":1,\"2224\":1,\"2288\":1}}],[\"website\",{\"1\":{\"88\":1,\"128\":1,\"140\":1,\"150\":1,\"151\":1,\"163\":1,\"174\":1,\"175\":1,\"187\":1,\"206\":1,\"207\":1,\"223\":1,\"236\":1,\"253\":1,\"266\":1,\"283\":1,\"312\":1,\"329\":1,\"358\":1,\"375\":1,\"703\":1,\"720\":1,\"926\":1,\"943\":1}}],[\"websites\",{\"1\":{\"57\":1}}],[\"webserver\",{\"1\":{\"74\":1}}],[\"webservicerequest\",{\"0\":{\"1533\":1,\"1639\":1,\"1929\":1,\"2035\":1,\"2148\":1,\"2254\":1},\"1\":{\"1533\":1,\"1639\":1,\"1929\":1,\"2035\":1,\"2148\":1,\"2254\":1}}],[\"webservices\",{\"1\":{\"63\":1,\"1533\":1,\"1639\":1,\"1929\":1,\"2035\":1,\"2148\":1,\"2254\":1}}],[\"webservice\",{\"1\":{\"54\":3}}],[\"websockets\",{\"1\":{\"54\":1}}],[\"websocket\",{\"1\":{\"54\":2,\"138\":1,\"139\":2,\"161\":1,\"162\":2,\"185\":1,\"186\":2,\"221\":1,\"222\":2,\"251\":1,\"252\":2,\"281\":1,\"282\":2,\"327\":1,\"328\":2,\"373\":1,\"374\":2,\"410\":1,\"411\":1,\"561\":1,\"562\":1,\"616\":1,\"718\":1,\"719\":2,\"779\":1,\"780\":1,\"823\":1,\"941\":1,\"942\":2,\"1002\":1,\"1003\":1,\"1046\":1,\"1163\":1,\"1164\":1,\"1223\":1,\"1356\":1,\"1357\":1,\"1416\":1,\"1546\":1,\"1547\":1,\"1615\":1,\"1752\":1,\"1753\":1,\"1796\":1,\"1942\":1,\"1943\":1,\"2011\":1,\"2161\":1,\"2162\":1,\"2230\":1}}],[\"weboberfläche\",{\"1\":{\"31\":1}}],[\"weitere\",{\"0\":{\"36\":1},\"1\":{\"31\":2,\"32\":1}}],[\"wettstein\",{\"1\":{\"18\":1,\"39\":6}}],[\"welcome\",{\"1\":{\"5\":1,\"8\":1,\"303\":2,\"305\":1,\"353\":2,\"355\":1,\"694\":2,\"696\":1,\"901\":2,\"903\":1}}],[\"well\",{\"1\":{\"1\":2,\"10\":1,\"49\":1,\"63\":1,\"80\":2,\"82\":1,\"84\":1,\"90\":1,\"136\":1,\"159\":1,\"183\":1,\"219\":1,\"249\":1,\"279\":1,\"301\":3,\"325\":1,\"351\":3,\"371\":1,\"674\":1,\"692\":3,\"716\":1,\"881\":1,\"899\":3,\"939\":1,\"1104\":1,\"1281\":1,\"1474\":1,\"1677\":1,\"1854\":1,\"2073\":1,\"2292\":1}}],[\"we\",{\"0\":{\"2\":1,\"51\":1,\"61\":1},\"1\":{\"1\":1,\"4\":1,\"5\":1,\"18\":1,\"27\":1,\"49\":5,\"57\":3,\"58\":1,\"61\":7,\"67\":1,\"95\":3,\"97\":3,\"98\":1,\"99\":2,\"100\":5,\"101\":1,\"102\":1,\"119\":3,\"122\":2,\"126\":1,\"129\":1,\"139\":1,\"144\":3,\"147\":2,\"149\":1,\"152\":1,\"162\":1,\"168\":1,\"169\":1,\"173\":1,\"176\":1,\"186\":1,\"192\":1,\"193\":3,\"194\":3,\"197\":2,\"198\":3,\"201\":2,\"205\":1,\"207\":1,\"212\":1,\"222\":1,\"226\":1,\"228\":1,\"229\":1,\"230\":3,\"233\":2,\"235\":1,\"237\":1,\"242\":1,\"252\":1,\"256\":1,\"258\":1,\"259\":1,\"260\":3,\"263\":2,\"265\":1,\"267\":1,\"272\":1,\"282\":1,\"286\":1,\"288\":1,\"289\":1,\"290\":1,\"301\":2,\"303\":3,\"304\":1,\"305\":4,\"306\":3,\"309\":2,\"311\":1,\"313\":1,\"318\":1,\"328\":1,\"332\":1,\"334\":1,\"335\":1,\"336\":3,\"339\":2,\"340\":1,\"351\":2,\"353\":3,\"354\":1,\"355\":4,\"357\":1,\"359\":1,\"364\":1,\"374\":1,\"378\":1,\"380\":1,\"381\":1,\"681\":1,\"692\":2,\"694\":3,\"695\":1,\"696\":4,\"697\":3,\"700\":2,\"702\":1,\"704\":1,\"709\":1,\"719\":1,\"723\":1,\"725\":1,\"726\":1,\"888\":1,\"899\":2,\"901\":3,\"902\":1,\"903\":4,\"904\":3,\"907\":2,\"925\":1,\"927\":1,\"932\":1,\"942\":1,\"946\":1,\"948\":1,\"949\":1}}],[\"l35\",{\"1\":{\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"l39\",{\"1\":{\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l54\",{\"1\":{\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l59\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1}}],[\"l98\",{\"1\":{\"161\":1,\"185\":1,\"221\":1}}],[\"l97\",{\"1\":{\"161\":1,\"185\":1,\"221\":1}}],[\"l90\",{\"1\":{\"138\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"l89\",{\"1\":{\"138\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"l40\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1}}],[\"l44\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1}}],[\"l13\",{\"1\":{\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"l142\",{\"1\":{\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l141\",{\"1\":{\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l147\",{\"1\":{\"160\":1,\"184\":1,\"220\":1}}],[\"l146\",{\"1\":{\"160\":1,\"184\":1,\"220\":1}}],[\"l149\",{\"1\":{\"137\":1}}],[\"l18\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1}}],[\"l115\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l114\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"l150\",{\"1\":{\"137\":1}}],[\"lsb\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"laptop\",{\"1\":{\"83\":1}}],[\"laboratory\",{\"1\":{\"88\":1}}],[\"lab\",{\"1\":{\"80\":1,\"81\":1}}],[\"lanes\",{\"1\":{\"67\":1}}],[\"language\",{\"1\":{\"60\":1}}],[\"last\",{\"1\":{\"63\":1,\"81\":1,\"929\":1}}],[\"laden\",{\"1\":{\"29\":1}}],[\"later\",{\"1\":{\"28\":1}}],[\"latest\",{\"1\":{\"7\":1,\"95\":5,\"132\":2,\"139\":1,\"155\":2,\"162\":1,\"179\":2,\"186\":1,\"215\":2,\"222\":1,\"245\":2,\"252\":1,\"275\":2,\"282\":1,\"305\":1,\"321\":2,\"328\":1,\"355\":1,\"367\":2,\"374\":1,\"696\":1,\"712\":2,\"719\":1,\"903\":1,\"935\":2,\"942\":1}}],[\"loaded\",{\"1\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"lockwaittime\",{\"0\":{\"384\":1,\"475\":1,\"535\":1,\"628\":1,\"753\":1,\"835\":1,\"976\":1,\"1058\":1,\"1137\":1,\"1235\":1,\"1330\":1,\"1428\":1,\"1517\":1,\"1627\":1,\"1726\":1,\"1808\":1,\"1913\":1,\"2023\":1,\"2132\":1,\"2242\":1},\"1\":{\"384\":1,\"475\":1,\"535\":1,\"628\":1,\"753\":1,\"835\":1,\"976\":1,\"1058\":1,\"1137\":1,\"1235\":1,\"1330\":1,\"1428\":1,\"1517\":1,\"1627\":1,\"1726\":1,\"1808\":1,\"1913\":1,\"2023\":1,\"2132\":1,\"2242\":1}}],[\"lock\",{\"1\":{\"383\":1,\"384\":1,\"474\":1,\"475\":1,\"534\":1,\"535\":1,\"627\":1,\"628\":1,\"752\":1,\"753\":1,\"834\":1,\"835\":1,\"975\":1,\"976\":1,\"1057\":1,\"1058\":1,\"1136\":1,\"1137\":1,\"1234\":1,\"1235\":1,\"1329\":1,\"1330\":1,\"1427\":1,\"1428\":1,\"1516\":1,\"1517\":1,\"1626\":1,\"1627\":1,\"1725\":1,\"1726\":1,\"1807\":1,\"1808\":1,\"1912\":1,\"1913\":1,\"2022\":1,\"2023\":1,\"2131\":1,\"2132\":1,\"2241\":1,\"2242\":1}}],[\"location\",{\"1\":{\"419\":2,\"570\":2,\"788\":2,\"1011\":2,\"1172\":2,\"1365\":2,\"1555\":2,\"1761\":2,\"1951\":2,\"2170\":2}}],[\"locations\",{\"1\":{\"62\":1}}],[\"located\",{\"1\":{\"52\":2,\"54\":1}}],[\"localhost\",{\"1\":{\"416\":1,\"422\":1,\"427\":1,\"428\":1,\"567\":1,\"573\":1,\"578\":1,\"579\":1,\"785\":1,\"791\":1,\"796\":1,\"797\":1,\"1008\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1169\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1362\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1552\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1758\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1948\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"2167\":1,\"2173\":1,\"2178\":1,\"2179\":1}}],[\"local\",{\"0\":{\"400\":1,\"401\":1,\"402\":1,\"551\":1,\"552\":1,\"553\":1,\"770\":1,\"771\":1,\"772\":1,\"993\":1,\"994\":1,\"995\":1,\"1154\":1,\"1155\":1,\"1156\":1,\"1347\":1,\"1348\":1,\"1349\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1743\":1,\"1744\":1,\"1745\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"2152\":1,\"2153\":1,\"2154\":1},\"1\":{\"0\":3,\"52\":1,\"54\":1,\"76\":3,\"77\":3,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"134\":7,\"157\":7,\"171\":1,\"181\":7,\"203\":1,\"217\":7,\"247\":7,\"277\":7,\"302\":1,\"323\":7,\"352\":1,\"369\":7,\"397\":2,\"398\":1,\"399\":1,\"400\":2,\"401\":2,\"402\":2,\"406\":1,\"408\":1,\"409\":1,\"415\":1,\"433\":1,\"434\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"486\":1,\"487\":1,\"526\":1,\"548\":2,\"549\":1,\"550\":1,\"551\":2,\"552\":2,\"553\":2,\"557\":1,\"559\":1,\"560\":1,\"566\":1,\"584\":1,\"585\":1,\"610\":2,\"620\":1,\"621\":1,\"622\":1,\"639\":1,\"640\":1,\"641\":1,\"665\":1,\"674\":1,\"693\":1,\"714\":7,\"744\":1,\"766\":1,\"767\":2,\"768\":1,\"769\":1,\"770\":2,\"771\":2,\"772\":2,\"776\":1,\"778\":1,\"784\":1,\"805\":1,\"806\":1,\"817\":2,\"827\":1,\"828\":1,\"829\":1,\"846\":1,\"847\":1,\"848\":1,\"872\":1,\"881\":1,\"900\":1,\"937\":7,\"967\":1,\"989\":1,\"990\":2,\"991\":1,\"992\":1,\"993\":2,\"994\":2,\"995\":2,\"999\":1,\"1001\":1,\"1007\":1,\"1028\":1,\"1029\":1,\"1040\":2,\"1050\":1,\"1051\":1,\"1052\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1095\":1,\"1104\":1,\"1128\":1,\"1150\":1,\"1151\":2,\"1152\":1,\"1153\":1,\"1154\":2,\"1155\":2,\"1156\":2,\"1160\":1,\"1162\":1,\"1168\":1,\"1189\":1,\"1190\":1,\"1217\":2,\"1227\":1,\"1228\":1,\"1229\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1272\":1,\"1281\":1,\"1321\":1,\"1343\":1,\"1344\":2,\"1345\":1,\"1346\":1,\"1347\":2,\"1348\":2,\"1349\":2,\"1353\":1,\"1355\":1,\"1361\":1,\"1382\":1,\"1383\":1,\"1410\":2,\"1420\":1,\"1421\":1,\"1422\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1465\":1,\"1474\":1,\"1482\":2,\"1508\":1,\"1532\":1,\"1534\":2,\"1535\":1,\"1536\":1,\"1537\":2,\"1538\":2,\"1539\":2,\"1543\":1,\"1545\":1,\"1551\":1,\"1572\":1,\"1573\":1,\"1586\":1,\"1609\":2,\"1619\":1,\"1620\":1,\"1621\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1668\":1,\"1677\":1,\"1717\":1,\"1739\":1,\"1740\":2,\"1741\":1,\"1742\":1,\"1743\":2,\"1744\":2,\"1745\":2,\"1749\":1,\"1751\":1,\"1757\":1,\"1778\":1,\"1779\":1,\"1790\":2,\"1800\":1,\"1801\":1,\"1802\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1845\":1,\"1854\":1,\"1878\":2,\"1904\":1,\"1928\":1,\"1930\":2,\"1931\":1,\"1932\":1,\"1933\":2,\"1934\":2,\"1935\":2,\"1939\":1,\"1941\":1,\"1947\":1,\"1968\":1,\"1969\":1,\"1982\":1,\"2005\":2,\"2015\":1,\"2016\":1,\"2017\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2064\":1,\"2073\":1,\"2097\":2,\"2123\":1,\"2147\":1,\"2149\":2,\"2150\":1,\"2151\":1,\"2152\":2,\"2153\":2,\"2154\":2,\"2158\":1,\"2160\":1,\"2166\":1,\"2187\":1,\"2188\":1,\"2201\":1,\"2224\":2,\"2234\":1,\"2235\":1,\"2236\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2283\":1,\"2292\":1}}],[\"love\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"lowercase\",{\"1\":{\"137\":2,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"logout\",{\"0\":{\"446\":1,\"447\":1,\"514\":1,\"515\":1,\"653\":1,\"654\":1,\"732\":1,\"733\":1,\"860\":1,\"861\":1,\"955\":1,\"956\":1,\"1083\":1,\"1084\":1,\"1116\":1,\"1117\":1,\"1260\":1,\"1261\":1,\"1309\":1,\"1310\":1,\"1453\":1,\"1454\":1,\"1496\":1,\"1497\":1,\"1656\":1,\"1657\":1,\"1705\":1,\"1706\":1,\"1833\":1,\"1834\":1,\"1892\":1,\"1893\":1,\"2052\":1,\"2053\":1,\"2111\":1,\"2112\":1,\"2271\":1,\"2272\":1},\"1\":{\"446\":3,\"447\":3,\"514\":3,\"515\":3,\"653\":3,\"654\":3,\"674\":1,\"675\":5,\"678\":1,\"732\":3,\"733\":3,\"860\":3,\"861\":3,\"881\":1,\"882\":5,\"885\":1,\"955\":3,\"956\":3,\"1083\":3,\"1084\":3,\"1104\":1,\"1105\":5,\"1108\":1,\"1116\":3,\"1117\":3,\"1260\":3,\"1261\":3,\"1281\":1,\"1282\":5,\"1285\":1,\"1309\":3,\"1310\":3,\"1453\":3,\"1454\":3,\"1474\":1,\"1475\":5,\"1478\":1,\"1496\":3,\"1497\":3,\"1586\":1,\"1587\":5,\"1589\":1,\"1656\":3,\"1657\":3,\"1677\":1,\"1678\":5,\"1681\":1,\"1705\":3,\"1706\":3,\"1833\":3,\"1834\":3,\"1854\":1,\"1855\":5,\"1858\":1,\"1892\":3,\"1893\":3,\"1982\":1,\"1983\":5,\"1985\":1,\"2052\":3,\"2053\":3,\"2073\":1,\"2074\":5,\"2077\":1,\"2111\":3,\"2112\":3,\"2201\":1,\"2202\":5,\"2204\":1,\"2271\":3,\"2272\":3,\"2292\":1,\"2293\":5,\"2296\":1}}],[\"logged\",{\"1\":{\"423\":1,\"574\":1,\"792\":1,\"1015\":1,\"1176\":1,\"1369\":1,\"1559\":1,\"1765\":1,\"1955\":1,\"2174\":1}}],[\"logging\",{\"1\":{\"396\":1,\"402\":1,\"405\":1,\"473\":1,\"547\":1,\"553\":1,\"556\":1,\"626\":1,\"765\":2,\"766\":2,\"772\":1,\"775\":1,\"833\":1,\"988\":2,\"989\":2,\"995\":1,\"998\":1,\"1056\":1,\"1149\":2,\"1150\":2,\"1156\":1,\"1159\":1,\"1233\":1,\"1342\":2,\"1343\":2,\"1349\":1,\"1352\":1,\"1426\":1,\"1527\":1,\"1528\":1,\"1531\":2,\"1532\":2,\"1533\":1,\"1539\":1,\"1542\":1,\"1625\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":2,\"1739\":2,\"1745\":1,\"1748\":1,\"1806\":1,\"1923\":1,\"1924\":1,\"1927\":2,\"1928\":2,\"1929\":1,\"1935\":1,\"1938\":1,\"2021\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":2,\"2147\":2,\"2148\":1,\"2154\":1,\"2157\":1,\"2240\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"loging\",{\"1\":{\"396\":1,\"547\":1}}],[\"logic\",{\"1\":{\"62\":1}}],[\"logbuildinfo\",{\"1\":{\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"726\":2,\"949\":2}}],[\"logs\",{\"0\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1},\"1\":{\"137\":1,\"138\":1,\"139\":5,\"160\":1,\"161\":1,\"162\":5,\"168\":1,\"169\":1,\"184\":1,\"185\":1,\"186\":5,\"192\":1,\"193\":1,\"220\":1,\"221\":1,\"222\":5,\"228\":1,\"229\":1,\"250\":1,\"251\":1,\"252\":5,\"258\":1,\"259\":1,\"280\":1,\"281\":1,\"282\":5,\"288\":1,\"289\":1,\"305\":1,\"326\":1,\"327\":1,\"328\":5,\"334\":1,\"335\":1,\"355\":1,\"372\":1,\"373\":1,\"374\":5,\"380\":1,\"381\":1,\"696\":1,\"717\":1,\"718\":1,\"719\":5,\"725\":1,\"726\":1,\"903\":1,\"940\":1,\"941\":1,\"942\":5,\"948\":1,\"949\":1}}],[\"log\",{\"0\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1},\"1\":{\"70\":2,\"71\":2,\"137\":2,\"138\":2,\"139\":8,\"160\":2,\"161\":2,\"162\":8,\"169\":2,\"184\":2,\"185\":2,\"186\":8,\"193\":2,\"220\":2,\"221\":2,\"222\":8,\"229\":2,\"250\":2,\"251\":2,\"252\":8,\"259\":2,\"280\":2,\"281\":2,\"282\":8,\"289\":2,\"302\":2,\"326\":2,\"327\":2,\"328\":8,\"335\":2,\"352\":2,\"372\":2,\"373\":2,\"374\":8,\"381\":2,\"394\":2,\"395\":2,\"396\":2,\"418\":3,\"419\":6,\"545\":2,\"546\":2,\"547\":2,\"569\":3,\"570\":6,\"693\":2,\"717\":2,\"718\":2,\"719\":8,\"726\":2,\"763\":2,\"764\":2,\"765\":2,\"766\":2,\"787\":3,\"788\":6,\"900\":2,\"940\":2,\"941\":2,\"942\":8,\"949\":2,\"986\":2,\"987\":2,\"988\":2,\"989\":2,\"1010\":3,\"1011\":6,\"1147\":2,\"1148\":2,\"1149\":2,\"1150\":2,\"1171\":3,\"1172\":6,\"1340\":2,\"1341\":2,\"1342\":2,\"1343\":2,\"1364\":3,\"1365\":6,\"1527\":2,\"1528\":2,\"1529\":2,\"1530\":2,\"1531\":2,\"1532\":2,\"1533\":2,\"1554\":3,\"1555\":6,\"1637\":2,\"1638\":2,\"1639\":2,\"1736\":2,\"1737\":2,\"1738\":2,\"1739\":2,\"1760\":3,\"1761\":6,\"1923\":2,\"1924\":2,\"1925\":2,\"1926\":2,\"1927\":2,\"1928\":2,\"1929\":2,\"1950\":3,\"1951\":6,\"2033\":2,\"2034\":2,\"2035\":2,\"2142\":2,\"2143\":2,\"2144\":2,\"2145\":2,\"2146\":2,\"2147\":2,\"2148\":2,\"2169\":3,\"2170\":6,\"2252\":2,\"2253\":2,\"2254\":2}}],[\"look\",{\"1\":{\"61\":1,\"67\":1,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"looking\",{\"1\":{\"27\":1,\"82\":1}}],[\"least\",{\"1\":{\"427\":1,\"578\":1,\"796\":1,\"1019\":1,\"1180\":1,\"1373\":1,\"1563\":1,\"1769\":1,\"1959\":1,\"2178\":1}}],[\"leaked\",{\"1\":{\"396\":1,\"547\":1,\"765\":1,\"766\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"lead\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"learned\",{\"1\":{\"81\":1}}],[\"learn\",{\"0\":{\"84\":1},\"1\":{\"27\":1,\"84\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1,\"928\":1}}],[\"let\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"letters\",{\"1\":{\"53\":1}}],[\"less\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"lessons\",{\"1\":{\"81\":1}}],[\"legacy\",{\"1\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"legal\",{\"0\":{\"101\":1},\"1\":{\"58\":1,\"101\":1}}],[\"legislation\",{\"1\":{\"62\":1}}],[\"level\",{\"1\":{\"58\":6,\"95\":1,\"301\":2,\"351\":2,\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"692\":2,\"810\":1,\"852\":1,\"899\":2,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1}}],[\"levels\",{\"1\":{\"58\":2,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"leverage\",{\"1\":{\"27\":1,\"89\":1}}],[\"leveraging\",{\"1\":{\"20\":1}}],[\"left\",{\"1\":{\"55\":2}}],[\"leipzig\",{\"0\":{\"15\":1},\"1\":{\"10\":1,\"15\":1}}],[\"limited\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"liquibase\",{\"0\":{\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1},\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"383\":2,\"384\":2,\"385\":3,\"386\":2,\"474\":2,\"475\":2,\"476\":3,\"477\":2,\"534\":2,\"535\":2,\"536\":3,\"537\":2,\"627\":2,\"628\":2,\"629\":3,\"630\":2,\"717\":1,\"718\":1,\"752\":2,\"753\":2,\"754\":3,\"755\":2,\"834\":2,\"835\":2,\"836\":3,\"837\":2,\"940\":1,\"941\":1,\"975\":2,\"976\":2,\"977\":3,\"978\":2,\"1057\":2,\"1058\":2,\"1059\":3,\"1060\":2,\"1136\":2,\"1137\":2,\"1138\":3,\"1139\":2,\"1234\":2,\"1235\":2,\"1236\":3,\"1237\":2,\"1329\":2,\"1330\":2,\"1331\":3,\"1332\":2,\"1427\":2,\"1428\":2,\"1429\":3,\"1430\":2,\"1516\":2,\"1517\":2,\"1518\":3,\"1519\":2,\"1626\":2,\"1627\":2,\"1628\":3,\"1629\":2,\"1725\":2,\"1726\":2,\"1727\":3,\"1728\":2,\"1807\":2,\"1808\":2,\"1809\":3,\"1810\":2,\"1912\":2,\"1913\":2,\"1914\":3,\"1915\":2,\"2022\":2,\"2023\":2,\"2024\":3,\"2025\":2,\"2131\":2,\"2132\":2,\"2133\":3,\"2134\":2,\"2241\":2,\"2242\":2,\"2243\":3,\"2244\":2}}],[\"link\",{\"1\":{\"931\":1}}],[\"linkage\",{\"1\":{\"0\":1,\"39\":1,\"42\":1,\"63\":1,\"81\":1}}],[\"line\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"lines\",{\"1\":{\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"184\":2,\"185\":1,\"220\":2,\"221\":1,\"250\":2,\"251\":1,\"280\":2,\"281\":1,\"326\":2,\"327\":1,\"372\":2,\"373\":1,\"717\":2,\"718\":1,\"940\":2,\"941\":1}}],[\"linux\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"library\",{\"1\":{\"61\":1}}],[\"listing\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"list\",{\"0\":{\"50\":1,\"125\":1,\"148\":1,\"172\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"701\":1,\"924\":1},\"1\":{\"49\":6,\"50\":1,\"63\":1,\"68\":1,\"70\":2,\"73\":1,\"74\":1,\"95\":1,\"125\":1,\"126\":5,\"128\":1,\"132\":2,\"137\":1,\"142\":1,\"148\":1,\"149\":5,\"151\":1,\"155\":2,\"165\":1,\"172\":1,\"173\":5,\"175\":1,\"179\":2,\"189\":1,\"193\":2,\"205\":4,\"207\":4,\"209\":1,\"215\":2,\"225\":1,\"235\":4,\"237\":2,\"239\":1,\"245\":2,\"255\":1,\"265\":4,\"267\":2,\"269\":1,\"275\":2,\"285\":1,\"311\":4,\"313\":2,\"315\":1,\"321\":2,\"331\":1,\"357\":4,\"359\":2,\"361\":1,\"367\":2,\"377\":1,\"409\":1,\"422\":1,\"427\":1,\"428\":1,\"432\":3,\"436\":2,\"437\":2,\"439\":1,\"486\":3,\"487\":1,\"491\":2,\"493\":1,\"560\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":3,\"587\":2,\"588\":2,\"590\":1,\"610\":1,\"611\":1,\"639\":3,\"640\":1,\"645\":2,\"647\":1,\"702\":4,\"704\":2,\"706\":1,\"712\":2,\"722\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":3,\"808\":2,\"810\":2,\"812\":1,\"817\":1,\"818\":1,\"846\":3,\"847\":1,\"852\":2,\"854\":1,\"925\":4,\"927\":2,\"929\":1,\"935\":2,\"945\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":3,\"1031\":2,\"1033\":2,\"1035\":1,\"1040\":1,\"1041\":1,\"1069\":3,\"1070\":1,\"1075\":2,\"1077\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":3,\"1192\":2,\"1194\":2,\"1196\":1,\"1217\":1,\"1218\":1,\"1246\":3,\"1247\":1,\"1252\":2,\"1254\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":3,\"1385\":2,\"1387\":2,\"1389\":1,\"1410\":1,\"1411\":1,\"1439\":3,\"1440\":1,\"1445\":2,\"1447\":1,\"1482\":1,\"1483\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":3,\"1575\":2,\"1581\":2,\"1583\":1,\"1609\":1,\"1610\":1,\"1641\":3,\"1642\":1,\"1648\":2,\"1650\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":3,\"1781\":2,\"1783\":2,\"1785\":1,\"1790\":1,\"1791\":1,\"1819\":3,\"1820\":1,\"1825\":2,\"1827\":1,\"1878\":1,\"1879\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":3,\"1971\":2,\"1977\":2,\"1979\":1,\"2005\":1,\"2006\":1,\"2037\":3,\"2038\":1,\"2044\":2,\"2046\":1,\"2097\":1,\"2098\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":3,\"2190\":2,\"2196\":2,\"2198\":1,\"2224\":1,\"2225\":1,\"2256\":3,\"2257\":1,\"2263\":2,\"2265\":1}}],[\"lists\",{\"0\":{\"48\":1},\"1\":{\"44\":1,\"73\":2,\"125\":1,\"128\":1,\"148\":1,\"151\":1,\"172\":1,\"175\":1,\"204\":1,\"207\":1,\"234\":1,\"237\":1,\"264\":1,\"267\":1,\"296\":1,\"310\":1,\"313\":1,\"346\":1,\"356\":1,\"359\":1,\"687\":1,\"701\":1,\"704\":1,\"894\":1,\"924\":1,\"927\":1}}],[\"listed\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"294\":1,\"323\":1,\"344\":1,\"369\":1,\"685\":1,\"714\":1,\"892\":1,\"937\":1}}],[\"liste\",{\"1\":{\"31\":1}}],[\"life\",{\"0\":{\"15\":1},\"1\":{\"15\":1}}],[\"like\",{\"1\":{\"5\":1,\"6\":1,\"49\":1,\"58\":2,\"137\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"226\":1,\"251\":1,\"256\":1,\"281\":1,\"286\":1,\"300\":1,\"327\":1,\"332\":1,\"350\":1,\"373\":1,\"378\":1,\"691\":1,\"718\":1,\"723\":1,\"898\":1,\"941\":1,\"946\":1}}],[\"cc\",{\"1\":{\"428\":2,\"579\":2,\"797\":2,\"1020\":2,\"1181\":2,\"1374\":2,\"1564\":2,\"1770\":2,\"1960\":2,\"2179\":2}}],[\"cmd\",{\"1\":{\"192\":1,\"193\":1}}],[\"cpu\",{\"1\":{\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"cp\",{\"1\":{\"168\":1,\"169\":1,\"192\":2,\"193\":2,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"cd\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"cda\",{\"1\":{\"58\":1}}],[\"cs\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"curl\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"currentuser\",{\"0\":{\"1527\":1,\"1637\":1,\"1923\":1,\"2033\":1,\"2142\":1,\"2252\":1},\"1\":{\"1527\":1,\"1637\":1,\"1923\":1,\"2033\":1,\"2142\":1,\"2252\":1}}],[\"currently\",{\"1\":{\"74\":1,\"119\":1,\"122\":1,\"126\":1,\"129\":1,\"144\":1,\"147\":1,\"149\":1,\"152\":1,\"173\":1,\"176\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1,\"1489\":1,\"1527\":1,\"1637\":1,\"1885\":1,\"1923\":1,\"2033\":1,\"2104\":1,\"2142\":1,\"2252\":1}}],[\"current\",{\"1\":{\"69\":1,\"125\":1,\"132\":2,\"148\":1,\"155\":2,\"172\":1,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"cvd\",{\"1\":{\"98\":1}}],[\"ce\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"certtool\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":1,\"641\":1,\"717\":1,\"817\":1,\"848\":1,\"940\":1,\"1040\":1,\"1071\":1,\"1217\":1,\"1248\":1,\"1410\":1,\"1441\":1,\"1482\":1,\"1609\":1,\"1643\":1,\"1790\":1,\"1821\":1,\"1878\":1,\"2005\":1,\"2039\":1,\"2097\":1,\"2224\":1,\"2258\":1}}],[\"certain\",{\"1\":{\"73\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"certificates\",{\"0\":{\"133\":1,\"136\":1,\"156\":1,\"159\":1,\"180\":1,\"183\":1,\"216\":1,\"219\":1,\"246\":1,\"249\":1,\"276\":1,\"279\":1,\"322\":1,\"325\":1,\"368\":1,\"371\":1,\"713\":1,\"716\":1,\"936\":1,\"939\":1},\"1\":{\"63\":2,\"74\":3,\"76\":1,\"77\":2,\"126\":1,\"132\":1,\"133\":3,\"137\":4,\"138\":1,\"149\":1,\"155\":1,\"156\":3,\"160\":3,\"161\":1,\"173\":1,\"179\":1,\"180\":3,\"184\":3,\"185\":1,\"205\":1,\"215\":1,\"216\":3,\"220\":3,\"221\":1,\"226\":2,\"235\":1,\"245\":1,\"246\":3,\"250\":3,\"251\":1,\"256\":2,\"265\":1,\"275\":1,\"276\":3,\"280\":3,\"281\":1,\"286\":2,\"311\":1,\"321\":1,\"322\":3,\"326\":3,\"327\":1,\"332\":2,\"357\":1,\"367\":1,\"368\":3,\"372\":3,\"373\":1,\"378\":2,\"406\":3,\"429\":2,\"456\":3,\"458\":3,\"472\":3,\"504\":1,\"505\":1,\"506\":1,\"524\":3,\"526\":3,\"557\":3,\"580\":2,\"601\":1,\"602\":1,\"603\":1,\"610\":1,\"613\":1,\"618\":2,\"625\":3,\"663\":3,\"665\":3,\"674\":2,\"677\":2,\"702\":1,\"712\":1,\"713\":3,\"717\":3,\"718\":1,\"723\":2,\"742\":3,\"744\":3,\"776\":3,\"798\":2,\"817\":1,\"820\":1,\"825\":2,\"832\":3,\"870\":3,\"872\":3,\"881\":2,\"884\":2,\"916\":1,\"917\":1,\"918\":1,\"925\":1,\"935\":1,\"936\":3,\"940\":3,\"941\":1,\"946\":2,\"965\":3,\"967\":3,\"999\":3,\"1021\":2,\"1040\":1,\"1043\":1,\"1048\":2,\"1055\":3,\"1093\":3,\"1095\":3,\"1104\":2,\"1107\":2,\"1126\":3,\"1128\":3,\"1160\":3,\"1182\":2,\"1208\":1,\"1209\":1,\"1210\":1,\"1217\":1,\"1220\":1,\"1225\":2,\"1232\":3,\"1270\":3,\"1272\":3,\"1281\":2,\"1284\":2,\"1296\":1,\"1297\":1,\"1298\":1,\"1319\":3,\"1321\":3,\"1353\":3,\"1375\":2,\"1401\":1,\"1402\":1,\"1403\":1,\"1410\":1,\"1413\":1,\"1418\":2,\"1425\":3,\"1463\":3,\"1465\":3,\"1474\":2,\"1477\":2,\"1482\":1,\"1485\":1,\"1490\":2,\"1506\":3,\"1508\":3,\"1543\":3,\"1565\":2,\"1586\":2,\"1588\":2,\"1600\":1,\"1601\":1,\"1602\":1,\"1609\":1,\"1612\":1,\"1617\":2,\"1624\":3,\"1666\":3,\"1668\":3,\"1677\":2,\"1680\":2,\"1692\":1,\"1693\":1,\"1694\":1,\"1715\":3,\"1717\":3,\"1749\":3,\"1771\":2,\"1790\":1,\"1793\":1,\"1798\":2,\"1805\":3,\"1843\":3,\"1845\":3,\"1854\":2,\"1857\":2,\"1869\":1,\"1870\":1,\"1871\":1,\"1878\":1,\"1881\":1,\"1886\":2,\"1902\":3,\"1904\":3,\"1939\":3,\"1961\":2,\"1982\":2,\"1984\":2,\"1996\":1,\"1997\":1,\"1998\":1,\"2005\":1,\"2008\":1,\"2013\":2,\"2020\":3,\"2062\":3,\"2064\":3,\"2073\":2,\"2076\":2,\"2088\":1,\"2089\":1,\"2090\":1,\"2097\":1,\"2100\":1,\"2105\":2,\"2121\":3,\"2123\":3,\"2158\":3,\"2180\":2,\"2201\":2,\"2203\":2,\"2215\":1,\"2216\":1,\"2217\":1,\"2224\":1,\"2227\":1,\"2232\":2,\"2239\":3,\"2281\":3,\"2283\":3,\"2292\":2,\"2295\":2,\"2307\":1,\"2308\":1,\"2309\":1}}],[\"certificate\",{\"0\":{\"75\":1,\"397\":1,\"398\":1,\"399\":2,\"406\":1,\"413\":1,\"414\":1,\"415\":2,\"429\":1,\"444\":1,\"451\":1,\"452\":1,\"453\":2,\"456\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":2,\"467\":1,\"468\":1,\"469\":2,\"472\":1,\"504\":1,\"506\":1,\"507\":1,\"508\":1,\"512\":1,\"519\":1,\"520\":1,\"521\":2,\"524\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":2,\"548\":1,\"549\":1,\"550\":2,\"557\":1,\"564\":1,\"565\":1,\"566\":2,\"580\":1,\"601\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":2,\"625\":1,\"651\":1,\"658\":1,\"659\":1,\"660\":2,\"663\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":2,\"730\":1,\"737\":1,\"738\":1,\"739\":2,\"742\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":2,\"767\":1,\"768\":1,\"769\":2,\"776\":1,\"782\":1,\"783\":1,\"784\":2,\"798\":1,\"827\":1,\"828\":1,\"829\":2,\"832\":1,\"858\":1,\"865\":1,\"866\":1,\"867\":2,\"870\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":2,\"916\":1,\"918\":1,\"919\":1,\"920\":1,\"953\":1,\"960\":1,\"961\":1,\"962\":2,\"965\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":2,\"990\":1,\"991\":1,\"992\":2,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1021\":1,\"1050\":1,\"1051\":1,\"1052\":2,\"1055\":1,\"1081\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1093\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":2,\"1114\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1126\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":2,\"1151\":1,\"1152\":1,\"1153\":2,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1182\":1,\"1208\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":2,\"1232\":1,\"1258\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1270\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":2,\"1296\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1307\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1319\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":2,\"1344\":1,\"1345\":1,\"1346\":2,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1375\":1,\"1401\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":2,\"1425\":1,\"1451\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1463\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":2,\"1494\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1506\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":2,\"1534\":1,\"1535\":1,\"1536\":2,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1565\":1,\"1600\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":2,\"1624\":1,\"1654\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1666\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":2,\"1692\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1703\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1715\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":2,\"1740\":1,\"1741\":1,\"1742\":2,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1771\":1,\"1800\":1,\"1801\":1,\"1802\":2,\"1805\":1,\"1831\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1843\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":2,\"1869\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1890\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1902\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":2,\"1930\":1,\"1931\":1,\"1932\":2,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"1961\":1,\"1996\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":2,\"2020\":1,\"2050\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2062\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":2,\"2088\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2109\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2121\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":2,\"2149\":1,\"2150\":1,\"2151\":2,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2180\":1,\"2215\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":2,\"2239\":1,\"2269\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2281\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":2,\"2307\":1,\"2309\":1,\"2310\":1,\"2311\":1},\"1\":{\"63\":1,\"74\":5,\"76\":1,\"77\":1,\"99\":1,\"102\":1,\"126\":3,\"127\":1,\"128\":1,\"133\":4,\"136\":21,\"137\":29,\"138\":13,\"149\":3,\"150\":1,\"151\":1,\"156\":4,\"159\":21,\"160\":27,\"161\":13,\"169\":1,\"173\":3,\"174\":1,\"175\":1,\"180\":4,\"183\":21,\"184\":27,\"185\":13,\"193\":1,\"205\":3,\"206\":2,\"207\":1,\"216\":4,\"219\":21,\"220\":27,\"221\":13,\"226\":1,\"229\":1,\"235\":3,\"236\":2,\"237\":2,\"246\":4,\"249\":21,\"250\":27,\"251\":13,\"256\":1,\"259\":1,\"265\":3,\"266\":2,\"267\":2,\"276\":4,\"279\":21,\"280\":27,\"281\":13,\"286\":1,\"289\":1,\"311\":3,\"312\":2,\"313\":2,\"322\":4,\"325\":21,\"326\":27,\"327\":13,\"332\":1,\"335\":1,\"357\":3,\"358\":2,\"359\":2,\"368\":4,\"371\":21,\"372\":27,\"373\":13,\"378\":1,\"381\":1,\"397\":3,\"398\":5,\"399\":4,\"406\":1,\"413\":3,\"414\":5,\"415\":4,\"425\":3,\"426\":2,\"429\":2,\"444\":2,\"451\":3,\"452\":5,\"453\":4,\"456\":1,\"458\":1,\"459\":2,\"460\":2,\"461\":2,\"462\":2,\"467\":3,\"468\":5,\"469\":4,\"472\":1,\"504\":3,\"505\":2,\"506\":7,\"507\":2,\"508\":2,\"512\":2,\"519\":3,\"520\":5,\"521\":4,\"524\":1,\"526\":1,\"527\":2,\"528\":2,\"529\":2,\"530\":2,\"548\":3,\"549\":5,\"550\":4,\"557\":1,\"564\":3,\"565\":5,\"566\":4,\"576\":3,\"577\":2,\"580\":2,\"601\":3,\"602\":2,\"603\":7,\"604\":2,\"605\":2,\"610\":5,\"612\":2,\"618\":1,\"620\":3,\"621\":5,\"622\":4,\"625\":1,\"641\":2,\"651\":2,\"658\":3,\"659\":5,\"660\":4,\"663\":1,\"665\":1,\"666\":2,\"667\":2,\"668\":2,\"669\":2,\"677\":1,\"678\":1,\"702\":3,\"703\":2,\"704\":2,\"713\":4,\"716\":21,\"717\":27,\"718\":13,\"723\":1,\"726\":1,\"730\":2,\"737\":3,\"738\":5,\"739\":4,\"742\":1,\"744\":1,\"745\":2,\"746\":2,\"747\":2,\"748\":2,\"767\":3,\"768\":5,\"769\":4,\"776\":1,\"782\":3,\"783\":5,\"784\":4,\"794\":3,\"795\":2,\"798\":2,\"817\":5,\"819\":2,\"825\":1,\"827\":3,\"828\":5,\"829\":4,\"832\":1,\"848\":2,\"858\":2,\"865\":3,\"866\":5,\"867\":4,\"870\":1,\"872\":1,\"873\":2,\"874\":2,\"875\":2,\"876\":2,\"884\":1,\"885\":1,\"916\":3,\"917\":2,\"918\":7,\"919\":2,\"920\":2,\"925\":3,\"926\":2,\"927\":2,\"936\":4,\"939\":21,\"940\":27,\"941\":13,\"946\":1,\"949\":1,\"953\":2,\"960\":3,\"961\":5,\"962\":4,\"965\":1,\"967\":1,\"968\":2,\"969\":2,\"970\":2,\"971\":2,\"990\":3,\"991\":5,\"992\":4,\"999\":1,\"1005\":3,\"1006\":5,\"1007\":4,\"1017\":3,\"1018\":2,\"1021\":2,\"1040\":5,\"1042\":2,\"1048\":1,\"1050\":3,\"1051\":5,\"1052\":4,\"1055\":1,\"1071\":2,\"1081\":2,\"1088\":3,\"1089\":5,\"1090\":4,\"1093\":1,\"1095\":1,\"1096\":2,\"1097\":2,\"1098\":2,\"1099\":2,\"1107\":1,\"1108\":1,\"1114\":2,\"1121\":3,\"1122\":5,\"1123\":4,\"1126\":1,\"1128\":1,\"1129\":2,\"1130\":2,\"1131\":2,\"1132\":2,\"1151\":3,\"1152\":5,\"1153\":4,\"1160\":1,\"1166\":3,\"1167\":5,\"1168\":4,\"1178\":3,\"1179\":2,\"1182\":2,\"1208\":3,\"1209\":2,\"1210\":7,\"1211\":2,\"1212\":2,\"1217\":5,\"1219\":2,\"1225\":1,\"1227\":3,\"1228\":5,\"1229\":4,\"1232\":1,\"1248\":2,\"1258\":2,\"1265\":3,\"1266\":5,\"1267\":4,\"1270\":1,\"1272\":1,\"1273\":2,\"1274\":2,\"1275\":2,\"1276\":2,\"1284\":1,\"1285\":1,\"1296\":3,\"1297\":2,\"1298\":7,\"1299\":2,\"1300\":2,\"1307\":2,\"1314\":3,\"1315\":5,\"1316\":4,\"1319\":1,\"1321\":1,\"1322\":2,\"1323\":2,\"1324\":2,\"1325\":2,\"1344\":3,\"1345\":5,\"1346\":4,\"1353\":1,\"1359\":3,\"1360\":5,\"1361\":4,\"1371\":3,\"1372\":2,\"1375\":2,\"1401\":3,\"1402\":2,\"1403\":7,\"1404\":2,\"1405\":2,\"1410\":5,\"1412\":2,\"1418\":1,\"1420\":3,\"1421\":5,\"1422\":4,\"1425\":1,\"1441\":2,\"1451\":2,\"1458\":3,\"1459\":5,\"1460\":4,\"1463\":1,\"1465\":1,\"1466\":2,\"1467\":2,\"1468\":2,\"1469\":2,\"1477\":1,\"1478\":1,\"1482\":6,\"1484\":2,\"1490\":1,\"1494\":2,\"1501\":3,\"1502\":5,\"1503\":4,\"1506\":1,\"1508\":1,\"1509\":2,\"1510\":2,\"1511\":2,\"1512\":2,\"1534\":3,\"1535\":5,\"1536\":4,\"1543\":1,\"1549\":3,\"1550\":5,\"1551\":4,\"1561\":3,\"1562\":2,\"1565\":2,\"1588\":1,\"1589\":1,\"1600\":3,\"1601\":2,\"1602\":7,\"1603\":2,\"1604\":2,\"1609\":5,\"1611\":2,\"1617\":1,\"1619\":3,\"1620\":5,\"1621\":4,\"1624\":1,\"1643\":2,\"1654\":2,\"1661\":3,\"1662\":5,\"1663\":4,\"1666\":1,\"1668\":1,\"1669\":2,\"1670\":2,\"1671\":2,\"1672\":2,\"1680\":1,\"1681\":1,\"1692\":3,\"1693\":2,\"1694\":7,\"1695\":2,\"1696\":2,\"1703\":2,\"1710\":3,\"1711\":5,\"1712\":4,\"1715\":1,\"1717\":1,\"1718\":2,\"1719\":2,\"1720\":2,\"1721\":2,\"1740\":3,\"1741\":5,\"1742\":4,\"1749\":1,\"1755\":3,\"1756\":5,\"1757\":4,\"1767\":3,\"1768\":2,\"1771\":2,\"1790\":5,\"1792\":2,\"1798\":1,\"1800\":3,\"1801\":5,\"1802\":4,\"1805\":1,\"1821\":2,\"1831\":2,\"1838\":3,\"1839\":5,\"1840\":4,\"1843\":1,\"1845\":1,\"1846\":2,\"1847\":2,\"1848\":2,\"1849\":2,\"1857\":1,\"1858\":1,\"1869\":3,\"1870\":2,\"1871\":7,\"1872\":2,\"1873\":2,\"1878\":6,\"1880\":2,\"1886\":1,\"1890\":2,\"1897\":3,\"1898\":5,\"1899\":4,\"1902\":1,\"1904\":1,\"1905\":2,\"1906\":2,\"1907\":2,\"1908\":2,\"1930\":3,\"1931\":5,\"1932\":4,\"1939\":1,\"1945\":3,\"1946\":5,\"1947\":4,\"1957\":3,\"1958\":2,\"1961\":2,\"1984\":1,\"1985\":1,\"1996\":3,\"1997\":2,\"1998\":7,\"1999\":2,\"2000\":2,\"2005\":5,\"2007\":2,\"2013\":1,\"2015\":3,\"2016\":5,\"2017\":4,\"2020\":1,\"2039\":2,\"2050\":2,\"2057\":3,\"2058\":5,\"2059\":4,\"2062\":1,\"2064\":1,\"2065\":2,\"2066\":2,\"2067\":2,\"2068\":2,\"2076\":1,\"2077\":1,\"2088\":3,\"2089\":2,\"2090\":7,\"2091\":2,\"2092\":2,\"2097\":6,\"2099\":2,\"2105\":1,\"2109\":2,\"2116\":3,\"2117\":5,\"2118\":4,\"2121\":1,\"2123\":1,\"2124\":2,\"2125\":2,\"2126\":2,\"2127\":2,\"2149\":3,\"2150\":5,\"2151\":4,\"2158\":1,\"2164\":3,\"2165\":5,\"2166\":4,\"2176\":3,\"2177\":2,\"2180\":2,\"2203\":1,\"2204\":1,\"2215\":3,\"2216\":2,\"2217\":7,\"2218\":2,\"2219\":2,\"2224\":5,\"2226\":2,\"2232\":1,\"2234\":3,\"2235\":5,\"2236\":4,\"2239\":1,\"2258\":2,\"2269\":2,\"2276\":3,\"2277\":5,\"2278\":4,\"2281\":1,\"2283\":1,\"2284\":2,\"2285\":2,\"2286\":2,\"2287\":2,\"2295\":1,\"2296\":1,\"2307\":3,\"2308\":2,\"2309\":7,\"2310\":2,\"2311\":2}}],[\"centric\",{\"1\":{\"82\":1}}],[\"central\",{\"1\":{\"55\":2,\"89\":1,\"90\":2,\"92\":1}}],[\"centres\",{\"1\":{\"55\":1}}],[\"centre\",{\"1\":{\"52\":1}}],[\"centeric\",{\"1\":{\"62\":1}}],[\"centers\",{\"1\":{\"10\":1,\"26\":1,\"62\":1,\"89\":1}}],[\"center\",{\"1\":{\"10\":1,\"14\":1,\"81\":1,\"90\":1,\"92\":1}}],[\"ctrl\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"ct\",{\"1\":{\"58\":1}}],[\"c\",{\"1\":{\"39\":16,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"choose\",{\"1\":{\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"chown\",{\"1\":{\"137\":7,\"138\":2,\"160\":7,\"161\":2,\"184\":7,\"185\":2,\"220\":7,\"221\":2,\"250\":7,\"251\":2,\"280\":7,\"281\":2,\"326\":7,\"327\":2,\"372\":7,\"373\":2,\"717\":7,\"718\":2,\"931\":2,\"940\":7,\"941\":2}}],[\"chmod\",{\"1\":{\"137\":7,\"138\":2,\"160\":7,\"161\":2,\"184\":7,\"185\":2,\"220\":7,\"221\":2,\"250\":7,\"251\":2,\"280\":7,\"281\":2,\"326\":7,\"327\":2,\"372\":7,\"373\":2,\"717\":7,\"718\":2,\"931\":2,\"940\":7,\"941\":2}}],[\"checkout\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"check\",{\"1\":{\"63\":1,\"70\":1,\"138\":3,\"139\":1,\"161\":3,\"162\":1,\"185\":3,\"186\":1,\"221\":3,\"222\":1,\"251\":3,\"252\":1,\"281\":3,\"282\":1,\"327\":3,\"328\":1,\"373\":3,\"374\":1,\"382\":1,\"466\":1,\"718\":3,\"719\":1,\"941\":3,\"942\":1}}],[\"character\",{\"1\":{\"610\":1,\"643\":1,\"817\":1,\"915\":2,\"1040\":1,\"1207\":2,\"1217\":1,\"1295\":2,\"1400\":2,\"1410\":1,\"1482\":1,\"1599\":2,\"1609\":1,\"1691\":2,\"1790\":1,\"1868\":2,\"1878\":1,\"1995\":2,\"2005\":1,\"2087\":2,\"2097\":1,\"2214\":2,\"2224\":1,\"2306\":2}}],[\"characters\",{\"1\":{\"137\":3,\"138\":3,\"160\":3,\"161\":3,\"184\":3,\"185\":3,\"220\":3,\"221\":3,\"250\":3,\"251\":3,\"280\":3,\"281\":3,\"326\":3,\"327\":3,\"372\":3,\"373\":3,\"717\":3,\"718\":3,\"940\":3,\"941\":3}}],[\"changes\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"300\":2,\"301\":5,\"303\":3,\"305\":4,\"332\":1,\"350\":2,\"351\":5,\"353\":3,\"355\":4,\"378\":1,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"691\":2,\"692\":5,\"694\":3,\"696\":4,\"723\":1,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"898\":2,\"899\":5,\"901\":3,\"903\":4,\"946\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"change\",{\"1\":{\"137\":2,\"160\":2,\"184\":2,\"220\":2,\"226\":1,\"250\":2,\"256\":1,\"280\":2,\"286\":1,\"300\":1,\"326\":2,\"332\":1,\"350\":1,\"372\":2,\"378\":1,\"384\":1,\"387\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"435\":1,\"470\":1,\"471\":1,\"475\":1,\"478\":1,\"486\":1,\"535\":1,\"538\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"586\":1,\"623\":1,\"624\":1,\"628\":1,\"631\":1,\"639\":1,\"691\":1,\"717\":2,\"723\":1,\"753\":1,\"756\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"807\":1,\"830\":1,\"831\":1,\"835\":1,\"838\":1,\"846\":1,\"898\":1,\"940\":2,\"946\":1,\"976\":1,\"979\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1030\":1,\"1053\":1,\"1054\":1,\"1058\":1,\"1061\":1,\"1069\":1,\"1137\":1,\"1140\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1191\":1,\"1230\":1,\"1231\":1,\"1235\":1,\"1238\":1,\"1246\":1,\"1330\":1,\"1333\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1384\":1,\"1423\":1,\"1424\":1,\"1428\":1,\"1431\":1,\"1439\":1,\"1517\":1,\"1520\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1574\":1,\"1622\":1,\"1623\":1,\"1627\":1,\"1630\":1,\"1641\":1,\"1726\":1,\"1729\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1780\":1,\"1803\":1,\"1804\":1,\"1808\":1,\"1811\":1,\"1819\":1,\"1913\":1,\"1916\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1970\":1,\"2018\":1,\"2019\":1,\"2023\":1,\"2026\":1,\"2037\":1,\"2132\":1,\"2135\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2189\":1,\"2237\":1,\"2238\":1,\"2242\":1,\"2245\":1,\"2256\":1}}],[\"changed\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"channel\",{\"0\":{\"446\":1,\"447\":1,\"514\":1,\"515\":1,\"653\":1,\"654\":1,\"732\":1,\"733\":1,\"860\":1,\"861\":1,\"955\":1,\"956\":1,\"1083\":1,\"1084\":1,\"1116\":1,\"1117\":1,\"1260\":1,\"1261\":1,\"1309\":1,\"1310\":1,\"1453\":1,\"1454\":1,\"1496\":1,\"1497\":1,\"1656\":1,\"1657\":1,\"1705\":1,\"1706\":1,\"1833\":1,\"1834\":1,\"1892\":1,\"1893\":1,\"2052\":1,\"2053\":1,\"2111\":1,\"2112\":1,\"2271\":1,\"2272\":1},\"1\":{\"37\":1,\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"446\":3,\"447\":3,\"514\":3,\"515\":3,\"653\":3,\"654\":3,\"674\":1,\"675\":4,\"678\":1,\"704\":1,\"732\":3,\"733\":3,\"860\":3,\"861\":3,\"881\":1,\"882\":4,\"885\":1,\"927\":1,\"955\":3,\"956\":3,\"1083\":3,\"1084\":3,\"1104\":1,\"1105\":4,\"1108\":1,\"1116\":3,\"1117\":3,\"1260\":3,\"1261\":3,\"1281\":1,\"1282\":4,\"1285\":1,\"1309\":3,\"1310\":3,\"1453\":3,\"1454\":3,\"1474\":1,\"1475\":4,\"1478\":1,\"1496\":3,\"1497\":3,\"1586\":1,\"1587\":4,\"1589\":1,\"1656\":3,\"1657\":3,\"1677\":1,\"1678\":4,\"1681\":1,\"1705\":3,\"1706\":3,\"1833\":3,\"1834\":3,\"1854\":1,\"1855\":4,\"1858\":1,\"1892\":3,\"1893\":3,\"1982\":1,\"1983\":4,\"1985\":1,\"2052\":3,\"2053\":3,\"2073\":1,\"2074\":4,\"2077\":1,\"2111\":3,\"2112\":3,\"2201\":1,\"2202\":4,\"2204\":1,\"2271\":3,\"2272\":3,\"2292\":1,\"2293\":4,\"2296\":1}}],[\"chain\",{\"0\":{\"460\":1,\"506\":1,\"528\":1,\"603\":1,\"667\":1,\"746\":1,\"874\":1,\"918\":1,\"969\":1,\"1097\":1,\"1130\":1,\"1210\":1,\"1274\":1,\"1298\":1,\"1323\":1,\"1403\":1,\"1467\":1,\"1510\":1,\"1602\":1,\"1670\":1,\"1694\":1,\"1719\":1,\"1847\":1,\"1871\":1,\"1906\":1,\"1998\":1,\"2066\":1,\"2090\":1,\"2125\":1,\"2217\":1,\"2285\":1,\"2309\":1},\"1\":{\"99\":1,\"102\":1,\"137\":3,\"160\":3,\"184\":3,\"220\":3,\"250\":3,\"280\":3,\"326\":3,\"372\":3,\"425\":1,\"460\":2,\"504\":1,\"506\":4,\"528\":2,\"576\":1,\"601\":1,\"603\":4,\"667\":2,\"717\":3,\"746\":2,\"794\":1,\"874\":2,\"916\":1,\"918\":4,\"940\":3,\"969\":2,\"1017\":1,\"1097\":2,\"1130\":2,\"1178\":1,\"1208\":1,\"1210\":4,\"1274\":2,\"1296\":1,\"1298\":4,\"1323\":2,\"1371\":1,\"1401\":1,\"1403\":4,\"1467\":2,\"1510\":2,\"1561\":1,\"1600\":1,\"1602\":4,\"1670\":2,\"1692\":1,\"1694\":4,\"1719\":2,\"1767\":1,\"1847\":2,\"1869\":1,\"1871\":4,\"1906\":2,\"1957\":1,\"1996\":1,\"1998\":4,\"2066\":2,\"2088\":1,\"2090\":4,\"2125\":2,\"2176\":1,\"2215\":1,\"2217\":4,\"2285\":2,\"2307\":1,\"2309\":4}}],[\"challenges\",{\"1\":{\"84\":1,\"89\":1}}],[\"chapter\",{\"1\":{\"67\":1,\"73\":1,\"296\":1,\"346\":1,\"687\":1,\"894\":1}}],[\"chat\",{\"1\":{\"6\":1}}],[\"christoph\",{\"1\":{\"18\":1}}],[\"christian\",{\"1\":{\"18\":1}}],[\"claims\",{\"1\":{\"614\":1,\"821\":1,\"1044\":1,\"1221\":1,\"1414\":1,\"1486\":1,\"1613\":1,\"1794\":1,\"1882\":1,\"2009\":1,\"2101\":1,\"2228\":1}}],[\"clear\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"clearer\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"cli\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"click\",{\"1\":{\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1,\"207\":2,\"293\":2,\"343\":2,\"684\":2,\"891\":2}}],[\"clients\",{\"1\":{\"458\":1,\"526\":1,\"665\":1,\"744\":1,\"872\":1,\"967\":1,\"1095\":1,\"1128\":1,\"1272\":1,\"1321\":1,\"1465\":1,\"1508\":1,\"1668\":1,\"1717\":1,\"1845\":1,\"1904\":1,\"2064\":1,\"2123\":1,\"2283\":1}}],[\"clientcert\",{\"1\":{\"444\":1,\"512\":1,\"651\":1,\"730\":1,\"858\":1,\"953\":1,\"1081\":1,\"1114\":1,\"1258\":1,\"1307\":1,\"1451\":1,\"1494\":1,\"1654\":1,\"1703\":1,\"1831\":1,\"1890\":1,\"2050\":1,\"2109\":1,\"2269\":1}}],[\"clientendpoint\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"719\":2,\"942\":2}}],[\"client\",{\"0\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"397\":1,\"398\":1,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":2,\"444\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":2,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"512\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"526\":1,\"548\":1,\"549\":1,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":2,\"606\":1,\"620\":1,\"621\":1,\"622\":2,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"651\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"665\":1,\"713\":1,\"730\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"744\":1,\"767\":1,\"768\":1,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":2,\"827\":1,\"828\":1,\"829\":2,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"858\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"872\":1,\"921\":1,\"936\":1,\"953\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"967\":1,\"990\":1,\"991\":1,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1050\":1,\"1051\":1,\"1052\":2,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1081\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1095\":1,\"1114\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1128\":1,\"1151\":1,\"1152\":1,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1213\":1,\"1227\":1,\"1228\":1,\"1229\":2,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1258\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1272\":1,\"1301\":1,\"1307\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1321\":1,\"1344\":1,\"1345\":1,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1406\":1,\"1420\":1,\"1421\":1,\"1422\":2,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1451\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1465\":1,\"1494\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1508\":1,\"1534\":1,\"1535\":1,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1605\":1,\"1619\":1,\"1620\":1,\"1621\":2,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1654\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1668\":1,\"1697\":1,\"1703\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1717\":1,\"1740\":1,\"1741\":1,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1800\":1,\"1801\":1,\"1802\":2,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1831\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1845\":1,\"1874\":1,\"1890\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1904\":1,\"1930\":1,\"1931\":1,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"2001\":1,\"2015\":1,\"2016\":1,\"2017\":2,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2050\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2064\":1,\"2093\":1,\"2109\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2123\":1,\"2149\":1,\"2150\":1,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2220\":1,\"2234\":1,\"2235\":1,\"2236\":2,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2269\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2283\":1,\"2312\":1},\"1\":{\"63\":4,\"74\":3,\"77\":4,\"126\":4,\"133\":4,\"136\":9,\"137\":14,\"138\":10,\"149\":4,\"156\":4,\"159\":9,\"160\":11,\"161\":10,\"169\":1,\"173\":4,\"180\":4,\"183\":9,\"184\":11,\"185\":10,\"192\":1,\"193\":2,\"205\":4,\"216\":4,\"219\":9,\"220\":11,\"221\":10,\"226\":1,\"229\":1,\"235\":3,\"237\":1,\"246\":4,\"249\":9,\"250\":11,\"251\":10,\"256\":1,\"259\":1,\"265\":3,\"267\":1,\"276\":4,\"279\":9,\"280\":11,\"281\":10,\"286\":1,\"289\":1,\"311\":3,\"313\":1,\"322\":4,\"325\":9,\"326\":11,\"327\":10,\"332\":1,\"335\":1,\"357\":3,\"359\":1,\"368\":4,\"371\":9,\"372\":11,\"373\":10,\"378\":1,\"381\":1,\"397\":3,\"398\":5,\"399\":4,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"413\":3,\"414\":5,\"415\":4,\"444\":2,\"445\":2,\"446\":1,\"449\":2,\"450\":2,\"451\":3,\"452\":5,\"453\":4,\"454\":2,\"455\":2,\"456\":1,\"458\":3,\"467\":3,\"468\":5,\"469\":4,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"504\":1,\"505\":2,\"512\":2,\"513\":2,\"514\":1,\"517\":2,\"518\":2,\"519\":3,\"520\":5,\"521\":4,\"522\":2,\"523\":2,\"524\":1,\"526\":3,\"548\":3,\"549\":5,\"550\":4,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"564\":3,\"565\":5,\"566\":4,\"601\":1,\"602\":2,\"610\":4,\"613\":1,\"618\":2,\"620\":3,\"621\":5,\"622\":4,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"641\":1,\"651\":2,\"652\":2,\"653\":1,\"656\":2,\"657\":2,\"658\":3,\"659\":5,\"660\":4,\"661\":2,\"662\":2,\"663\":1,\"665\":3,\"674\":3,\"675\":2,\"677\":1,\"678\":3,\"702\":3,\"704\":1,\"713\":4,\"716\":9,\"717\":11,\"718\":10,\"723\":1,\"726\":1,\"730\":2,\"731\":2,\"732\":1,\"735\":2,\"736\":2,\"737\":3,\"738\":5,\"739\":4,\"740\":2,\"741\":2,\"742\":1,\"744\":3,\"767\":3,\"768\":5,\"769\":4,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"782\":3,\"783\":5,\"784\":4,\"817\":4,\"820\":1,\"825\":2,\"827\":3,\"828\":5,\"829\":4,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"848\":1,\"858\":2,\"859\":2,\"860\":1,\"863\":2,\"864\":2,\"865\":3,\"866\":5,\"867\":4,\"868\":2,\"869\":2,\"870\":1,\"872\":3,\"881\":3,\"882\":2,\"884\":1,\"885\":3,\"916\":1,\"917\":2,\"925\":3,\"927\":1,\"936\":4,\"939\":9,\"940\":11,\"941\":10,\"946\":1,\"949\":1,\"953\":2,\"954\":2,\"955\":1,\"958\":2,\"959\":2,\"960\":3,\"961\":5,\"962\":4,\"963\":2,\"964\":2,\"965\":1,\"967\":3,\"990\":3,\"991\":5,\"992\":4,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":2,\"1005\":3,\"1006\":5,\"1007\":4,\"1040\":4,\"1043\":1,\"1048\":2,\"1050\":3,\"1051\":5,\"1052\":4,\"1053\":1,\"1054\":1,\"1055\":2,\"1056\":1,\"1071\":1,\"1081\":2,\"1082\":2,\"1083\":1,\"1086\":2,\"1087\":2,\"1088\":3,\"1089\":5,\"1090\":4,\"1091\":2,\"1092\":2,\"1093\":1,\"1095\":3,\"1104\":3,\"1105\":2,\"1107\":1,\"1108\":3,\"1114\":2,\"1115\":2,\"1116\":1,\"1119\":2,\"1120\":2,\"1121\":3,\"1122\":5,\"1123\":4,\"1124\":2,\"1125\":2,\"1126\":1,\"1128\":3,\"1151\":3,\"1152\":5,\"1153\":4,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":2,\"1166\":3,\"1167\":5,\"1168\":4,\"1208\":1,\"1209\":2,\"1217\":4,\"1220\":1,\"1225\":2,\"1227\":3,\"1228\":5,\"1229\":4,\"1230\":1,\"1231\":1,\"1232\":2,\"1233\":1,\"1248\":1,\"1258\":2,\"1259\":2,\"1260\":1,\"1263\":2,\"1264\":2,\"1265\":3,\"1266\":5,\"1267\":4,\"1268\":2,\"1269\":2,\"1270\":1,\"1272\":3,\"1281\":3,\"1282\":2,\"1284\":1,\"1285\":3,\"1296\":1,\"1297\":2,\"1307\":2,\"1308\":2,\"1309\":1,\"1312\":2,\"1313\":2,\"1314\":3,\"1315\":5,\"1316\":4,\"1317\":2,\"1318\":2,\"1319\":1,\"1321\":3,\"1344\":3,\"1345\":5,\"1346\":4,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":2,\"1359\":3,\"1360\":5,\"1361\":4,\"1401\":1,\"1402\":2,\"1410\":4,\"1413\":1,\"1418\":2,\"1420\":3,\"1421\":5,\"1422\":4,\"1423\":1,\"1424\":1,\"1425\":2,\"1426\":1,\"1441\":1,\"1451\":2,\"1452\":2,\"1453\":1,\"1456\":2,\"1457\":2,\"1458\":3,\"1459\":5,\"1460\":4,\"1461\":2,\"1462\":2,\"1463\":1,\"1465\":3,\"1474\":3,\"1475\":2,\"1477\":1,\"1478\":3,\"1482\":4,\"1485\":1,\"1490\":2,\"1494\":2,\"1495\":2,\"1496\":1,\"1499\":2,\"1500\":2,\"1501\":3,\"1502\":5,\"1503\":4,\"1504\":2,\"1505\":2,\"1506\":1,\"1508\":3,\"1534\":3,\"1535\":5,\"1536\":4,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":2,\"1549\":3,\"1550\":5,\"1551\":4,\"1586\":3,\"1587\":2,\"1588\":1,\"1589\":3,\"1600\":1,\"1601\":2,\"1609\":4,\"1612\":1,\"1617\":2,\"1619\":3,\"1620\":5,\"1621\":4,\"1622\":1,\"1623\":1,\"1624\":2,\"1625\":1,\"1643\":1,\"1654\":2,\"1655\":2,\"1656\":1,\"1659\":2,\"1660\":2,\"1661\":3,\"1662\":5,\"1663\":4,\"1664\":2,\"1665\":2,\"1666\":1,\"1668\":3,\"1677\":3,\"1678\":2,\"1680\":1,\"1681\":3,\"1692\":1,\"1693\":2,\"1703\":2,\"1704\":2,\"1705\":1,\"1708\":2,\"1709\":2,\"1710\":3,\"1711\":5,\"1712\":4,\"1713\":2,\"1714\":2,\"1715\":1,\"1717\":3,\"1740\":3,\"1741\":5,\"1742\":4,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":2,\"1755\":3,\"1756\":5,\"1757\":4,\"1790\":4,\"1793\":1,\"1798\":2,\"1800\":3,\"1801\":5,\"1802\":4,\"1803\":1,\"1804\":1,\"1805\":2,\"1806\":1,\"1821\":1,\"1831\":2,\"1832\":2,\"1833\":1,\"1836\":2,\"1837\":2,\"1838\":3,\"1839\":5,\"1840\":4,\"1841\":2,\"1842\":2,\"1843\":1,\"1845\":3,\"1854\":3,\"1855\":2,\"1857\":1,\"1858\":3,\"1869\":1,\"1870\":2,\"1878\":4,\"1881\":1,\"1886\":2,\"1890\":2,\"1891\":2,\"1892\":1,\"1895\":2,\"1896\":2,\"1897\":3,\"1898\":5,\"1899\":4,\"1900\":2,\"1901\":2,\"1902\":1,\"1904\":3,\"1930\":3,\"1931\":5,\"1932\":4,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":2,\"1945\":3,\"1946\":5,\"1947\":4,\"1982\":3,\"1983\":2,\"1984\":1,\"1985\":3,\"1996\":1,\"1997\":2,\"2005\":4,\"2008\":1,\"2013\":2,\"2015\":3,\"2016\":5,\"2017\":4,\"2018\":1,\"2019\":1,\"2020\":2,\"2021\":1,\"2039\":1,\"2050\":2,\"2051\":2,\"2052\":1,\"2055\":2,\"2056\":2,\"2057\":3,\"2058\":5,\"2059\":4,\"2060\":2,\"2061\":2,\"2062\":1,\"2064\":3,\"2073\":3,\"2074\":2,\"2076\":1,\"2077\":3,\"2088\":1,\"2089\":2,\"2097\":4,\"2100\":1,\"2105\":2,\"2109\":2,\"2110\":2,\"2111\":1,\"2114\":2,\"2115\":2,\"2116\":3,\"2117\":5,\"2118\":4,\"2119\":2,\"2120\":2,\"2121\":1,\"2123\":3,\"2149\":3,\"2150\":5,\"2151\":4,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":2,\"2164\":3,\"2165\":5,\"2166\":4,\"2201\":3,\"2202\":2,\"2203\":1,\"2204\":3,\"2215\":1,\"2216\":2,\"2224\":4,\"2227\":1,\"2232\":2,\"2234\":3,\"2235\":5,\"2236\":4,\"2237\":1,\"2238\":1,\"2239\":2,\"2240\":1,\"2258\":1,\"2269\":2,\"2270\":2,\"2271\":1,\"2274\":2,\"2275\":2,\"2276\":3,\"2277\":5,\"2278\":4,\"2279\":2,\"2280\":2,\"2281\":1,\"2283\":3,\"2292\":3,\"2293\":2,\"2295\":1,\"2296\":3,\"2307\":1,\"2308\":2}}],[\"clinical\",{\"0\":{\"26\":1},\"1\":{\"11\":1,\"20\":1,\"26\":1}}],[\"close\",{\"1\":{\"11\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"crucial\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"criteria=task\",{\"1\":{\"412\":1,\"563\":1,\"781\":1,\"1004\":1,\"1165\":1,\"1358\":1,\"1548\":1,\"1754\":1,\"1944\":1,\"2163\":1}}],[\"criteria=questionnaireresponse\",{\"1\":{\"407\":1,\"558\":1,\"777\":1,\"1000\":1,\"1161\":1,\"1354\":1,\"1544\":1,\"1750\":1,\"1940\":1,\"2159\":1}}],[\"critical\",{\"1\":{\"25\":1,\"89\":1}}],[\"crisis\",{\"1\":{\"91\":1}}],[\"crp=central\",{\"1\":{\"62\":1}}],[\"crr\",{\"1\":{\"55\":1,\"92\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"created\",{\"1\":{\"54\":1,\"67\":1,\"802\":1,\"1025\":1,\"1186\":1,\"1379\":1,\"1569\":1,\"1775\":1,\"1965\":1,\"2184\":1}}],[\"creates\",{\"1\":{\"53\":1}}],[\"create\",{\"0\":{\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1},\"1\":{\"50\":1,\"62\":2,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"119\":1,\"121\":1,\"123\":1,\"126\":1,\"137\":1,\"138\":1,\"144\":1,\"146\":1,\"149\":1,\"160\":1,\"161\":1,\"168\":1,\"169\":1,\"170\":1,\"173\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"194\":1,\"196\":1,\"198\":1,\"200\":1,\"202\":1,\"205\":1,\"220\":1,\"221\":1,\"228\":1,\"229\":1,\"230\":1,\"232\":1,\"235\":1,\"250\":1,\"251\":1,\"258\":1,\"259\":1,\"260\":1,\"262\":1,\"265\":1,\"280\":1,\"281\":1,\"288\":1,\"289\":1,\"300\":4,\"301\":1,\"303\":2,\"306\":1,\"308\":1,\"311\":1,\"326\":1,\"327\":1,\"334\":1,\"335\":1,\"336\":1,\"338\":1,\"350\":4,\"351\":1,\"353\":2,\"357\":1,\"372\":1,\"373\":1,\"380\":1,\"381\":1,\"616\":1,\"618\":2,\"691\":4,\"692\":1,\"694\":2,\"697\":1,\"699\":1,\"702\":1,\"717\":1,\"718\":1,\"725\":1,\"726\":1,\"823\":1,\"825\":2,\"898\":4,\"899\":1,\"901\":2,\"904\":1,\"906\":1,\"925\":1,\"940\":1,\"941\":1,\"948\":1,\"949\":1,\"1046\":1,\"1048\":2,\"1223\":1,\"1225\":2,\"1416\":1,\"1418\":2,\"1615\":1,\"1617\":2,\"1796\":1,\"1798\":2,\"2011\":1,\"2013\":2,\"2230\":1,\"2232\":2}}],[\"creating\",{\"1\":{\"10\":1,\"61\":1,\"63\":1}}],[\"cross\",{\"1\":{\"0\":1,\"11\":1,\"23\":1,\"81\":1}}],[\"caching\",{\"1\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1}}],[\"cache\",{\"0\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1},\"1\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1}}],[\"calculated\",{\"1\":{\"610\":1,\"641\":1,\"817\":1,\"848\":1,\"1040\":1,\"1071\":1,\"1217\":1,\"1248\":1,\"1410\":1,\"1441\":1,\"1482\":1,\"1609\":1,\"1643\":1,\"1790\":1,\"1821\":1,\"1878\":1,\"2005\":1,\"2039\":1,\"2097\":1,\"2224\":1,\"2258\":1}}],[\"calculation\",{\"1\":{\"63\":1}}],[\"called\",{\"1\":{\"447\":1,\"515\":1,\"610\":1,\"654\":1,\"733\":1,\"817\":1,\"861\":1,\"956\":1,\"1040\":1,\"1084\":1,\"1117\":1,\"1217\":1,\"1261\":1,\"1310\":1,\"1410\":1,\"1454\":1,\"1482\":1,\"1497\":1,\"1609\":1,\"1657\":1,\"1706\":1,\"1790\":1,\"1834\":1,\"1878\":1,\"1893\":1,\"2005\":1,\"2053\":1,\"2097\":1,\"2112\":1,\"2224\":1,\"2272\":1}}],[\"categorizes\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"category\",{\"1\":{\"294\":1,\"301\":1,\"344\":1,\"351\":1,\"685\":1,\"692\":1,\"892\":1,\"899\":1}}],[\"cas\",{\"0\":{\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"625\":1,\"663\":1,\"665\":1,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2239\":1,\"2281\":1,\"2283\":1},\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"625\":1,\"663\":1,\"665\":1,\"677\":1,\"678\":1,\"723\":1,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"884\":1,\"885\":1,\"946\":1,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1107\":1,\"1108\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1284\":1,\"1285\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1477\":1,\"1478\":1,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1588\":1,\"1589\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1680\":1,\"1681\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1857\":1,\"1858\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"1984\":1,\"1985\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2076\":1,\"2077\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2203\":1,\"2204\":1,\"2239\":1,\"2281\":1,\"2283\":1,\"2295\":1,\"2296\":1}}],[\"cases\",{\"0\":{\"93\":1},\"1\":{\"10\":1,\"11\":1,\"28\":1,\"49\":1,\"52\":1,\"80\":1,\"81\":1,\"104\":1,\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"932\":1}}],[\"case\",{\"0\":{\"28\":1},\"1\":{\"1\":1,\"20\":1,\"27\":1,\"39\":2,\"66\":2,\"81\":1}}],[\"ca\",{\"0\":{\"504\":1,\"505\":1,\"601\":1,\"602\":1,\"916\":1,\"917\":1,\"1208\":1,\"1209\":1,\"1296\":1,\"1297\":1,\"1401\":1,\"1402\":1,\"1600\":1,\"1601\":1,\"1692\":1,\"1693\":1,\"1869\":1,\"1870\":1,\"1996\":1,\"1997\":1,\"2088\":1,\"2089\":1,\"2215\":1,\"2216\":1,\"2307\":1,\"2308\":1},\"1\":{\"132\":1,\"137\":1,\"155\":1,\"160\":1,\"179\":1,\"184\":1,\"215\":1,\"220\":1,\"226\":1,\"245\":1,\"250\":1,\"256\":1,\"275\":1,\"280\":1,\"286\":1,\"321\":1,\"326\":1,\"332\":1,\"367\":1,\"372\":1,\"378\":1,\"504\":2,\"505\":3,\"506\":1,\"601\":2,\"602\":3,\"603\":1,\"678\":4,\"712\":1,\"717\":1,\"723\":1,\"885\":4,\"916\":2,\"917\":3,\"918\":1,\"935\":1,\"940\":1,\"946\":1,\"1108\":4,\"1208\":2,\"1209\":3,\"1210\":1,\"1285\":4,\"1296\":2,\"1297\":3,\"1298\":1,\"1401\":2,\"1402\":3,\"1403\":1,\"1478\":4,\"1589\":4,\"1600\":2,\"1601\":3,\"1602\":1,\"1681\":4,\"1692\":2,\"1693\":3,\"1694\":1,\"1858\":4,\"1869\":2,\"1870\":3,\"1871\":1,\"1985\":4,\"1996\":2,\"1997\":3,\"1998\":1,\"2077\":4,\"2088\":2,\"2089\":3,\"2090\":1,\"2204\":4,\"2215\":2,\"2216\":3,\"2217\":1,\"2296\":4,\"2307\":2,\"2308\":3,\"2309\":1}}],[\"caution\",{\"1\":{\"125\":1,\"148\":1,\"172\":1}}],[\"capabilities\",{\"1\":{\"81\":1}}],[\"camunda\",{\"0\":{\"388\":1,\"389\":2,\"390\":1,\"539\":1,\"540\":2,\"541\":1,\"757\":1,\"758\":2,\"759\":1,\"980\":1,\"981\":2,\"982\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"2136\":1,\"2137\":2,\"2138\":1},\"1\":{\"67\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"388\":3,\"389\":4,\"390\":3,\"539\":3,\"540\":4,\"541\":3,\"718\":1,\"757\":3,\"758\":4,\"759\":3,\"941\":1,\"980\":3,\"981\":4,\"982\":3,\"1141\":3,\"1142\":4,\"1143\":3,\"1334\":3,\"1335\":4,\"1336\":3,\"1521\":3,\"1522\":4,\"1523\":3,\"1730\":3,\"1731\":4,\"1732\":3,\"1917\":3,\"1918\":4,\"1919\":3,\"2136\":3,\"2137\":4,\"2138\":3}}],[\"can\",{\"1\":{\"7\":2,\"23\":1,\"27\":1,\"49\":2,\"50\":1,\"52\":2,\"54\":1,\"55\":2,\"56\":1,\"57\":1,\"58\":3,\"59\":4,\"60\":3,\"61\":2,\"62\":3,\"64\":2,\"66\":1,\"67\":1,\"68\":1,\"73\":2,\"74\":1,\"84\":2,\"88\":2,\"92\":2,\"97\":1,\"99\":3,\"102\":2,\"125\":1,\"126\":2,\"128\":1,\"129\":1,\"137\":4,\"138\":1,\"139\":3,\"148\":1,\"149\":2,\"151\":1,\"152\":1,\"160\":2,\"161\":1,\"162\":3,\"172\":1,\"173\":2,\"175\":1,\"176\":1,\"184\":2,\"185\":1,\"186\":3,\"192\":1,\"204\":1,\"205\":2,\"207\":1,\"208\":1,\"212\":1,\"220\":2,\"221\":1,\"222\":3,\"226\":3,\"234\":1,\"235\":2,\"237\":1,\"238\":1,\"242\":1,\"250\":2,\"251\":1,\"252\":3,\"256\":3,\"264\":1,\"265\":2,\"267\":1,\"268\":1,\"272\":1,\"280\":2,\"281\":1,\"282\":3,\"286\":3,\"290\":1,\"293\":1,\"301\":2,\"303\":2,\"305\":2,\"306\":1,\"310\":1,\"311\":2,\"313\":1,\"314\":1,\"318\":1,\"326\":2,\"327\":1,\"328\":3,\"332\":3,\"336\":1,\"340\":1,\"343\":1,\"351\":2,\"353\":2,\"355\":2,\"356\":1,\"357\":2,\"359\":1,\"360\":1,\"364\":1,\"372\":2,\"373\":1,\"374\":3,\"378\":3,\"410\":1,\"432\":1,\"433\":1,\"506\":1,\"561\":1,\"583\":1,\"584\":1,\"603\":1,\"610\":4,\"611\":2,\"612\":1,\"613\":1,\"614\":1,\"615\":1,\"617\":3,\"641\":1,\"674\":2,\"675\":2,\"677\":1,\"681\":1,\"684\":1,\"692\":2,\"694\":2,\"696\":2,\"697\":1,\"701\":1,\"702\":2,\"704\":1,\"705\":1,\"709\":1,\"717\":2,\"718\":1,\"719\":3,\"723\":3,\"779\":1,\"804\":1,\"805\":1,\"817\":4,\"818\":2,\"819\":1,\"820\":1,\"821\":1,\"822\":1,\"824\":3,\"848\":1,\"881\":2,\"882\":2,\"884\":1,\"888\":1,\"891\":1,\"899\":2,\"901\":2,\"903\":2,\"904\":1,\"918\":1,\"924\":1,\"925\":2,\"927\":1,\"928\":1,\"929\":1,\"930\":1,\"932\":1,\"940\":2,\"941\":1,\"942\":3,\"946\":3,\"1002\":1,\"1027\":1,\"1028\":1,\"1040\":4,\"1041\":2,\"1042\":1,\"1043\":1,\"1044\":1,\"1045\":1,\"1047\":3,\"1071\":1,\"1104\":2,\"1105\":2,\"1107\":1,\"1163\":1,\"1188\":1,\"1189\":1,\"1210\":1,\"1217\":4,\"1218\":2,\"1219\":1,\"1220\":1,\"1221\":1,\"1222\":1,\"1224\":3,\"1248\":1,\"1281\":2,\"1282\":2,\"1284\":1,\"1298\":1,\"1356\":1,\"1381\":1,\"1382\":1,\"1403\":1,\"1410\":4,\"1411\":2,\"1412\":1,\"1413\":1,\"1414\":1,\"1415\":1,\"1417\":3,\"1441\":1,\"1474\":2,\"1475\":2,\"1477\":1,\"1482\":5,\"1483\":2,\"1484\":1,\"1485\":1,\"1486\":1,\"1487\":1,\"1546\":1,\"1571\":1,\"1572\":1,\"1586\":2,\"1587\":2,\"1588\":1,\"1602\":1,\"1609\":5,\"1610\":2,\"1611\":1,\"1612\":1,\"1613\":1,\"1614\":1,\"1616\":3,\"1643\":1,\"1677\":2,\"1678\":2,\"1680\":1,\"1694\":1,\"1752\":1,\"1777\":1,\"1778\":1,\"1790\":4,\"1791\":2,\"1792\":1,\"1793\":1,\"1794\":1,\"1795\":1,\"1797\":3,\"1821\":1,\"1854\":2,\"1855\":2,\"1857\":1,\"1871\":1,\"1878\":5,\"1879\":2,\"1880\":1,\"1881\":1,\"1882\":1,\"1883\":1,\"1942\":1,\"1967\":1,\"1968\":1,\"1982\":2,\"1983\":2,\"1984\":1,\"1998\":1,\"2005\":5,\"2006\":2,\"2007\":1,\"2008\":1,\"2009\":1,\"2010\":1,\"2012\":3,\"2039\":1,\"2073\":2,\"2074\":2,\"2076\":1,\"2090\":1,\"2097\":5,\"2098\":2,\"2099\":1,\"2100\":1,\"2101\":1,\"2102\":1,\"2161\":1,\"2186\":1,\"2187\":1,\"2201\":2,\"2202\":2,\"2203\":1,\"2217\":1,\"2224\":5,\"2225\":2,\"2226\":1,\"2227\":1,\"2228\":1,\"2229\":1,\"2231\":3,\"2258\":1,\"2292\":2,\"2293\":2,\"2295\":1,\"2309\":1}}],[\"care\",{\"0\":{\"2\":1,\"51\":1},\"1\":{\"4\":1,\"11\":2,\"62\":2}}],[\"cos\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"count\",{\"0\":{\"488\":1,\"642\":1,\"849\":1,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1},\"1\":{\"488\":1,\"642\":1,\"849\":1,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1}}],[\"counts\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"could\",{\"1\":{\"299\":1,\"305\":1,\"349\":1,\"355\":1,\"690\":1,\"696\":1,\"897\":1,\"903\":1}}],[\"coding\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"codes\",{\"1\":{\"617\":2,\"824\":2,\"1047\":2,\"1224\":2,\"1417\":2,\"1616\":2,\"1797\":2,\"2012\":2,\"2231\":2}}],[\"codesystem\",{\"1\":{\"61\":1,\"617\":3,\"618\":2,\"824\":3,\"825\":2,\"1047\":3,\"1048\":2,\"1224\":3,\"1225\":2,\"1417\":3,\"1418\":2,\"1616\":3,\"1617\":2,\"1797\":3,\"1798\":2,\"2012\":3,\"2013\":2,\"2231\":3,\"2232\":2}}],[\"codex\",{\"1\":{\"91\":1,\"92\":1,\"129\":1,\"152\":1,\"176\":1,\"211\":2,\"212\":1,\"241\":2,\"242\":1,\"271\":2,\"272\":1,\"317\":2,\"318\":1,\"363\":2,\"364\":1,\"708\":2,\"709\":1,\"932\":1}}],[\"code\",{\"0\":{\"7\":1,\"290\":1,\"293\":1,\"340\":1,\"343\":1,\"445\":1,\"513\":1,\"652\":1,\"675\":1,\"681\":1,\"684\":1,\"731\":1,\"859\":1,\"882\":1,\"888\":1,\"891\":1,\"954\":1,\"1082\":1,\"1105\":1,\"1115\":1,\"1259\":1,\"1282\":1,\"1308\":1,\"1452\":1,\"1475\":1,\"1495\":1,\"1587\":1,\"1655\":1,\"1678\":1,\"1704\":1,\"1832\":1,\"1855\":1,\"1891\":1,\"1983\":1,\"2051\":1,\"2074\":1,\"2110\":1,\"2202\":1,\"2270\":1,\"2293\":1},\"1\":{\"7\":1,\"10\":3,\"11\":2,\"62\":1,\"66\":1,\"99\":1,\"290\":2,\"291\":1,\"293\":6,\"301\":1,\"305\":2,\"340\":2,\"341\":1,\"343\":6,\"351\":1,\"355\":2,\"445\":2,\"446\":1,\"449\":1,\"450\":1,\"513\":2,\"514\":1,\"517\":1,\"518\":1,\"617\":2,\"652\":2,\"653\":1,\"656\":1,\"657\":1,\"674\":1,\"675\":2,\"678\":1,\"681\":2,\"682\":1,\"684\":6,\"692\":1,\"696\":2,\"731\":2,\"732\":1,\"735\":1,\"736\":1,\"824\":2,\"859\":2,\"860\":1,\"863\":1,\"864\":1,\"881\":1,\"882\":2,\"885\":1,\"888\":2,\"889\":1,\"891\":6,\"899\":1,\"903\":2,\"954\":2,\"955\":1,\"958\":1,\"959\":1,\"1047\":2,\"1082\":2,\"1083\":1,\"1086\":1,\"1087\":1,\"1104\":1,\"1105\":2,\"1108\":1,\"1115\":2,\"1116\":1,\"1119\":1,\"1120\":1,\"1224\":2,\"1259\":2,\"1260\":1,\"1263\":1,\"1264\":1,\"1281\":1,\"1282\":2,\"1285\":1,\"1308\":2,\"1309\":1,\"1312\":1,\"1313\":1,\"1417\":2,\"1452\":2,\"1453\":1,\"1456\":1,\"1457\":1,\"1474\":1,\"1475\":2,\"1478\":1,\"1495\":2,\"1496\":1,\"1499\":1,\"1500\":1,\"1586\":1,\"1587\":2,\"1589\":1,\"1616\":2,\"1655\":2,\"1656\":1,\"1659\":1,\"1660\":1,\"1677\":1,\"1678\":2,\"1681\":1,\"1704\":2,\"1705\":1,\"1708\":1,\"1709\":1,\"1797\":2,\"1832\":2,\"1833\":1,\"1836\":1,\"1837\":1,\"1854\":1,\"1855\":2,\"1858\":1,\"1891\":2,\"1892\":1,\"1895\":1,\"1896\":1,\"1982\":1,\"1983\":2,\"1985\":1,\"2012\":2,\"2051\":2,\"2052\":1,\"2055\":1,\"2056\":1,\"2073\":1,\"2074\":2,\"2077\":1,\"2110\":2,\"2111\":1,\"2114\":1,\"2115\":1,\"2201\":1,\"2202\":2,\"2204\":1,\"2231\":2,\"2270\":2,\"2271\":1,\"2274\":1,\"2275\":1,\"2292\":1,\"2293\":2,\"2296\":1}}],[\"color\",{\"1\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"colors\",{\"1\":{\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"collaborate\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"collaboration\",{\"1\":{\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"collaborative\",{\"1\":{\"15\":1}}],[\"collected\",{\"1\":{\"81\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"copy\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":3,\"256\":3,\"286\":3,\"332\":3,\"378\":3,\"723\":3,\"929\":1,\"946\":3}}],[\"cohort\",{\"1\":{\"63\":2,\"89\":2}}],[\"covered\",{\"1\":{\"80\":1,\"81\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"cover\",{\"1\":{\"59\":1,\"80\":1,\"81\":1}}],[\"covid\",{\"1\":{\"39\":1,\"91\":5}}],[\"corresponging\",{\"1\":{\"414\":1,\"565\":1,\"783\":1,\"1006\":1,\"1167\":1,\"1360\":1,\"1550\":1,\"1756\":1,\"1946\":1,\"2165\":1}}],[\"corresponding\",{\"1\":{\"61\":1,\"137\":3,\"138\":2,\"160\":3,\"161\":2,\"184\":3,\"185\":2,\"220\":3,\"221\":2,\"250\":3,\"251\":2,\"280\":3,\"281\":2,\"326\":3,\"327\":2,\"372\":3,\"373\":2,\"398\":1,\"452\":1,\"468\":1,\"520\":1,\"549\":1,\"621\":1,\"659\":1,\"717\":3,\"718\":2,\"738\":1,\"768\":1,\"828\":1,\"866\":1,\"940\":3,\"941\":2,\"961\":1,\"991\":1,\"1051\":1,\"1089\":1,\"1122\":1,\"1152\":1,\"1228\":1,\"1266\":1,\"1315\":1,\"1345\":1,\"1421\":1,\"1459\":1,\"1502\":1,\"1535\":1,\"1620\":1,\"1662\":1,\"1711\":1,\"1741\":1,\"1801\":1,\"1839\":1,\"1898\":1,\"1931\":1,\"2016\":1,\"2058\":1,\"2117\":1,\"2150\":1,\"2235\":1,\"2277\":1}}],[\"correct\",{\"1\":{\"58\":1}}],[\"cores\",{\"1\":{\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"corepoolsize\",{\"0\":{\"801\":1,\"1024\":1,\"1185\":1,\"1378\":1,\"1568\":1,\"1774\":1,\"1964\":1,\"2183\":1},\"1\":{\"801\":1,\"1024\":1,\"1185\":1,\"1378\":1,\"1568\":1,\"1774\":1,\"1964\":1,\"2183\":1}}],[\"core\",{\"1\":{\"10\":2,\"27\":1,\"90\":1,\"801\":1,\"803\":1,\"1024\":1,\"1026\":1,\"1185\":1,\"1187\":1,\"1378\":1,\"1380\":1,\"1568\":1,\"1570\":1,\"1774\":1,\"1776\":1,\"1964\":1,\"1966\":1,\"2183\":1,\"2185\":1}}],[\"combined\",{\"1\":{\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"932\":1}}],[\"combination\",{\"1\":{\"61\":1}}],[\"com\",{\"1\":{\"32\":1,\"37\":1,\"80\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"132\":3,\"155\":3,\"160\":2,\"161\":2,\"170\":1,\"179\":3,\"184\":2,\"185\":2,\"202\":1,\"209\":2,\"210\":2,\"211\":1,\"215\":3,\"220\":2,\"221\":2,\"239\":2,\"240\":2,\"241\":1,\"245\":3,\"250\":2,\"251\":1,\"269\":2,\"270\":3,\"271\":1,\"275\":3,\"280\":2,\"281\":1,\"315\":2,\"316\":3,\"317\":1,\"321\":3,\"326\":2,\"327\":1,\"361\":2,\"362\":3,\"363\":1,\"367\":3,\"372\":2,\"373\":1,\"409\":1,\"437\":1,\"457\":1,\"487\":1,\"491\":1,\"525\":1,\"560\":1,\"588\":1,\"640\":1,\"645\":1,\"664\":1,\"706\":2,\"707\":4,\"708\":1,\"712\":3,\"717\":2,\"718\":1,\"743\":1,\"810\":1,\"847\":1,\"852\":1,\"871\":1,\"931\":1,\"935\":3,\"940\":2,\"941\":1,\"966\":1,\"1033\":1,\"1070\":1,\"1075\":1,\"1094\":1,\"1127\":1,\"1194\":1,\"1247\":1,\"1252\":1,\"1271\":1,\"1320\":1,\"1387\":1,\"1440\":1,\"1445\":1,\"1464\":1,\"1507\":1,\"1581\":1,\"1642\":1,\"1648\":1,\"1667\":1,\"1716\":1,\"1783\":1,\"1820\":1,\"1825\":1,\"1844\":1,\"1903\":1,\"1977\":1,\"2038\":1,\"2044\":1,\"2063\":1,\"2122\":1,\"2196\":1,\"2257\":1,\"2263\":1,\"2282\":1}}],[\"come\",{\"1\":{\"28\":1}}],[\"comprehensive\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"compile\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"complex\",{\"1\":{\"89\":1,\"298\":1,\"301\":1,\"348\":1,\"351\":1,\"689\":1,\"692\":1,\"896\":1,\"899\":1}}],[\"completes\",{\"1\":{\"69\":1}}],[\"completed\",{\"1\":{\"54\":2,\"61\":1}}],[\"compliant\",{\"1\":{\"73\":1,\"91\":1}}],[\"compose\",{\"0\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1},\"1\":{\"132\":3,\"137\":6,\"138\":4,\"139\":1,\"155\":3,\"160\":5,\"161\":4,\"162\":1,\"167\":1,\"168\":3,\"169\":3,\"179\":3,\"184\":5,\"185\":4,\"186\":1,\"191\":1,\"192\":3,\"193\":3,\"215\":3,\"220\":5,\"221\":4,\"222\":1,\"227\":1,\"228\":3,\"229\":3,\"245\":3,\"250\":5,\"251\":4,\"252\":1,\"257\":1,\"258\":3,\"259\":3,\"275\":3,\"280\":5,\"281\":4,\"282\":1,\"287\":1,\"288\":3,\"289\":3,\"321\":3,\"326\":5,\"327\":4,\"328\":1,\"333\":1,\"334\":3,\"335\":3,\"367\":3,\"372\":5,\"373\":4,\"374\":1,\"379\":1,\"380\":3,\"381\":3,\"387\":2,\"478\":2,\"538\":2,\"631\":2,\"712\":3,\"717\":5,\"718\":4,\"719\":1,\"724\":1,\"725\":3,\"726\":3,\"756\":2,\"838\":2,\"931\":2,\"935\":3,\"940\":5,\"941\":4,\"942\":1,\"947\":1,\"948\":3,\"949\":3,\"979\":2,\"1061\":2,\"1140\":2,\"1238\":2,\"1333\":2,\"1431\":2,\"1520\":2,\"1630\":2,\"1729\":2,\"1811\":2,\"1916\":2,\"2026\":2,\"2135\":2,\"2245\":2}}],[\"composed\",{\"1\":{\"68\":1}}],[\"component\",{\"1\":{\"25\":1}}],[\"components\",{\"1\":{\"10\":2,\"58\":1,\"63\":1,\"81\":1,\"90\":1}}],[\"compatable\",{\"1\":{\"208\":1,\"238\":1,\"268\":1,\"314\":1,\"360\":1,\"929\":1}}],[\"compatibility\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"compatible\",{\"1\":{\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"170\":1,\"184\":1,\"185\":1,\"193\":1,\"202\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"705\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"companies\",{\"1\":{\"62\":1}}],[\"compared\",{\"1\":{\"52\":1}}],[\"computation\",{\"1\":{\"39\":1}}],[\"computer\",{\"1\":{\"13\":1}}],[\"competencies\",{\"1\":{\"10\":2}}],[\"comma\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1445\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1581\":1,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1825\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1977\":1,\"2044\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2196\":1,\"2263\":1}}],[\"command\",{\"1\":{\"137\":1,\"138\":2,\"160\":1,\"161\":2,\"184\":1,\"185\":2,\"220\":1,\"221\":2,\"250\":1,\"251\":2,\"280\":1,\"281\":2,\"326\":1,\"327\":2,\"372\":1,\"373\":2,\"717\":1,\"718\":2,\"940\":1,\"941\":2}}],[\"commands\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"comment\",{\"1\":{\"300\":2,\"350\":2,\"691\":2,\"898\":2}}],[\"commitment\",{\"0\":{\"97\":1}}],[\"committed\",{\"1\":{\"27\":1}}],[\"committee\",{\"1\":{\"0\":1}}],[\"commonplace\",{\"1\":{\"81\":1}}],[\"common\",{\"0\":{\"209\":1,\"239\":1,\"269\":1,\"315\":1,\"361\":1,\"441\":1,\"706\":1},\"1\":{\"10\":1,\"76\":1,\"77\":1,\"129\":1,\"133\":2,\"152\":1,\"156\":2,\"176\":1,\"180\":2,\"192\":1,\"193\":1,\"212\":1,\"216\":2,\"242\":1,\"246\":2,\"272\":1,\"276\":2,\"318\":1,\"322\":2,\"364\":1,\"368\":2,\"382\":1,\"466\":1,\"496\":1,\"709\":1,\"713\":2,\"932\":1,\"936\":2}}],[\"communincation\",{\"1\":{\"92\":1}}],[\"communicate\",{\"1\":{\"54\":2,\"63\":1,\"73\":1}}],[\"communication\",{\"1\":{\"0\":1,\"49\":1,\"52\":1,\"53\":1,\"58\":1,\"59\":1,\"60\":1,\"61\":1,\"62\":2,\"66\":1,\"73\":1,\"95\":1,\"100\":1,\"126\":1,\"134\":4,\"149\":1,\"157\":4,\"173\":1,\"181\":4,\"205\":1,\"217\":4,\"235\":1,\"247\":4,\"265\":1,\"277\":4,\"311\":1,\"323\":4,\"357\":1,\"369\":4,\"702\":1,\"714\":4,\"925\":1,\"937\":4}}],[\"community\",{\"0\":{\"3\":1,\"5\":1,\"10\":1},\"1\":{\"0\":1,\"5\":1,\"8\":1,\"10\":3,\"17\":1,\"19\":1,\"27\":1,\"29\":1,\"37\":1,\"62\":1,\"73\":1,\"103\":1,\"290\":1,\"291\":2,\"303\":1,\"305\":3,\"340\":1,\"341\":2,\"353\":1,\"355\":3,\"681\":1,\"682\":2,\"694\":1,\"696\":3,\"888\":1,\"889\":2,\"901\":1,\"903\":3}}],[\"convention\",{\"1\":{\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"847\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"concern\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"concepts\",{\"1\":{\"80\":1,\"81\":1,\"84\":1}}],[\"concept\",{\"1\":{\"0\":2,\"11\":1,\"39\":2,\"42\":1,\"59\":1,\"62\":2,\"99\":1,\"125\":1,\"148\":1,\"172\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"701\":1,\"924\":1}}],[\"conduct\",{\"1\":{\"89\":1}}],[\"conducted\",{\"1\":{\"81\":1}}],[\"conducts\",{\"1\":{\"13\":1}}],[\"conditions\",{\"1\":{\"62\":2}}],[\"conf\",{\"1\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"confidential\",{\"1\":{\"396\":1,\"547\":1,\"765\":1,\"766\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"confidentiality\",{\"1\":{\"20\":1,\"25\":1,\"99\":1}}],[\"confident\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"config\",{\"1\":{\"137\":3,\"138\":3,\"160\":3,\"161\":3,\"184\":3,\"185\":3,\"192\":1,\"220\":3,\"221\":3,\"250\":3,\"251\":3,\"280\":3,\"281\":3,\"326\":3,\"327\":3,\"372\":3,\"373\":3,\"489\":1,\"606\":1,\"643\":1,\"717\":3,\"718\":3,\"850\":1,\"921\":1,\"931\":1,\"940\":3,\"941\":3,\"1073\":1,\"1213\":1,\"1250\":1,\"1301\":1,\"1406\":1,\"1443\":1,\"1578\":1,\"1605\":1,\"1645\":1,\"1697\":1,\"1823\":1,\"1874\":1,\"1974\":1,\"2001\":1,\"2041\":1,\"2093\":1,\"2193\":1,\"2220\":1,\"2260\":1,\"2312\":1}}],[\"configure\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"385\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":1,\"420\":2,\"425\":1,\"426\":1,\"427\":1,\"429\":1,\"430\":1,\"438\":2,\"440\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"480\":1,\"482\":1,\"492\":2,\"494\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"536\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":1,\"571\":2,\"576\":1,\"577\":1,\"578\":1,\"580\":1,\"581\":1,\"589\":2,\"591\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"633\":1,\"635\":1,\"646\":2,\"648\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"723\":1,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"754\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"789\":2,\"794\":1,\"795\":1,\"796\":1,\"798\":1,\"799\":1,\"811\":2,\"813\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"840\":1,\"842\":1,\"853\":2,\"855\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"915\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"946\":1,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"977\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1012\":2,\"1017\":1,\"1018\":1,\"1019\":1,\"1021\":1,\"1022\":1,\"1034\":2,\"1036\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1076\":2,\"1078\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1173\":2,\"1178\":1,\"1179\":1,\"1180\":1,\"1182\":1,\"1183\":1,\"1195\":2,\"1197\":1,\"1207\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1253\":2,\"1255\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1295\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1366\":2,\"1371\":1,\"1372\":1,\"1373\":1,\"1375\":1,\"1376\":1,\"1388\":2,\"1390\":1,\"1400\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1446\":2,\"1448\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1556\":2,\"1561\":1,\"1562\":1,\"1563\":1,\"1565\":1,\"1566\":1,\"1577\":1,\"1582\":2,\"1584\":1,\"1599\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1649\":2,\"1651\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1691\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1762\":2,\"1767\":1,\"1768\":1,\"1769\":1,\"1771\":1,\"1772\":1,\"1784\":2,\"1786\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1826\":2,\"1828\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1868\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1952\":2,\"1957\":1,\"1958\":1,\"1959\":1,\"1961\":1,\"1962\":1,\"1973\":1,\"1978\":2,\"1980\":1,\"1995\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2045\":2,\"2047\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2087\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2171\":2,\"2176\":1,\"2177\":1,\"2178\":1,\"2180\":1,\"2181\":1,\"2192\":1,\"2197\":2,\"2199\":1,\"2214\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2264\":2,\"2266\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2306\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"configured\",{\"1\":{\"54\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"423\":1,\"424\":1,\"574\":1,\"575\":1,\"610\":3,\"643\":1,\"674\":1,\"713\":1,\"792\":1,\"793\":1,\"817\":3,\"881\":1,\"936\":1,\"1015\":1,\"1016\":1,\"1040\":3,\"1104\":1,\"1176\":1,\"1177\":1,\"1217\":3,\"1281\":1,\"1369\":1,\"1370\":1,\"1410\":3,\"1474\":1,\"1482\":2,\"1559\":1,\"1560\":1,\"1580\":1,\"1586\":1,\"1609\":3,\"1647\":1,\"1677\":1,\"1765\":1,\"1766\":1,\"1790\":3,\"1854\":1,\"1878\":2,\"1955\":1,\"1956\":1,\"1976\":1,\"1982\":1,\"2005\":3,\"2043\":1,\"2073\":1,\"2097\":2,\"2174\":1,\"2175\":1,\"2195\":1,\"2201\":1,\"2224\":3,\"2262\":1,\"2292\":1}}],[\"configuration\",{\"0\":{\"495\":1,\"509\":1,\"594\":1,\"619\":1,\"677\":1,\"727\":1,\"826\":1,\"884\":1,\"908\":1,\"950\":1,\"1049\":1,\"1107\":1,\"1111\":1,\"1200\":1,\"1226\":1,\"1284\":1,\"1288\":1,\"1304\":1,\"1393\":1,\"1419\":1,\"1477\":1,\"1491\":1,\"1588\":1,\"1592\":1,\"1618\":1,\"1680\":1,\"1684\":1,\"1700\":1,\"1799\":1,\"1857\":1,\"1861\":1,\"1887\":1,\"1984\":1,\"1988\":1,\"2014\":1,\"2076\":1,\"2080\":1,\"2106\":1,\"2203\":1,\"2207\":1,\"2233\":1,\"2295\":1,\"2299\":1},\"1\":{\"95\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"129\":1,\"137\":2,\"138\":1,\"142\":1,\"152\":1,\"160\":2,\"161\":1,\"165\":3,\"171\":1,\"176\":1,\"184\":2,\"185\":1,\"189\":3,\"192\":2,\"203\":1,\"212\":1,\"220\":2,\"221\":1,\"225\":3,\"226\":6,\"242\":1,\"250\":2,\"251\":1,\"255\":3,\"256\":6,\"272\":1,\"280\":2,\"281\":1,\"285\":3,\"286\":6,\"318\":1,\"326\":2,\"327\":1,\"331\":4,\"332\":6,\"364\":1,\"372\":2,\"373\":1,\"377\":3,\"378\":6,\"382\":1,\"466\":1,\"593\":1,\"608\":1,\"610\":6,\"674\":1,\"675\":1,\"676\":1,\"677\":3,\"680\":1,\"709\":1,\"717\":2,\"718\":1,\"722\":4,\"723\":6,\"815\":1,\"817\":6,\"881\":1,\"882\":1,\"883\":1,\"884\":3,\"887\":1,\"923\":1,\"932\":1,\"940\":2,\"941\":1,\"945\":4,\"946\":6,\"1038\":1,\"1040\":6,\"1104\":1,\"1105\":1,\"1106\":1,\"1107\":3,\"1110\":1,\"1199\":1,\"1215\":1,\"1217\":6,\"1281\":1,\"1282\":1,\"1283\":1,\"1284\":3,\"1287\":1,\"1303\":1,\"1392\":1,\"1408\":1,\"1410\":6,\"1474\":1,\"1475\":1,\"1476\":1,\"1477\":3,\"1480\":1,\"1482\":5,\"1586\":1,\"1587\":1,\"1588\":3,\"1591\":1,\"1607\":1,\"1609\":6,\"1677\":1,\"1678\":1,\"1679\":1,\"1680\":3,\"1683\":1,\"1699\":1,\"1788\":1,\"1790\":6,\"1854\":1,\"1855\":1,\"1856\":1,\"1857\":3,\"1860\":1,\"1876\":1,\"1878\":5,\"1982\":1,\"1983\":1,\"1984\":3,\"1987\":1,\"2003\":1,\"2005\":6,\"2073\":1,\"2074\":1,\"2075\":1,\"2076\":3,\"2079\":1,\"2095\":1,\"2097\":5,\"2201\":1,\"2202\":1,\"2203\":3,\"2206\":1,\"2222\":1,\"2224\":6,\"2292\":1,\"2293\":1,\"2294\":1,\"2295\":3,\"2298\":1,\"2314\":1}}],[\"configurations\",{\"1\":{\"64\":1,\"95\":1,\"293\":1,\"343\":1,\"684\":1,\"891\":1,\"931\":1}}],[\"configuring\",{\"1\":{\"64\":1,\"929\":1}}],[\"confused\",{\"1\":{\"54\":1}}],[\"conference\",{\"0\":{\"41\":1,\"42\":1}}],[\"constructive\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"console\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"consolidate\",{\"1\":{\"89\":1}}],[\"consolidation\",{\"1\":{\"81\":1}}],[\"consortia\",{\"1\":{\"49\":1,\"62\":1,\"81\":1}}],[\"consortium\",{\"0\":{\"11\":1},\"1\":{\"62\":1}}],[\"consider\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"considerations\",{\"1\":{\"84\":1}}],[\"considering\",{\"1\":{\"81\":1}}],[\"consisting\",{\"1\":{\"67\":1}}],[\"consists\",{\"1\":{\"49\":1,\"59\":1,\"63\":1}}],[\"consumer\",{\"1\":{\"13\":1}}],[\"consultation\",{\"1\":{\"10\":1}}],[\"consent\",{\"1\":{\"0\":1,\"58\":1,\"63\":1}}],[\"connecttimeout\",{\"0\":{\"454\":1,\"522\":1,\"661\":1,\"740\":1,\"868\":1,\"963\":1,\"1091\":1,\"1124\":1,\"1268\":1,\"1317\":1,\"1461\":1,\"1504\":1,\"1664\":1,\"1713\":1,\"1841\":1,\"1900\":1,\"2060\":1,\"2119\":1,\"2279\":1},\"1\":{\"454\":1,\"522\":1,\"661\":1,\"740\":1,\"868\":1,\"963\":1,\"1091\":1,\"1124\":1,\"1268\":1,\"1317\":1,\"1461\":1,\"1504\":1,\"1664\":1,\"1713\":1,\"1841\":1,\"1900\":1,\"2060\":1,\"2119\":1,\"2279\":1}}],[\"connector\",{\"1\":{\"442\":1,\"443\":1,\"464\":1,\"465\":1,\"510\":1,\"511\":1,\"532\":1,\"533\":1,\"649\":1,\"650\":1,\"671\":1,\"672\":1,\"728\":1,\"729\":1,\"750\":1,\"751\":1,\"856\":1,\"857\":1,\"878\":1,\"879\":1,\"951\":1,\"952\":1,\"973\":1,\"974\":1,\"1079\":1,\"1080\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1134\":1,\"1135\":1,\"1256\":1,\"1257\":1,\"1278\":1,\"1279\":1,\"1305\":1,\"1306\":1,\"1327\":1,\"1328\":1,\"1449\":1,\"1450\":1,\"1471\":1,\"1472\":1,\"1492\":1,\"1493\":1,\"1514\":1,\"1515\":1,\"1652\":1,\"1653\":1,\"1674\":1,\"1675\":1,\"1701\":1,\"1702\":1,\"1723\":1,\"1724\":1,\"1829\":1,\"1830\":1,\"1851\":1,\"1852\":1,\"1888\":1,\"1889\":1,\"1910\":1,\"1911\":1,\"2048\":1,\"2049\":1,\"2070\":1,\"2071\":1,\"2107\":1,\"2108\":1,\"2129\":1,\"2130\":1,\"2267\":1,\"2268\":1,\"2289\":1,\"2290\":1}}],[\"connect\",{\"0\":{\"400\":1,\"403\":1,\"470\":1,\"551\":1,\"554\":1,\"623\":1,\"673\":1,\"770\":1,\"773\":1,\"830\":1,\"880\":1,\"993\":1,\"996\":1,\"1053\":1,\"1103\":1,\"1154\":1,\"1157\":1,\"1230\":1,\"1280\":1,\"1347\":1,\"1350\":1,\"1423\":1,\"1473\":1,\"1537\":1,\"1540\":1,\"1585\":1,\"1622\":1,\"1676\":1,\"1743\":1,\"1746\":1,\"1803\":1,\"1853\":1,\"1933\":1,\"1936\":1,\"1981\":1,\"2018\":1,\"2072\":1,\"2152\":1,\"2155\":1,\"2200\":1,\"2237\":1,\"2291\":1},\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"138\":1,\"161\":1,\"165\":1,\"171\":1,\"185\":1,\"189\":1,\"203\":1,\"221\":1,\"225\":1,\"251\":1,\"255\":1,\"281\":1,\"285\":1,\"327\":1,\"331\":2,\"373\":1,\"377\":1,\"400\":1,\"403\":1,\"454\":1,\"470\":1,\"522\":1,\"551\":1,\"554\":1,\"610\":4,\"613\":2,\"623\":1,\"661\":1,\"674\":2,\"675\":1,\"677\":1,\"680\":1,\"718\":1,\"722\":2,\"740\":1,\"770\":1,\"773\":1,\"817\":4,\"820\":2,\"830\":1,\"868\":1,\"881\":2,\"882\":1,\"884\":1,\"887\":1,\"941\":1,\"945\":2,\"963\":1,\"993\":1,\"996\":1,\"1040\":4,\"1043\":2,\"1053\":1,\"1091\":1,\"1104\":2,\"1105\":1,\"1107\":1,\"1110\":1,\"1124\":1,\"1154\":1,\"1157\":1,\"1217\":4,\"1220\":2,\"1230\":1,\"1268\":1,\"1281\":2,\"1282\":1,\"1284\":1,\"1287\":1,\"1317\":1,\"1347\":1,\"1350\":1,\"1410\":4,\"1413\":2,\"1423\":1,\"1461\":1,\"1474\":2,\"1475\":1,\"1477\":1,\"1480\":1,\"1482\":5,\"1485\":2,\"1504\":1,\"1537\":1,\"1540\":1,\"1586\":2,\"1587\":1,\"1588\":1,\"1591\":1,\"1609\":4,\"1612\":2,\"1622\":1,\"1664\":1,\"1677\":2,\"1678\":1,\"1680\":1,\"1683\":1,\"1713\":1,\"1743\":1,\"1746\":1,\"1790\":4,\"1793\":2,\"1803\":1,\"1841\":1,\"1854\":2,\"1855\":1,\"1857\":1,\"1860\":1,\"1878\":5,\"1881\":2,\"1900\":1,\"1933\":1,\"1936\":1,\"1982\":2,\"1983\":1,\"1984\":1,\"1987\":1,\"2005\":4,\"2008\":2,\"2018\":1,\"2060\":1,\"2073\":2,\"2074\":1,\"2076\":1,\"2079\":1,\"2097\":5,\"2100\":2,\"2119\":1,\"2152\":1,\"2155\":1,\"2201\":2,\"2202\":1,\"2203\":1,\"2206\":1,\"2224\":4,\"2227\":2,\"2237\":1,\"2279\":1,\"2292\":2,\"2293\":1,\"2295\":1,\"2298\":1}}],[\"connected\",{\"1\":{\"55\":3,\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2}}],[\"connection\",{\"0\":{\"500\":1,\"501\":1,\"597\":1,\"598\":1,\"911\":1,\"912\":1,\"1203\":1,\"1204\":1,\"1291\":1,\"1292\":1,\"1396\":1,\"1397\":1,\"1595\":1,\"1596\":1,\"1687\":1,\"1688\":1,\"1864\":1,\"1865\":1,\"1991\":1,\"1992\":1,\"2083\":1,\"2084\":1,\"2210\":1,\"2211\":1,\"2302\":1,\"2303\":1},\"1\":{\"63\":1,\"64\":1,\"68\":1,\"69\":1,\"71\":1,\"73\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"400\":1,\"403\":1,\"410\":1,\"411\":1,\"433\":1,\"434\":1,\"470\":1,\"500\":3,\"501\":3,\"502\":1,\"503\":1,\"551\":1,\"554\":1,\"561\":1,\"562\":1,\"584\":1,\"585\":1,\"597\":3,\"598\":3,\"599\":1,\"600\":1,\"623\":1,\"677\":1,\"718\":1,\"770\":1,\"773\":1,\"779\":1,\"780\":1,\"805\":1,\"806\":1,\"830\":1,\"884\":1,\"911\":3,\"912\":3,\"913\":1,\"914\":1,\"941\":1,\"993\":1,\"996\":1,\"1002\":1,\"1003\":1,\"1028\":1,\"1029\":1,\"1053\":1,\"1107\":1,\"1154\":1,\"1157\":1,\"1163\":1,\"1164\":1,\"1189\":1,\"1190\":1,\"1203\":3,\"1204\":3,\"1205\":1,\"1206\":1,\"1230\":1,\"1284\":1,\"1291\":3,\"1292\":3,\"1293\":1,\"1294\":1,\"1347\":1,\"1350\":1,\"1356\":1,\"1357\":1,\"1382\":1,\"1383\":1,\"1396\":3,\"1397\":3,\"1398\":1,\"1399\":1,\"1423\":1,\"1477\":1,\"1537\":1,\"1540\":1,\"1546\":1,\"1547\":1,\"1572\":1,\"1573\":1,\"1588\":1,\"1595\":3,\"1596\":3,\"1597\":1,\"1598\":1,\"1622\":1,\"1680\":1,\"1687\":3,\"1688\":3,\"1689\":1,\"1690\":1,\"1743\":1,\"1746\":1,\"1752\":1,\"1753\":1,\"1778\":1,\"1779\":1,\"1803\":1,\"1857\":1,\"1864\":3,\"1865\":3,\"1866\":1,\"1867\":1,\"1933\":1,\"1936\":1,\"1942\":1,\"1943\":1,\"1968\":1,\"1969\":1,\"1984\":1,\"1991\":3,\"1992\":3,\"1993\":1,\"1994\":1,\"2018\":1,\"2076\":1,\"2083\":3,\"2084\":3,\"2085\":1,\"2086\":1,\"2152\":1,\"2155\":1,\"2161\":1,\"2162\":1,\"2187\":1,\"2188\":1,\"2203\":1,\"2210\":3,\"2211\":3,\"2212\":1,\"2213\":1,\"2237\":1,\"2295\":1,\"2302\":3,\"2303\":3,\"2304\":1,\"2305\":1}}],[\"connections\",{\"1\":{\"54\":2,\"63\":2,\"70\":1,\"73\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"397\":1,\"406\":1,\"451\":1,\"456\":1,\"458\":1,\"467\":1,\"472\":1,\"519\":1,\"524\":1,\"526\":1,\"548\":1,\"557\":1,\"620\":1,\"625\":1,\"658\":1,\"663\":1,\"665\":1,\"714\":1,\"737\":1,\"742\":1,\"744\":1,\"767\":1,\"776\":1,\"827\":1,\"832\":1,\"865\":1,\"870\":1,\"872\":1,\"937\":1,\"960\":1,\"965\":1,\"967\":1,\"990\":1,\"999\":1,\"1050\":1,\"1055\":1,\"1088\":1,\"1093\":1,\"1095\":1,\"1121\":1,\"1126\":1,\"1128\":1,\"1151\":1,\"1160\":1,\"1227\":1,\"1232\":1,\"1265\":1,\"1270\":1,\"1272\":1,\"1314\":1,\"1319\":1,\"1321\":1,\"1344\":1,\"1353\":1,\"1420\":1,\"1425\":1,\"1458\":1,\"1463\":1,\"1465\":1,\"1501\":1,\"1506\":1,\"1508\":1,\"1534\":1,\"1543\":1,\"1619\":1,\"1624\":1,\"1661\":1,\"1666\":1,\"1668\":1,\"1710\":1,\"1715\":1,\"1717\":1,\"1740\":1,\"1749\":1,\"1800\":1,\"1805\":1,\"1838\":1,\"1843\":1,\"1845\":1,\"1897\":1,\"1902\":1,\"1904\":1,\"1930\":1,\"1939\":1,\"2015\":1,\"2020\":1,\"2057\":1,\"2062\":1,\"2064\":1,\"2116\":1,\"2121\":1,\"2123\":1,\"2149\":1,\"2158\":1,\"2234\":1,\"2239\":1,\"2276\":1,\"2281\":1,\"2283\":1}}],[\"connecting\",{\"1\":{\"10\":1}}],[\"connects\",{\"1\":{\"10\":1,\"59\":1,\"90\":1}}],[\"continuous\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"continues\",{\"1\":{\"91\":1}}],[\"continue\",{\"1\":{\"61\":1,\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"containing\",{\"1\":{\"435\":1,\"486\":1,\"505\":1,\"586\":1,\"602\":1,\"639\":1,\"807\":1,\"846\":1,\"917\":1,\"1030\":1,\"1069\":1,\"1191\":1,\"1209\":1,\"1246\":1,\"1297\":1,\"1384\":1,\"1402\":1,\"1439\":1,\"1574\":1,\"1601\":1,\"1641\":1,\"1693\":1,\"1780\":1,\"1819\":1,\"1870\":1,\"1970\":1,\"1997\":1,\"2037\":1,\"2089\":1,\"2189\":1,\"2216\":1,\"2256\":1,\"2308\":1}}],[\"contain\",{\"1\":{\"169\":2,\"193\":2,\"226\":1,\"229\":2,\"256\":1,\"259\":2,\"286\":1,\"289\":2,\"332\":1,\"335\":2,\"378\":1,\"381\":2,\"506\":1,\"603\":1,\"723\":1,\"726\":2,\"918\":1,\"946\":1,\"949\":2,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"containers\",{\"1\":{\"167\":1,\"168\":1,\"169\":1,\"191\":1,\"192\":1,\"193\":1,\"227\":1,\"228\":1,\"229\":1,\"257\":1,\"258\":1,\"259\":1,\"287\":1,\"288\":1,\"289\":1,\"294\":1,\"333\":1,\"334\":1,\"335\":1,\"344\":1,\"379\":1,\"380\":1,\"381\":1,\"685\":1,\"724\":1,\"725\":1,\"726\":1,\"892\":1,\"947\":1,\"948\":1,\"949\":1}}],[\"container\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"498\":1,\"595\":1,\"717\":1,\"718\":1,\"909\":1,\"940\":1,\"941\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"containerd\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"contains\",{\"1\":{\"61\":1,\"506\":1,\"603\":1,\"610\":1,\"817\":1,\"918\":1,\"1040\":1,\"1210\":1,\"1217\":1,\"1298\":1,\"1403\":1,\"1410\":1,\"1482\":1,\"1602\":1,\"1609\":1,\"1694\":1,\"1790\":1,\"1871\":1,\"1878\":1,\"1998\":1,\"2005\":1,\"2090\":1,\"2097\":1,\"2217\":1,\"2224\":1,\"2309\":1}}],[\"contact\",{\"0\":{\"3\":1},\"1\":{\"4\":1,\"17\":1,\"28\":1,\"102\":1,\"127\":1,\"128\":1,\"150\":1,\"151\":1,\"174\":1,\"175\":1,\"206\":1,\"207\":1,\"236\":1,\"237\":1,\"266\":1,\"267\":1,\"303\":1,\"312\":1,\"313\":1,\"353\":1,\"358\":1,\"359\":1,\"694\":1,\"703\":1,\"704\":1,\"901\":1,\"926\":1,\"927\":1}}],[\"content\",{\"1\":{\"63\":1,\"137\":5,\"138\":4,\"160\":5,\"161\":4,\"184\":5,\"185\":4,\"220\":5,\"221\":4,\"250\":5,\"251\":4,\"280\":5,\"281\":4,\"326\":5,\"327\":4,\"372\":5,\"373\":4,\"717\":5,\"718\":4,\"940\":5,\"941\":4}}],[\"contents\",{\"1\":{\"58\":1}}],[\"contexts\",{\"1\":{\"84\":1}}],[\"context\",{\"0\":{\"463\":1,\"531\":1,\"670\":1,\"749\":1,\"877\":1,\"915\":1,\"972\":1,\"1100\":1,\"1133\":1,\"1207\":1,\"1277\":1,\"1295\":1,\"1326\":1,\"1400\":1,\"1470\":1,\"1513\":1,\"1599\":1,\"1673\":1,\"1691\":1,\"1722\":1,\"1850\":1,\"1868\":1,\"1909\":1,\"1995\":1,\"2069\":1,\"2087\":1,\"2128\":1,\"2214\":1,\"2288\":1,\"2306\":1},\"1\":{\"10\":1,\"89\":1,\"463\":2,\"531\":2,\"670\":2,\"749\":2,\"877\":2,\"915\":2,\"972\":2,\"1100\":2,\"1133\":2,\"1207\":2,\"1277\":2,\"1295\":2,\"1326\":2,\"1400\":2,\"1470\":2,\"1513\":2,\"1599\":2,\"1673\":2,\"1691\":2,\"1722\":2,\"1850\":2,\"1868\":2,\"1909\":2,\"1995\":2,\"2069\":2,\"2087\":2,\"2128\":2,\"2214\":2,\"2288\":2,\"2306\":2}}],[\"controlled\",{\"1\":{\"59\":1}}],[\"control\",{\"0\":{\"25\":1,\"609\":1,\"816\":1,\"1039\":1,\"1216\":1,\"1409\":1,\"1481\":1,\"1608\":1,\"1789\":1,\"1877\":1,\"2004\":1,\"2096\":1,\"2223\":1},\"1\":{\"52\":1,\"160\":1,\"165\":1,\"184\":1,\"189\":1,\"220\":1,\"225\":1,\"250\":1,\"255\":1,\"280\":1,\"285\":1,\"301\":1,\"326\":1,\"331\":2,\"351\":1,\"372\":1,\"377\":1,\"643\":1,\"674\":1,\"680\":1,\"692\":1,\"717\":1,\"722\":2,\"850\":1,\"881\":1,\"887\":1,\"899\":1,\"940\":1,\"945\":2,\"1073\":1,\"1104\":1,\"1110\":1,\"1250\":1,\"1281\":1,\"1287\":1,\"1443\":1,\"1474\":1,\"1480\":1,\"1578\":1,\"1586\":1,\"1591\":1,\"1645\":1,\"1677\":1,\"1683\":1,\"1823\":1,\"1854\":1,\"1860\":1,\"1974\":1,\"1982\":1,\"1987\":1,\"2041\":1,\"2073\":1,\"2079\":1,\"2193\":1,\"2201\":1,\"2206\":1,\"2260\":1,\"2292\":1,\"2298\":1}}],[\"contributor\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"contributors\",{\"1\":{\"6\":1,\"17\":1,\"18\":1,\"299\":1,\"301\":4,\"303\":1,\"305\":1,\"349\":1,\"351\":4,\"353\":1,\"355\":1,\"690\":1,\"692\":4,\"694\":1,\"696\":1,\"897\":1,\"899\":4,\"901\":1,\"903\":1}}],[\"contributing\",{\"0\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1},\"1\":{\"304\":1,\"305\":4,\"354\":1,\"355\":4,\"695\":1,\"696\":4,\"902\":1,\"903\":4}}],[\"contributions\",{\"1\":{\"290\":1,\"304\":1,\"305\":4,\"340\":1,\"354\":1,\"355\":4,\"681\":1,\"695\":1,\"696\":4,\"888\":1,\"902\":1,\"903\":4}}],[\"contribution\",{\"0\":{\"11\":1},\"1\":{\"100\":1,\"291\":1,\"303\":2,\"341\":1,\"353\":2,\"682\":1,\"694\":2,\"889\":1,\"901\":2}}],[\"contributes\",{\"1\":{\"10\":1}}],[\"contribute\",{\"0\":{\"7\":1,\"290\":1,\"303\":1,\"304\":1,\"340\":1,\"353\":1,\"354\":1,\"681\":1,\"694\":1,\"695\":1,\"888\":1,\"901\":1,\"902\":1},\"1\":{\"300\":1,\"303\":2,\"305\":4,\"350\":1,\"353\":2,\"355\":4,\"691\":1,\"694\":2,\"696\":4,\"898\":1,\"901\":2,\"903\":4}}],[\"coordinated\",{\"1\":{\"98\":1}}],[\"coordinate\",{\"1\":{\"0\":1,\"63\":1,\"91\":1}}],[\"elements\",{\"1\":{\"294\":2,\"344\":2,\"685\":2,\"892\":2}}],[\"editor\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"educational\",{\"1\":{\"13\":1}}],[\"education\",{\"1\":{\"0\":1,\"21\":1,\"62\":2,\"80\":1,\"88\":1}}],[\"ecosystem\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"economics\",{\"1\":{\"13\":2}}],[\"eclipse\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"echo\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"evaluate\",{\"1\":{\"84\":1}}],[\"even\",{\"1\":{\"66\":1,\"81\":1,\"125\":1,\"148\":1,\"172\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"event\",{\"1\":{\"61\":1,\"418\":2,\"419\":2,\"569\":2,\"570\":2,\"787\":2,\"788\":2,\"1010\":2,\"1011\":2,\"1171\":2,\"1172\":2,\"1364\":2,\"1365\":2,\"1554\":2,\"1555\":2,\"1760\":2,\"1761\":2,\"1950\":2,\"1951\":2,\"2169\":2,\"2170\":2}}],[\"events\",{\"1\":{\"61\":2,\"396\":1,\"547\":1,\"765\":1,\"766\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1531\":1,\"1532\":1,\"1738\":1,\"1739\":1,\"1927\":1,\"1928\":1,\"2146\":1,\"2147\":1}}],[\"everyone\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"everybody\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"every\",{\"1\":{\"0\":1,\"52\":1,\"61\":1,\"81\":1,\"291\":1,\"303\":2,\"341\":1,\"353\":2,\"394\":1,\"395\":1,\"396\":1,\"423\":1,\"545\":1,\"546\":1,\"547\":1,\"574\":1,\"682\":1,\"694\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"792\":1,\"889\":1,\"901\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1015\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1176\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1369\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1559\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1765\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1955\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2174\":1}}],[\"eu\",{\"1\":{\"73\":1}}],[\"european\",{\"1\":{\"1\":1}}],[\"early\",{\"1\":{\"64\":1}}],[\"easier\",{\"1\":{\"59\":1}}],[\"each\",{\"1\":{\"23\":1,\"49\":2,\"52\":1,\"55\":1,\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"928\":1,\"929\":1,\"946\":1}}],[\"etc\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"302\":1,\"321\":1,\"352\":1,\"367\":1,\"693\":1,\"712\":1,\"900\":1,\"935\":1}}],[\"et\",{\"1\":{\"39\":1}}],[\"either\",{\"1\":{\"77\":1,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"506\":1,\"603\":1,\"702\":1,\"918\":1,\"925\":1,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"eils\",{\"1\":{\"39\":1}}],[\"eine\",{\"1\":{\"32\":1}}],[\"einem\",{\"1\":{\"32\":1}}],[\"eines\",{\"1\":{\"32\":1}}],[\"einige\",{\"1\":{\"30\":1}}],[\"einführung\",{\"1\":{\"29\":2}}],[\"ein\",{\"1\":{\"29\":1,\"30\":1,\"32\":1}}],[\"empty\",{\"1\":{\"610\":1,\"643\":1,\"817\":1,\"915\":1,\"1040\":1,\"1207\":1,\"1217\":1,\"1295\":1,\"1400\":1,\"1410\":1,\"1482\":1,\"1599\":1,\"1609\":1,\"1691\":1,\"1790\":1,\"1868\":1,\"1878\":1,\"1995\":1,\"2005\":1,\"2087\":1,\"2097\":1,\"2214\":1,\"2224\":1,\"2306\":1}}],[\"empfehlen\",{\"1\":{\"31\":1}}],[\"emailclaim\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"email\",{\"0\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1},\"1\":{\"99\":1,\"611\":1,\"613\":1,\"618\":1,\"818\":1,\"820\":1,\"825\":1,\"1041\":1,\"1043\":1,\"1048\":1,\"1218\":1,\"1220\":1,\"1225\":1,\"1411\":1,\"1413\":1,\"1418\":1,\"1483\":1,\"1485\":1,\"1490\":2,\"1610\":1,\"1612\":1,\"1617\":1,\"1791\":1,\"1793\":1,\"1798\":1,\"1879\":1,\"1881\":1,\"1886\":2,\"2006\":1,\"2008\":1,\"2013\":1,\"2098\":1,\"2100\":1,\"2105\":2,\"2225\":1,\"2227\":1,\"2232\":1}}],[\"embark\",{\"1\":{\"27\":1}}],[\"error\",{\"1\":{\"128\":1,\"139\":2,\"140\":1,\"151\":1,\"162\":2,\"163\":1,\"175\":1,\"186\":2,\"187\":1,\"207\":1,\"222\":2,\"223\":1,\"237\":1,\"252\":2,\"253\":1,\"267\":1,\"282\":2,\"283\":1,\"299\":1,\"313\":1,\"328\":2,\"329\":1,\"349\":1,\"359\":1,\"374\":2,\"375\":1,\"418\":2,\"419\":2,\"423\":1,\"569\":2,\"570\":2,\"574\":1,\"690\":1,\"704\":1,\"719\":2,\"720\":1,\"787\":2,\"788\":2,\"792\":1,\"897\":1,\"927\":1,\"942\":2,\"943\":1,\"1010\":2,\"1011\":2,\"1015\":1,\"1171\":2,\"1172\":2,\"1176\":1,\"1364\":2,\"1365\":2,\"1369\":1,\"1554\":2,\"1555\":2,\"1559\":1,\"1760\":2,\"1761\":2,\"1765\":1,\"1950\":2,\"1951\":2,\"1955\":1,\"2169\":2,\"2170\":2,\"2174\":1}}],[\"errors\",{\"1\":{\"70\":1,\"71\":1,\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"726\":2,\"949\":2}}],[\"erste\",{\"1\":{\"31\":1}}],[\"erfüllt\",{\"1\":{\"30\":1}}],[\"especially\",{\"1\":{\"81\":1}}],[\"estimates\",{\"1\":{\"89\":1}}],[\"estimations\",{\"1\":{\"63\":1}}],[\"established\",{\"1\":{\"54\":1,\"62\":1,\"81\":1,\"89\":1,\"91\":2,\"400\":1,\"403\":1,\"410\":1,\"433\":1,\"470\":1,\"500\":1,\"501\":1,\"551\":1,\"554\":1,\"561\":1,\"584\":1,\"597\":1,\"598\":1,\"623\":1,\"770\":1,\"773\":1,\"779\":1,\"805\":1,\"830\":1,\"911\":1,\"912\":1,\"993\":1,\"996\":1,\"1002\":1,\"1028\":1,\"1053\":1,\"1154\":1,\"1157\":1,\"1163\":1,\"1189\":1,\"1203\":1,\"1204\":1,\"1230\":1,\"1291\":1,\"1292\":1,\"1347\":1,\"1350\":1,\"1356\":1,\"1382\":1,\"1396\":1,\"1397\":1,\"1423\":1,\"1537\":1,\"1540\":1,\"1546\":1,\"1572\":1,\"1595\":1,\"1596\":1,\"1622\":1,\"1687\":1,\"1688\":1,\"1743\":1,\"1746\":1,\"1752\":1,\"1778\":1,\"1803\":1,\"1864\":1,\"1865\":1,\"1933\":1,\"1936\":1,\"1942\":1,\"1968\":1,\"1991\":1,\"1992\":1,\"2018\":1,\"2083\":1,\"2084\":1,\"2152\":1,\"2155\":1,\"2161\":1,\"2187\":1,\"2210\":1,\"2211\":1,\"2237\":1,\"2302\":1,\"2303\":1}}],[\"establish\",{\"1\":{\"11\":1,\"411\":1,\"434\":1,\"562\":1,\"585\":1,\"780\":1,\"806\":1,\"1003\":1,\"1029\":1,\"1164\":1,\"1190\":1,\"1357\":1,\"1383\":1,\"1547\":1,\"1573\":1,\"1753\":1,\"1779\":1,\"1943\":1,\"1969\":1,\"2162\":1,\"2188\":1}}],[\"es\",{\"1\":{\"29\":1,\"31\":1,\"32\":1}}],[\"effect\",{\"1\":{\"418\":1,\"419\":1,\"569\":1,\"570\":1,\"787\":1,\"788\":1,\"1010\":1,\"1011\":1,\"1171\":1,\"1172\":1,\"1364\":1,\"1365\":1,\"1554\":1,\"1555\":1,\"1760\":1,\"1761\":1,\"1950\":1,\"1951\":1,\"2169\":1,\"2170\":1}}],[\"effectively\",{\"1\":{\"98\":1}}],[\"effective\",{\"1\":{\"81\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"effectiveness\",{\"1\":{\"20\":1}}],[\"effort\",{\"1\":{\"100\":1}}],[\"efforts\",{\"1\":{\"97\":1}}],[\"efficient\",{\"1\":{\"20\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"efficiency\",{\"1\":{\"11\":1}}],[\"efmi\",{\"1\":{\"1\":4}}],[\"e\",{\"1\":{\"4\":1,\"6\":1,\"14\":1,\"49\":1,\"52\":1,\"63\":2,\"67\":1,\"73\":1,\"74\":1,\"76\":3,\"77\":3,\"89\":1,\"99\":1,\"102\":1,\"126\":1,\"127\":3,\"129\":2,\"133\":2,\"134\":1,\"137\":5,\"138\":2,\"143\":2,\"149\":1,\"150\":3,\"152\":2,\"156\":2,\"157\":1,\"160\":4,\"161\":2,\"166\":2,\"173\":1,\"174\":3,\"176\":2,\"180\":2,\"181\":1,\"184\":4,\"185\":2,\"190\":2,\"206\":3,\"212\":1,\"216\":2,\"217\":1,\"220\":4,\"221\":2,\"226\":2,\"236\":3,\"242\":1,\"246\":2,\"247\":1,\"250\":4,\"251\":1,\"256\":2,\"266\":3,\"272\":1,\"276\":2,\"277\":1,\"280\":4,\"281\":1,\"286\":2,\"312\":3,\"318\":1,\"322\":2,\"323\":1,\"326\":4,\"327\":1,\"332\":2,\"358\":3,\"364\":1,\"368\":2,\"369\":1,\"372\":4,\"373\":1,\"378\":2,\"613\":2,\"618\":2,\"703\":3,\"709\":1,\"713\":2,\"714\":1,\"717\":4,\"718\":1,\"723\":2,\"820\":2,\"825\":2,\"926\":3,\"932\":1,\"936\":2,\"937\":1,\"940\":4,\"941\":1,\"946\":2,\"1043\":2,\"1048\":2,\"1220\":2,\"1225\":2,\"1413\":2,\"1418\":2,\"1485\":2,\"1490\":2,\"1612\":2,\"1617\":2,\"1793\":2,\"1798\":2,\"1881\":2,\"1886\":2,\"2008\":2,\"2013\":2,\"2100\":2,\"2105\":2,\"2227\":2,\"2232\":2}}],[\"exactly\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"810\":1,\"852\":1,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1}}],[\"examples\",{\"0\":{\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1},\"1\":{\"80\":1,\"81\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"example\",{\"0\":{\"67\":1,\"678\":1,\"885\":1,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1},\"1\":{\"59\":2,\"60\":1,\"61\":1,\"62\":1,\"63\":2,\"64\":2,\"66\":1,\"67\":2,\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"168\":1,\"169\":2,\"184\":2,\"185\":1,\"192\":1,\"193\":2,\"220\":2,\"221\":1,\"228\":1,\"229\":2,\"250\":2,\"251\":1,\"258\":1,\"259\":2,\"280\":2,\"281\":1,\"288\":1,\"289\":2,\"326\":2,\"327\":1,\"334\":1,\"335\":2,\"372\":2,\"373\":1,\"380\":1,\"381\":2,\"385\":1,\"387\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"408\":1,\"409\":1,\"413\":1,\"414\":1,\"415\":1,\"416\":1,\"417\":1,\"421\":1,\"422\":1,\"425\":1,\"426\":1,\"427\":1,\"428\":1,\"429\":1,\"437\":1,\"439\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"457\":2,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"478\":1,\"480\":1,\"482\":1,\"485\":1,\"487\":1,\"491\":1,\"493\":1,\"498\":1,\"499\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"525\":2,\"526\":1,\"536\":1,\"538\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"559\":1,\"560\":1,\"564\":1,\"565\":1,\"566\":1,\"567\":1,\"568\":1,\"572\":1,\"573\":1,\"576\":1,\"577\":1,\"578\":1,\"579\":1,\"580\":1,\"588\":1,\"590\":1,\"595\":1,\"596\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"610\":2,\"618\":3,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"631\":1,\"633\":1,\"635\":1,\"638\":1,\"640\":1,\"645\":1,\"647\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"664\":2,\"665\":1,\"677\":1,\"717\":2,\"718\":1,\"725\":1,\"726\":2,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"743\":2,\"744\":1,\"754\":1,\"756\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"778\":1,\"782\":1,\"783\":1,\"784\":1,\"785\":1,\"786\":1,\"790\":1,\"791\":1,\"794\":1,\"795\":1,\"796\":1,\"797\":1,\"798\":1,\"804\":1,\"808\":1,\"810\":1,\"812\":1,\"817\":2,\"825\":3,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"838\":1,\"840\":1,\"842\":1,\"845\":1,\"847\":1,\"852\":1,\"854\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"871\":2,\"872\":1,\"884\":1,\"909\":1,\"910\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"931\":3,\"940\":2,\"941\":1,\"948\":1,\"949\":2,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"966\":2,\"967\":1,\"977\":1,\"979\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1001\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1008\":1,\"1009\":1,\"1013\":1,\"1014\":1,\"1017\":1,\"1018\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1035\":1,\"1040\":2,\"1048\":3,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1061\":1,\"1063\":1,\"1065\":1,\"1068\":1,\"1070\":1,\"1075\":1,\"1077\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1094\":2,\"1095\":1,\"1107\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1127\":2,\"1128\":1,\"1138\":1,\"1140\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1162\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1169\":1,\"1170\":1,\"1174\":1,\"1175\":1,\"1178\":1,\"1179\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1196\":1,\"1201\":1,\"1202\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1217\":2,\"1225\":3,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1238\":1,\"1240\":1,\"1242\":1,\"1245\":1,\"1247\":1,\"1252\":1,\"1254\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1271\":2,\"1272\":1,\"1284\":1,\"1289\":1,\"1290\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1320\":2,\"1321\":1,\"1331\":1,\"1333\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1355\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1362\":1,\"1363\":1,\"1367\":1,\"1368\":1,\"1371\":1,\"1372\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1389\":1,\"1394\":1,\"1395\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1410\":2,\"1418\":3,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1431\":1,\"1433\":1,\"1435\":1,\"1438\":1,\"1440\":1,\"1445\":1,\"1447\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1464\":2,\"1465\":1,\"1477\":1,\"1482\":2,\"1490\":3,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1507\":2,\"1508\":1,\"1518\":1,\"1520\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1545\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1552\":1,\"1553\":1,\"1557\":1,\"1558\":1,\"1561\":1,\"1562\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1571\":1,\"1575\":1,\"1577\":1,\"1581\":1,\"1583\":1,\"1588\":1,\"1593\":1,\"1594\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1609\":2,\"1617\":3,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1630\":1,\"1632\":1,\"1634\":1,\"1640\":1,\"1642\":1,\"1648\":1,\"1650\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1667\":2,\"1668\":1,\"1680\":1,\"1685\":1,\"1686\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1716\":2,\"1717\":1,\"1727\":1,\"1729\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1751\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1758\":1,\"1759\":1,\"1763\":1,\"1764\":1,\"1767\":1,\"1768\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1785\":1,\"1790\":2,\"1798\":3,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1811\":1,\"1813\":1,\"1815\":1,\"1818\":1,\"1820\":1,\"1825\":1,\"1827\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1844\":2,\"1845\":1,\"1857\":1,\"1862\":1,\"1863\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1878\":2,\"1886\":3,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1903\":2,\"1904\":1,\"1914\":1,\"1916\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1941\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1948\":1,\"1949\":1,\"1953\":1,\"1954\":1,\"1957\":1,\"1958\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1967\":1,\"1971\":1,\"1973\":1,\"1977\":1,\"1979\":1,\"1984\":1,\"1989\":1,\"1990\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2005\":2,\"2013\":3,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2026\":1,\"2028\":1,\"2030\":1,\"2036\":1,\"2038\":1,\"2044\":1,\"2046\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2063\":2,\"2064\":1,\"2076\":1,\"2081\":1,\"2082\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2097\":2,\"2105\":3,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2122\":2,\"2123\":1,\"2133\":1,\"2135\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2160\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2167\":1,\"2168\":1,\"2172\":1,\"2173\":1,\"2176\":1,\"2177\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2186\":1,\"2190\":1,\"2192\":1,\"2196\":1,\"2198\":1,\"2203\":1,\"2208\":1,\"2209\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2224\":2,\"2232\":3,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2245\":1,\"2247\":1,\"2249\":1,\"2255\":1,\"2257\":1,\"2263\":1,\"2265\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2282\":2,\"2283\":1,\"2295\":1,\"2300\":1,\"2301\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"existing\",{\"1\":{\"129\":3,\"152\":3,\"176\":3,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"809\":1,\"932\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"exists\",{\"1\":{\"127\":2,\"150\":2,\"174\":2,\"206\":2,\"236\":2,\"266\":2,\"312\":2,\"358\":2,\"703\":2,\"926\":2}}],[\"exist\",{\"1\":{\"97\":1}}],[\"extension\",{\"1\":{\"613\":1,\"617\":1,\"820\":1,\"824\":1,\"1043\":1,\"1047\":1,\"1220\":1,\"1224\":1,\"1413\":1,\"1417\":1,\"1485\":1,\"1612\":1,\"1616\":1,\"1793\":1,\"1797\":1,\"1881\":1,\"2008\":1,\"2012\":1,\"2100\":1,\"2227\":1,\"2231\":1}}],[\"extended\",{\"1\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"external\",{\"0\":{\"56\":1,\"64\":1},\"1\":{\"64\":1,\"76\":1,\"133\":1,\"134\":1,\"137\":4,\"138\":1,\"156\":1,\"157\":1,\"160\":3,\"161\":1,\"180\":1,\"181\":1,\"184\":3,\"185\":1,\"216\":1,\"217\":1,\"220\":3,\"221\":1,\"246\":1,\"247\":1,\"250\":3,\"251\":1,\"276\":1,\"277\":1,\"280\":3,\"281\":1,\"322\":1,\"323\":1,\"326\":3,\"327\":1,\"368\":1,\"369\":1,\"372\":3,\"373\":1,\"499\":2,\"596\":2,\"713\":1,\"714\":1,\"717\":3,\"718\":1,\"910\":2,\"936\":1,\"937\":1,\"940\":3,\"941\":1,\"1202\":2,\"1290\":2,\"1395\":2,\"1594\":2,\"1686\":2,\"1863\":2,\"1990\":2,\"2082\":2,\"2209\":2,\"2301\":2}}],[\"externally\",{\"1\":{\"53\":1}}],[\"extraction\",{\"1\":{\"21\":1,\"90\":1}}],[\"extract\",{\"1\":{\"0\":1,\"62\":1,\"137\":1,\"138\":2,\"160\":1,\"161\":2,\"184\":1,\"185\":2,\"220\":1,\"221\":2,\"250\":1,\"251\":2,\"280\":1,\"281\":2,\"326\":1,\"327\":2,\"372\":1,\"373\":2,\"717\":1,\"718\":2,\"940\":1,\"941\":2}}],[\"executor\",{\"1\":{\"801\":1,\"802\":1,\"803\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"2183\":1,\"2184\":1,\"2185\":1}}],[\"execution\",{\"1\":{\"52\":1,\"62\":1,\"92\":1}}],[\"executing\",{\"1\":{\"39\":1,\"42\":1,\"63\":1,\"931\":1}}],[\"executes\",{\"1\":{\"54\":1}}],[\"executed\",{\"1\":{\"49\":1,\"54\":1,\"60\":1,\"89\":1}}],[\"execute\",{\"1\":{\"0\":1,\"60\":1,\"61\":1,\"63\":1,\"66\":1,\"69\":1,\"80\":1,\"81\":1,\"88\":1,\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"385\":1,\"386\":1,\"476\":1,\"477\":1,\"536\":1,\"537\":1,\"629\":1,\"630\":1,\"725\":1,\"726\":1,\"754\":1,\"755\":1,\"836\":1,\"837\":1,\"948\":1,\"949\":1,\"977\":1,\"978\":1,\"1059\":1,\"1060\":1,\"1138\":1,\"1139\":1,\"1236\":1,\"1237\":1,\"1331\":1,\"1332\":1,\"1429\":1,\"1430\":1,\"1518\":1,\"1519\":1,\"1628\":1,\"1629\":1,\"1727\":1,\"1728\":1,\"1809\":1,\"1810\":1,\"1914\":1,\"1915\":1,\"2024\":1,\"2025\":1,\"2133\":1,\"2134\":1,\"2243\":1,\"2244\":1}}],[\"exposing\",{\"1\":{\"1577\":1,\"1973\":1,\"2192\":1}}],[\"expanded\",{\"1\":{\"137\":1}}],[\"expertise\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"experienced\",{\"1\":{\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"experience\",{\"0\":{\"8\":1},\"1\":{\"8\":1,\"80\":1,\"81\":1,\"301\":1,\"305\":2,\"351\":1,\"355\":2,\"692\":1,\"696\":2,\"899\":1,\"903\":2}}],[\"expected\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"explanations\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"explain\",{\"1\":{\"59\":1}}],[\"explained\",{\"1\":{\"53\":1}}],[\"explore\",{\"1\":{\"929\":1}}],[\"exploring\",{\"1\":{\"27\":1}}],[\"exploit\",{\"1\":{\"99\":1}}],[\"exploited\",{\"1\":{\"99\":1}}],[\"exclude\",{\"1\":{\"931\":1}}],[\"excluded\",{\"0\":{\"432\":1,\"583\":1,\"804\":1,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1},\"1\":{\"432\":2,\"583\":2,\"804\":2,\"1027\":2,\"1188\":2,\"1381\":2,\"1571\":2,\"1777\":2,\"1967\":2,\"2186\":2}}],[\"excited\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"excepted\",{\"1\":{\"505\":1,\"602\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1}}],[\"exceptions\",{\"1\":{\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"470\":1,\"471\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"623\":1,\"624\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"830\":1,\"831\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1053\":1,\"1054\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1230\":1,\"1231\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1423\":1,\"1424\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1622\":1,\"1623\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1803\":1,\"1804\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"2018\":1,\"2019\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2237\":1,\"2238\":1}}],[\"except\",{\"1\":{\"63\":1}}],[\"excellent\",{\"1\":{\"1\":1,\"73\":1}}],[\"exchanged\",{\"1\":{\"58\":1}}],[\"exchange\",{\"1\":{\"0\":1,\"11\":1,\"24\":1,\"39\":1,\"58\":1,\"59\":2,\"62\":3,\"91\":1}}],[\"engage\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"engines\",{\"1\":{\"0\":1}}],[\"engine\",{\"0\":{\"54\":1,\"77\":1,\"801\":1,\"802\":1,\"803\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"2183\":1,\"2184\":1,\"2185\":1},\"1\":{\"0\":1,\"23\":1,\"52\":3,\"60\":1,\"61\":1,\"63\":2,\"74\":1,\"77\":1,\"81\":1,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"801\":2,\"802\":2,\"803\":2,\"929\":1,\"935\":1,\"1024\":2,\"1025\":2,\"1026\":2,\"1185\":2,\"1186\":2,\"1187\":2,\"1378\":2,\"1379\":2,\"1380\":2,\"1568\":2,\"1569\":2,\"1570\":2,\"1774\":2,\"1775\":2,\"1776\":2,\"1964\":2,\"1965\":2,\"1966\":2,\"2183\":2,\"2184\":2,\"2185\":2}}],[\"enhancing\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"enhancement\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"enhanced\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"enhance\",{\"1\":{\"27\":1,\"290\":1,\"305\":1,\"340\":1,\"355\":1,\"681\":1,\"696\":1,\"888\":1,\"903\":1}}],[\"enough\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"encounter\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"299\":1,\"328\":1,\"349\":1,\"374\":1,\"690\":1,\"719\":1,\"897\":1,\"942\":1}}],[\"encourage\",{\"1\":{\"97\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"encoded\",{\"1\":{\"136\":4,\"159\":4,\"183\":4,\"219\":4,\"249\":4,\"279\":4,\"325\":4,\"371\":4,\"397\":1,\"398\":1,\"406\":1,\"413\":1,\"414\":1,\"425\":1,\"426\":1,\"429\":1,\"451\":1,\"452\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"472\":1,\"504\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":1,\"524\":1,\"526\":1,\"548\":1,\"549\":1,\"557\":1,\"564\":1,\"565\":1,\"576\":1,\"577\":1,\"580\":1,\"601\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"625\":1,\"658\":1,\"659\":1,\"663\":1,\"665\":1,\"677\":1,\"716\":4,\"737\":1,\"738\":1,\"742\":1,\"744\":1,\"767\":1,\"768\":1,\"776\":1,\"782\":1,\"783\":1,\"794\":1,\"795\":1,\"798\":1,\"827\":1,\"828\":1,\"832\":1,\"865\":1,\"866\":1,\"870\":1,\"872\":1,\"884\":1,\"916\":1,\"918\":1,\"919\":1,\"920\":1,\"939\":4,\"960\":1,\"961\":1,\"965\":1,\"967\":1,\"990\":1,\"991\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1050\":1,\"1051\":1,\"1055\":1,\"1088\":1,\"1089\":1,\"1093\":1,\"1095\":1,\"1107\":1,\"1121\":1,\"1122\":1,\"1126\":1,\"1128\":1,\"1151\":1,\"1152\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1208\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1232\":1,\"1265\":1,\"1266\":1,\"1270\":1,\"1272\":1,\"1284\":1,\"1296\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":1,\"1319\":1,\"1321\":1,\"1344\":1,\"1345\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1401\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1425\":1,\"1458\":1,\"1459\":1,\"1463\":1,\"1465\":1,\"1477\":1,\"1501\":1,\"1502\":1,\"1506\":1,\"1508\":1,\"1534\":1,\"1535\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1588\":1,\"1600\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1624\":1,\"1661\":1,\"1662\":1,\"1666\":1,\"1668\":1,\"1680\":1,\"1692\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":1,\"1715\":1,\"1717\":1,\"1740\":1,\"1741\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1800\":1,\"1801\":1,\"1805\":1,\"1838\":1,\"1839\":1,\"1843\":1,\"1845\":1,\"1857\":1,\"1869\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1897\":1,\"1898\":1,\"1902\":1,\"1904\":1,\"1930\":1,\"1931\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1984\":1,\"1996\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2020\":1,\"2057\":1,\"2058\":1,\"2062\":1,\"2064\":1,\"2076\":1,\"2088\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2116\":1,\"2117\":1,\"2121\":1,\"2123\":1,\"2149\":1,\"2150\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2203\":1,\"2215\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2239\":1,\"2276\":1,\"2277\":1,\"2281\":1,\"2283\":1,\"2295\":1,\"2307\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"encrypted\",{\"1\":{\"102\":1,\"136\":2,\"137\":2,\"138\":2,\"159\":2,\"160\":2,\"161\":2,\"183\":2,\"184\":2,\"185\":2,\"219\":2,\"220\":2,\"221\":2,\"249\":2,\"250\":2,\"251\":2,\"279\":2,\"280\":2,\"281\":2,\"325\":2,\"326\":2,\"327\":2,\"371\":2,\"372\":2,\"373\":2,\"398\":1,\"399\":1,\"414\":1,\"415\":1,\"452\":1,\"453\":1,\"468\":1,\"469\":1,\"520\":1,\"521\":1,\"549\":1,\"550\":1,\"565\":1,\"566\":1,\"621\":1,\"622\":1,\"659\":1,\"660\":1,\"716\":2,\"717\":2,\"718\":2,\"738\":1,\"739\":1,\"768\":1,\"769\":1,\"783\":1,\"784\":1,\"828\":1,\"829\":1,\"866\":1,\"867\":1,\"939\":2,\"940\":2,\"941\":2,\"961\":1,\"962\":1,\"991\":1,\"992\":1,\"1006\":1,\"1007\":1,\"1051\":1,\"1052\":1,\"1089\":1,\"1090\":1,\"1122\":1,\"1123\":1,\"1152\":1,\"1153\":1,\"1167\":1,\"1168\":1,\"1228\":1,\"1229\":1,\"1266\":1,\"1267\":1,\"1315\":1,\"1316\":1,\"1345\":1,\"1346\":1,\"1360\":1,\"1361\":1,\"1421\":1,\"1422\":1,\"1459\":1,\"1460\":1,\"1502\":1,\"1503\":1,\"1535\":1,\"1536\":1,\"1550\":1,\"1551\":1,\"1620\":1,\"1621\":1,\"1662\":1,\"1663\":1,\"1711\":1,\"1712\":1,\"1741\":1,\"1742\":1,\"1756\":1,\"1757\":1,\"1801\":1,\"1802\":1,\"1839\":1,\"1840\":1,\"1898\":1,\"1899\":1,\"1931\":1,\"1932\":1,\"1946\":1,\"1947\":1,\"2016\":1,\"2017\":1,\"2058\":1,\"2059\":1,\"2117\":1,\"2118\":1,\"2150\":1,\"2151\":1,\"2165\":1,\"2166\":1,\"2235\":1,\"2236\":1,\"2277\":1,\"2278\":1}}],[\"encryption\",{\"1\":{\"73\":1,\"99\":1}}],[\"environment\",{\"1\":{\"95\":1,\"129\":1,\"137\":5,\"138\":3,\"152\":1,\"160\":5,\"161\":3,\"176\":1,\"184\":5,\"185\":3,\"192\":1,\"220\":5,\"221\":3,\"226\":2,\"237\":2,\"250\":5,\"251\":3,\"256\":2,\"267\":2,\"280\":5,\"281\":3,\"286\":2,\"313\":2,\"326\":5,\"327\":3,\"332\":2,\"359\":2,\"372\":5,\"373\":3,\"378\":2,\"610\":1,\"678\":1,\"704\":2,\"717\":5,\"718\":3,\"723\":2,\"817\":1,\"885\":1,\"927\":2,\"929\":1,\"940\":5,\"941\":3,\"946\":2,\"1040\":1,\"1108\":1,\"1217\":1,\"1285\":1,\"1410\":1,\"1478\":1,\"1482\":1,\"1589\":1,\"1609\":1,\"1681\":1,\"1790\":1,\"1858\":1,\"1878\":1,\"1985\":1,\"2005\":1,\"2077\":1,\"2097\":1,\"2204\":1,\"2224\":1,\"2296\":1}}],[\"environments\",{\"0\":{\"26\":1},\"1\":{\"81\":1,\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"en\",{\"1\":{\"80\":1}}],[\"enty\",{\"1\":{\"1482\":1,\"1609\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"entry\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"entries\",{\"1\":{\"76\":1,\"137\":1,\"139\":1,\"160\":1,\"162\":1,\"184\":1,\"186\":1,\"220\":1,\"222\":1,\"250\":1,\"252\":1,\"280\":1,\"282\":1,\"326\":1,\"328\":1,\"372\":1,\"374\":1,\"437\":1,\"491\":1,\"505\":1,\"588\":1,\"602\":1,\"613\":1,\"645\":1,\"717\":1,\"719\":1,\"810\":1,\"820\":1,\"852\":1,\"917\":1,\"940\":1,\"942\":1,\"1033\":1,\"1043\":1,\"1075\":1,\"1194\":1,\"1209\":1,\"1220\":1,\"1252\":1,\"1297\":1,\"1387\":1,\"1402\":1,\"1413\":1,\"1445\":1,\"1485\":1,\"1581\":1,\"1601\":1,\"1612\":1,\"1648\":1,\"1693\":1,\"1783\":1,\"1793\":1,\"1825\":1,\"1870\":1,\"1881\":1,\"1977\":1,\"1997\":1,\"2008\":1,\"2044\":1,\"2089\":1,\"2100\":1,\"2196\":1,\"2216\":1,\"2227\":1,\"2263\":1,\"2308\":1}}],[\"entered\",{\"1\":{\"74\":1}}],[\"entire\",{\"1\":{\"10\":1,\"59\":1}}],[\"end\",{\"1\":{\"58\":1,\"81\":1,\"99\":2,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"394\":1,\"396\":1,\"545\":1,\"547\":1,\"718\":1,\"763\":1,\"765\":1,\"766\":1,\"915\":1,\"941\":1,\"986\":1,\"988\":1,\"989\":1,\"1147\":1,\"1149\":1,\"1150\":1,\"1207\":1,\"1295\":1,\"1340\":1,\"1342\":1,\"1343\":1,\"1400\":1,\"1529\":1,\"1531\":1,\"1532\":1,\"1599\":1,\"1691\":1,\"1736\":1,\"1738\":1,\"1739\":1,\"1868\":1,\"1925\":1,\"1927\":1,\"1928\":1,\"1995\":1,\"2087\":1,\"2144\":1,\"2146\":1,\"2147\":1,\"2214\":1,\"2306\":1}}],[\"endpoints\",{\"1\":{\"74\":1,\"77\":1}}],[\"endpoint\",{\"0\":{\"76\":1},\"1\":{\"0\":1,\"23\":1,\"49\":1,\"52\":2,\"61\":1,\"63\":2,\"74\":1,\"76\":1,\"77\":1,\"127\":1,\"138\":1,\"150\":1,\"161\":1,\"169\":1,\"174\":1,\"185\":1,\"193\":1,\"206\":1,\"221\":1,\"229\":1,\"236\":1,\"251\":1,\"259\":1,\"266\":1,\"281\":1,\"289\":1,\"312\":1,\"327\":1,\"335\":1,\"358\":1,\"373\":1,\"381\":1,\"703\":1,\"718\":1,\"726\":1,\"926\":1,\"941\":1,\"949\":1}}],[\"ensuring\",{\"1\":{\"20\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"ensures\",{\"1\":{\"23\":1,\"58\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"ensure\",{\"1\":{\"11\":1,\"24\":1,\"25\":1,\"49\":1,\"95\":2,\"226\":2,\"256\":2,\"286\":2,\"302\":2,\"305\":1,\"332\":2,\"352\":2,\"355\":1,\"378\":2,\"693\":2,\"696\":1,\"723\":2,\"900\":2,\"903\":1,\"946\":2}}],[\"enabled\",{\"1\":{\"396\":1,\"413\":1,\"414\":1,\"418\":1,\"419\":1,\"429\":1,\"446\":1,\"449\":1,\"450\":1,\"514\":1,\"517\":1,\"518\":1,\"547\":1,\"564\":1,\"565\":1,\"569\":1,\"570\":1,\"580\":1,\"610\":1,\"653\":1,\"656\":1,\"657\":1,\"674\":1,\"675\":1,\"732\":1,\"735\":1,\"736\":1,\"765\":1,\"766\":1,\"782\":1,\"783\":1,\"787\":1,\"788\":1,\"798\":1,\"817\":1,\"860\":1,\"863\":1,\"864\":1,\"881\":1,\"882\":1,\"955\":1,\"958\":1,\"959\":1,\"988\":1,\"989\":1,\"1005\":1,\"1006\":1,\"1010\":1,\"1011\":1,\"1021\":1,\"1040\":1,\"1083\":1,\"1086\":1,\"1087\":1,\"1104\":1,\"1105\":1,\"1116\":1,\"1119\":1,\"1120\":1,\"1149\":1,\"1150\":1,\"1166\":1,\"1167\":1,\"1171\":1,\"1172\":1,\"1182\":1,\"1217\":1,\"1260\":1,\"1263\":1,\"1264\":1,\"1281\":1,\"1282\":1,\"1309\":1,\"1312\":1,\"1313\":1,\"1342\":1,\"1343\":1,\"1359\":1,\"1360\":1,\"1364\":1,\"1365\":1,\"1375\":1,\"1410\":1,\"1453\":1,\"1456\":1,\"1457\":1,\"1474\":1,\"1475\":1,\"1482\":1,\"1496\":1,\"1499\":1,\"1500\":1,\"1531\":1,\"1532\":1,\"1549\":1,\"1550\":1,\"1554\":1,\"1555\":1,\"1565\":1,\"1586\":1,\"1587\":1,\"1609\":1,\"1656\":1,\"1659\":1,\"1660\":1,\"1677\":1,\"1678\":1,\"1705\":1,\"1708\":1,\"1709\":1,\"1738\":1,\"1739\":1,\"1755\":1,\"1756\":1,\"1760\":1,\"1761\":1,\"1771\":1,\"1790\":1,\"1833\":1,\"1836\":1,\"1837\":1,\"1854\":1,\"1855\":1,\"1878\":1,\"1892\":1,\"1895\":1,\"1896\":1,\"1927\":1,\"1928\":1,\"1945\":1,\"1946\":1,\"1950\":1,\"1951\":1,\"1961\":1,\"1982\":1,\"1983\":1,\"2005\":1,\"2052\":1,\"2055\":1,\"2056\":1,\"2073\":1,\"2074\":1,\"2097\":1,\"2111\":1,\"2114\":1,\"2115\":1,\"2146\":1,\"2147\":1,\"2164\":1,\"2165\":1,\"2169\":1,\"2170\":1,\"2180\":1,\"2201\":1,\"2202\":1,\"2224\":1,\"2271\":1,\"2274\":1,\"2275\":1,\"2292\":1,\"2293\":1}}],[\"enables\",{\"1\":{\"23\":1,\"62\":1,\"80\":1}}],[\"enable\",{\"1\":{\"0\":2,\"10\":1,\"58\":2,\"61\":1,\"62\":1,\"89\":1,\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"394\":1,\"395\":1,\"396\":1,\"402\":1,\"405\":1,\"420\":1,\"423\":1,\"424\":1,\"425\":1,\"430\":1,\"431\":1,\"445\":1,\"446\":1,\"448\":1,\"473\":1,\"513\":1,\"514\":1,\"516\":1,\"545\":1,\"546\":1,\"547\":1,\"553\":1,\"556\":1,\"571\":1,\"574\":1,\"575\":1,\"576\":1,\"581\":1,\"582\":1,\"610\":2,\"626\":1,\"652\":1,\"653\":1,\"655\":1,\"675\":1,\"676\":1,\"712\":2,\"731\":1,\"732\":1,\"734\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"772\":1,\"775\":1,\"789\":1,\"792\":1,\"793\":1,\"794\":1,\"799\":1,\"800\":1,\"817\":2,\"833\":1,\"859\":1,\"860\":1,\"862\":1,\"882\":1,\"883\":1,\"935\":2,\"954\":1,\"955\":1,\"957\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"995\":1,\"998\":1,\"1012\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1022\":1,\"1023\":1,\"1040\":2,\"1056\":1,\"1082\":1,\"1083\":1,\"1085\":1,\"1105\":1,\"1106\":1,\"1115\":1,\"1116\":1,\"1118\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1156\":1,\"1159\":1,\"1173\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1183\":1,\"1184\":1,\"1217\":2,\"1233\":1,\"1259\":1,\"1260\":1,\"1262\":1,\"1282\":1,\"1283\":1,\"1308\":1,\"1309\":1,\"1311\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1349\":1,\"1352\":1,\"1366\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1376\":1,\"1377\":1,\"1410\":2,\"1426\":1,\"1452\":1,\"1453\":1,\"1455\":1,\"1475\":1,\"1476\":1,\"1482\":2,\"1495\":1,\"1496\":1,\"1498\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1539\":1,\"1542\":1,\"1556\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1566\":1,\"1567\":1,\"1587\":1,\"1609\":2,\"1625\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1655\":1,\"1656\":1,\"1658\":1,\"1678\":1,\"1679\":1,\"1704\":1,\"1705\":1,\"1707\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1745\":1,\"1748\":1,\"1762\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1772\":1,\"1773\":1,\"1790\":2,\"1806\":1,\"1832\":1,\"1833\":1,\"1835\":1,\"1855\":1,\"1856\":1,\"1878\":2,\"1891\":1,\"1892\":1,\"1894\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1935\":1,\"1938\":1,\"1952\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1962\":1,\"1963\":1,\"1983\":1,\"2005\":2,\"2021\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2051\":1,\"2052\":1,\"2054\":1,\"2074\":1,\"2075\":1,\"2097\":2,\"2110\":1,\"2111\":1,\"2113\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2154\":1,\"2157\":1,\"2171\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2181\":1,\"2182\":1,\"2202\":1,\"2224\":2,\"2240\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2270\":1,\"2271\":1,\"2273\":1,\"2293\":1,\"2294\":1}}],[\"o3\",{\"1\":{\"678\":1,\"885\":1,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"odic\",{\"0\":{\"677\":1,\"884\":1,\"1107\":1,\"1284\":1,\"1477\":1,\"1588\":1,\"1680\":1,\"1857\":1,\"1984\":1,\"2076\":1,\"2203\":1,\"2295\":1}}],[\"oder\",{\"1\":{\"32\":2,\"34\":1,\"37\":2}}],[\"oauth\",{\"1\":{\"610\":1,\"614\":1,\"618\":2,\"674\":1,\"817\":1,\"821\":1,\"825\":2,\"881\":1,\"1040\":1,\"1044\":1,\"1048\":2,\"1104\":1,\"1217\":1,\"1221\":1,\"1225\":2,\"1281\":1,\"1410\":1,\"1414\":1,\"1418\":2,\"1474\":1,\"1482\":1,\"1486\":1,\"1490\":2,\"1586\":1,\"1609\":1,\"1613\":1,\"1617\":2,\"1677\":1,\"1790\":1,\"1794\":1,\"1798\":2,\"1854\":1,\"1878\":1,\"1882\":1,\"1886\":2,\"1982\":1,\"2005\":1,\"2009\":1,\"2013\":2,\"2073\":1,\"2097\":1,\"2101\":1,\"2105\":2,\"2201\":1,\"2224\":1,\"2228\":1,\"2232\":2,\"2292\":1}}],[\"omitted\",{\"1\":{\"505\":1,\"506\":1,\"602\":1,\"603\":1,\"917\":1,\"918\":1,\"1209\":1,\"1210\":1,\"1297\":1,\"1298\":1,\"1402\":1,\"1403\":1,\"1601\":1,\"1602\":1,\"1693\":1,\"1694\":1,\"1870\":1,\"1871\":1,\"1997\":1,\"1998\":1,\"2089\":1,\"2090\":1,\"2216\":1,\"2217\":1,\"2308\":1,\"2309\":1}}],[\"oidc\",{\"0\":{\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1},\"1\":{\"445\":5,\"446\":5,\"447\":2,\"448\":3,\"449\":3,\"450\":3,\"451\":3,\"452\":5,\"453\":4,\"454\":2,\"455\":2,\"456\":3,\"457\":2,\"513\":5,\"514\":5,\"515\":2,\"516\":3,\"517\":3,\"518\":3,\"519\":3,\"520\":5,\"521\":4,\"522\":2,\"523\":2,\"524\":3,\"525\":2,\"606\":1,\"652\":5,\"653\":5,\"654\":2,\"655\":3,\"656\":3,\"657\":3,\"658\":3,\"659\":5,\"660\":4,\"661\":2,\"662\":2,\"663\":3,\"664\":2,\"675\":6,\"676\":2,\"677\":2,\"678\":7,\"731\":5,\"732\":5,\"733\":2,\"734\":3,\"735\":3,\"736\":3,\"737\":3,\"738\":5,\"739\":4,\"740\":2,\"741\":2,\"742\":3,\"743\":2,\"859\":5,\"860\":5,\"861\":2,\"862\":3,\"863\":3,\"864\":3,\"865\":3,\"866\":5,\"867\":4,\"868\":2,\"869\":2,\"870\":3,\"871\":2,\"882\":6,\"883\":2,\"884\":2,\"885\":7,\"921\":1,\"954\":5,\"955\":5,\"956\":2,\"957\":3,\"958\":3,\"959\":3,\"960\":3,\"961\":5,\"962\":4,\"963\":2,\"964\":2,\"965\":3,\"966\":2,\"1082\":5,\"1083\":5,\"1084\":2,\"1085\":3,\"1086\":3,\"1087\":3,\"1088\":3,\"1089\":5,\"1090\":4,\"1091\":2,\"1092\":2,\"1093\":3,\"1094\":2,\"1105\":6,\"1106\":2,\"1107\":2,\"1108\":7,\"1115\":5,\"1116\":5,\"1117\":2,\"1118\":3,\"1119\":3,\"1120\":3,\"1121\":3,\"1122\":5,\"1123\":4,\"1124\":2,\"1125\":2,\"1126\":3,\"1127\":2,\"1213\":1,\"1259\":5,\"1260\":5,\"1261\":2,\"1262\":3,\"1263\":3,\"1264\":3,\"1265\":3,\"1266\":5,\"1267\":4,\"1268\":2,\"1269\":2,\"1270\":3,\"1271\":2,\"1282\":6,\"1283\":2,\"1284\":2,\"1285\":7,\"1301\":1,\"1308\":5,\"1309\":5,\"1310\":2,\"1311\":3,\"1312\":3,\"1313\":3,\"1314\":3,\"1315\":5,\"1316\":4,\"1317\":2,\"1318\":2,\"1319\":3,\"1320\":2,\"1406\":1,\"1452\":5,\"1453\":5,\"1454\":2,\"1455\":3,\"1456\":3,\"1457\":3,\"1458\":3,\"1459\":5,\"1460\":4,\"1461\":2,\"1462\":2,\"1463\":3,\"1464\":2,\"1475\":6,\"1476\":2,\"1477\":2,\"1478\":7,\"1495\":5,\"1496\":5,\"1497\":2,\"1498\":3,\"1499\":3,\"1500\":3,\"1501\":3,\"1502\":5,\"1503\":4,\"1504\":2,\"1505\":2,\"1506\":3,\"1507\":2,\"1587\":6,\"1588\":2,\"1589\":7,\"1605\":1,\"1655\":5,\"1656\":5,\"1657\":2,\"1658\":3,\"1659\":3,\"1660\":3,\"1661\":3,\"1662\":5,\"1663\":4,\"1664\":2,\"1665\":2,\"1666\":3,\"1667\":2,\"1678\":6,\"1679\":2,\"1680\":2,\"1681\":7,\"1697\":1,\"1704\":5,\"1705\":5,\"1706\":2,\"1707\":3,\"1708\":3,\"1709\":3,\"1710\":3,\"1711\":5,\"1712\":4,\"1713\":2,\"1714\":2,\"1715\":3,\"1716\":2,\"1832\":5,\"1833\":5,\"1834\":2,\"1835\":3,\"1836\":3,\"1837\":3,\"1838\":3,\"1839\":5,\"1840\":4,\"1841\":2,\"1842\":2,\"1843\":3,\"1844\":2,\"1855\":6,\"1856\":2,\"1857\":2,\"1858\":7,\"1874\":1,\"1891\":5,\"1892\":5,\"1893\":2,\"1894\":3,\"1895\":3,\"1896\":3,\"1897\":3,\"1898\":5,\"1899\":4,\"1900\":2,\"1901\":2,\"1902\":3,\"1903\":2,\"1983\":6,\"1984\":2,\"1985\":7,\"2001\":1,\"2051\":5,\"2052\":5,\"2053\":2,\"2054\":3,\"2055\":3,\"2056\":3,\"2057\":3,\"2058\":5,\"2059\":4,\"2060\":2,\"2061\":2,\"2062\":3,\"2063\":2,\"2074\":6,\"2075\":2,\"2076\":2,\"2077\":7,\"2093\":1,\"2110\":5,\"2111\":5,\"2112\":2,\"2113\":3,\"2114\":3,\"2115\":3,\"2116\":3,\"2117\":5,\"2118\":4,\"2119\":2,\"2120\":2,\"2121\":3,\"2122\":2,\"2202\":6,\"2203\":2,\"2204\":7,\"2220\":1,\"2270\":5,\"2271\":5,\"2272\":2,\"2273\":3,\"2274\":3,\"2275\":3,\"2276\":3,\"2277\":5,\"2278\":4,\"2279\":2,\"2280\":2,\"2281\":3,\"2282\":2,\"2293\":6,\"2294\":2,\"2295\":2,\"2296\":7,\"2312\":1}}],[\"old\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"192\":1,\"193\":3,\"226\":10,\"256\":10,\"286\":10,\"332\":10,\"378\":10,\"723\":10,\"808\":1,\"946\":10,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"oldstable\",{\"1\":{\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1}}],[\"older\",{\"1\":{\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"139\":1,\"162\":1,\"170\":1,\"186\":1,\"202\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"oversight\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"over\",{\"1\":{\"88\":2,\"303\":1,\"353\":1,\"413\":1,\"414\":1,\"420\":1,\"429\":1,\"430\":1,\"431\":1,\"564\":1,\"565\":1,\"571\":1,\"580\":1,\"581\":1,\"582\":1,\"694\":1,\"782\":1,\"783\":1,\"789\":1,\"798\":1,\"799\":1,\"800\":1,\"901\":1,\"1005\":1,\"1006\":1,\"1012\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1166\":1,\"1167\":1,\"1173\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1359\":1,\"1360\":1,\"1366\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1549\":1,\"1550\":1,\"1556\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1755\":1,\"1756\":1,\"1762\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1945\":1,\"1946\":1,\"1952\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"2164\":1,\"2165\":1,\"2171\":1,\"2180\":1,\"2181\":1,\"2182\":1}}],[\"overview\",{\"0\":{\"17\":1,\"21\":1,\"44\":1,\"66\":1,\"88\":1,\"94\":1,\"121\":1,\"126\":1,\"142\":1,\"146\":1,\"149\":1,\"165\":1,\"173\":1,\"189\":1,\"196\":1,\"200\":1,\"205\":1,\"225\":1,\"232\":1,\"235\":1,\"255\":1,\"262\":1,\"265\":1,\"285\":1,\"308\":1,\"311\":1,\"331\":1,\"338\":1,\"357\":1,\"377\":1,\"496\":1,\"593\":1,\"608\":1,\"610\":1,\"674\":1,\"680\":1,\"699\":1,\"702\":1,\"722\":1,\"815\":1,\"817\":1,\"881\":1,\"887\":1,\"906\":1,\"923\":1,\"925\":1,\"945\":1,\"1038\":1,\"1040\":1,\"1104\":1,\"1110\":1,\"1199\":1,\"1215\":1,\"1217\":1,\"1281\":1,\"1287\":1,\"1303\":1,\"1392\":1,\"1408\":1,\"1410\":1,\"1474\":1,\"1480\":1,\"1482\":1,\"1586\":1,\"1591\":1,\"1607\":1,\"1609\":1,\"1677\":1,\"1683\":1,\"1699\":1,\"1788\":1,\"1790\":1,\"1854\":1,\"1860\":1,\"1876\":1,\"1878\":1,\"1982\":1,\"1987\":1,\"2003\":1,\"2005\":1,\"2073\":1,\"2079\":1,\"2095\":1,\"2097\":1,\"2201\":1,\"2206\":1,\"2222\":1,\"2224\":1,\"2292\":1,\"2298\":1,\"2314\":1},\"1\":{\"28\":1,\"81\":1,\"134\":1,\"157\":1,\"181\":1,\"208\":1,\"217\":1,\"238\":1,\"247\":1,\"268\":1,\"277\":1,\"314\":1,\"323\":1,\"360\":1,\"369\":1,\"705\":1,\"714\":1,\"929\":1,\"937\":1}}],[\"occur\",{\"1\":{\"70\":1,\"71\":1,\"84\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"470\":1,\"471\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"623\":1,\"624\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"830\":1,\"831\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1053\":1,\"1054\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1230\":1,\"1231\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1423\":1,\"1424\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1622\":1,\"1623\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1803\":1,\"1804\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"2018\":1,\"2019\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2237\":1,\"2238\":1}}],[\"obtain\",{\"1\":{\"62\":1}}],[\"objective\",{\"1\":{\"49\":1}}],[\"option\",{\"1\":{\"383\":1,\"418\":1,\"419\":1,\"474\":1,\"534\":1,\"569\":1,\"570\":1,\"627\":1,\"752\":1,\"787\":1,\"788\":1,\"834\":1,\"975\":1,\"1010\":1,\"1011\":1,\"1057\":1,\"1136\":1,\"1171\":1,\"1172\":1,\"1234\":1,\"1329\":1,\"1364\":1,\"1365\":1,\"1427\":1,\"1516\":1,\"1554\":1,\"1555\":1,\"1626\":1,\"1725\":1,\"1760\":1,\"1761\":1,\"1807\":1,\"1912\":1,\"1950\":1,\"1951\":1,\"2022\":1,\"2131\":1,\"2169\":1,\"2170\":1,\"2241\":1}}],[\"options\",{\"1\":{\"382\":1,\"466\":1}}],[\"optionally\",{\"1\":{\"675\":1,\"882\":1,\"1105\":1,\"1282\":1,\"1475\":1,\"1587\":1,\"1678\":1,\"1855\":1,\"1983\":1,\"2074\":1,\"2202\":1,\"2293\":1}}],[\"optional\",{\"1\":{\"184\":1,\"192\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"606\":1,\"674\":1,\"717\":1,\"881\":1,\"921\":1,\"940\":1,\"1104\":1,\"1213\":1,\"1281\":1,\"1301\":1,\"1406\":1,\"1474\":1,\"1586\":1,\"1605\":1,\"1677\":1,\"1697\":1,\"1854\":1,\"1874\":1,\"1982\":1,\"2001\":1,\"2073\":1,\"2093\":1,\"2201\":1,\"2220\":1,\"2292\":1,\"2312\":1}}],[\"opt\",{\"1\":{\"137\":12,\"138\":9,\"139\":6,\"143\":4,\"160\":12,\"161\":9,\"162\":6,\"166\":4,\"168\":4,\"169\":4,\"184\":12,\"185\":9,\"186\":6,\"190\":4,\"192\":4,\"193\":4,\"220\":12,\"221\":9,\"222\":6,\"226\":6,\"228\":4,\"229\":4,\"250\":12,\"251\":9,\"252\":6,\"256\":6,\"258\":4,\"259\":4,\"280\":12,\"281\":9,\"282\":6,\"286\":6,\"288\":4,\"289\":4,\"326\":12,\"327\":9,\"328\":6,\"332\":6,\"334\":4,\"335\":4,\"372\":12,\"373\":9,\"374\":6,\"378\":6,\"380\":4,\"381\":4,\"419\":1,\"570\":1,\"717\":12,\"718\":9,\"719\":6,\"723\":6,\"725\":4,\"726\":4,\"788\":1,\"931\":2,\"940\":12,\"941\":9,\"942\":6,\"946\":6,\"948\":4,\"949\":4,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1}}],[\"opportunity\",{\"1\":{\"62\":1,\"80\":1,\"81\":1,\"99\":1}}],[\"openssl\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"openid\",{\"0\":{\"673\":1,\"880\":1,\"1103\":1,\"1280\":1,\"1473\":1,\"1585\":1,\"1676\":1,\"1853\":1,\"1981\":1,\"2072\":1,\"2200\":1,\"2291\":1},\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"165\":1,\"171\":1,\"189\":1,\"203\":1,\"225\":1,\"255\":1,\"285\":1,\"331\":2,\"377\":1,\"610\":4,\"613\":2,\"674\":2,\"675\":1,\"677\":1,\"680\":1,\"722\":2,\"817\":4,\"820\":2,\"881\":2,\"882\":1,\"884\":1,\"887\":1,\"945\":2,\"1040\":4,\"1043\":2,\"1104\":2,\"1105\":1,\"1107\":1,\"1110\":1,\"1217\":4,\"1220\":2,\"1281\":2,\"1282\":1,\"1284\":1,\"1287\":1,\"1410\":4,\"1413\":2,\"1474\":2,\"1475\":1,\"1477\":1,\"1480\":1,\"1482\":5,\"1485\":2,\"1586\":2,\"1587\":1,\"1588\":1,\"1591\":1,\"1609\":4,\"1612\":2,\"1677\":2,\"1678\":1,\"1680\":1,\"1683\":1,\"1790\":4,\"1793\":2,\"1854\":2,\"1855\":1,\"1857\":1,\"1860\":1,\"1878\":5,\"1881\":2,\"1982\":2,\"1983\":1,\"1984\":1,\"1987\":1,\"2005\":4,\"2008\":2,\"2073\":2,\"2074\":1,\"2076\":1,\"2079\":1,\"2097\":5,\"2100\":2,\"2201\":2,\"2202\":1,\"2203\":1,\"2206\":1,\"2224\":4,\"2227\":2,\"2292\":2,\"2293\":1,\"2295\":1,\"2298\":1}}],[\"openehr\",{\"1\":{\"63\":1}}],[\"open\",{\"1\":{\"24\":1,\"73\":1,\"80\":1,\"81\":1,\"89\":1,\"207\":2,\"293\":2,\"305\":1,\"343\":2,\"355\":1,\"684\":2,\"696\":1,\"719\":2,\"891\":2,\"903\":1,\"942\":2}}],[\"operating\",{\"1\":{\"95\":2}}],[\"operations\",{\"1\":{\"193\":1}}],[\"operational\",{\"1\":{\"26\":1}}],[\"operation\",{\"1\":{\"10\":1}}],[\"operate\",{\"1\":{\"10\":1,\"95\":1}}],[\"owner\",{\"1\":{\"137\":3,\"138\":1,\"160\":3,\"161\":1,\"184\":3,\"185\":1,\"220\":3,\"221\":1,\"250\":3,\"251\":1,\"280\":3,\"281\":1,\"326\":3,\"327\":1,\"372\":3,\"373\":1,\"717\":3,\"718\":1,\"940\":3,\"941\":1}}],[\"own\",{\"1\":{\"49\":1,\"54\":1,\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"617\":1,\"709\":1,\"824\":1,\"932\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"o\",{\"1\":{\"39\":2,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"outdated\",{\"1\":{\"125\":2,\"148\":2,\"172\":2}}],[\"outgoing\",{\"1\":{\"70\":1}}],[\"outside\",{\"1\":{\"52\":1}}],[\"outstanding\",{\"1\":{\"1\":1}}],[\"out\",{\"1\":{\"27\":1,\"59\":1,\"226\":1,\"256\":1,\"286\":1,\"303\":1,\"304\":1,\"332\":1,\"353\":1,\"354\":1,\"378\":1,\"694\":1,\"695\":1,\"723\":1,\"901\":1,\"902\":1,\"946\":1}}],[\"ourselves\",{\"1\":{\"61\":1}}],[\"our\",{\"0\":{\"97\":1,\"100\":1},\"1\":{\"6\":1,\"97\":3,\"98\":1,\"99\":1,\"100\":3,\"204\":1,\"234\":1,\"264\":1,\"291\":1,\"293\":1,\"301\":2,\"303\":6,\"304\":2,\"305\":12,\"310\":1,\"341\":1,\"343\":1,\"351\":2,\"353\":6,\"354\":2,\"355\":12,\"356\":1,\"682\":1,\"684\":1,\"692\":2,\"694\":6,\"695\":2,\"696\":12,\"701\":1,\"889\":1,\"891\":1,\"899\":2,\"901\":6,\"902\":2,\"903\":12,\"924\":1}}],[\"offer\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"offers\",{\"1\":{\"20\":1,\"59\":1}}],[\"of\",{\"0\":{\"2\":1,\"11\":1,\"13\":1,\"14\":2,\"15\":1,\"21\":1,\"51\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1},\"1\":{\"0\":1,\"1\":1,\"4\":1,\"10\":12,\"11\":7,\"12\":1,\"13\":4,\"14\":4,\"15\":3,\"21\":2,\"24\":1,\"25\":2,\"39\":1,\"49\":5,\"52\":3,\"53\":1,\"55\":1,\"57\":1,\"58\":6,\"59\":6,\"60\":3,\"61\":2,\"62\":5,\"63\":6,\"66\":1,\"67\":1,\"68\":3,\"70\":1,\"71\":1,\"73\":3,\"74\":3,\"76\":1,\"77\":1,\"80\":2,\"81\":6,\"83\":1,\"84\":2,\"88\":3,\"90\":2,\"91\":3,\"92\":1,\"95\":5,\"97\":2,\"98\":1,\"99\":2,\"100\":2,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"119\":2,\"122\":1,\"123\":1,\"125\":2,\"126\":1,\"127\":2,\"129\":5,\"132\":1,\"134\":1,\"137\":9,\"138\":6,\"140\":1,\"144\":2,\"147\":1,\"148\":2,\"149\":1,\"150\":2,\"152\":5,\"155\":1,\"157\":1,\"160\":8,\"161\":6,\"163\":1,\"168\":1,\"169\":1,\"170\":1,\"172\":2,\"173\":1,\"174\":2,\"176\":5,\"179\":1,\"181\":1,\"184\":8,\"185\":6,\"187\":1,\"192\":2,\"193\":3,\"194\":2,\"197\":1,\"198\":2,\"201\":1,\"202\":1,\"204\":1,\"205\":1,\"206\":2,\"208\":1,\"212\":2,\"215\":1,\"217\":1,\"220\":8,\"221\":6,\"223\":1,\"226\":5,\"228\":1,\"229\":1,\"230\":2,\"233\":1,\"234\":1,\"235\":1,\"236\":2,\"238\":1,\"242\":2,\"245\":1,\"247\":1,\"250\":8,\"251\":5,\"253\":1,\"256\":5,\"258\":1,\"259\":1,\"260\":2,\"263\":1,\"264\":1,\"265\":1,\"266\":2,\"268\":1,\"272\":2,\"275\":1,\"277\":1,\"280\":8,\"281\":5,\"283\":1,\"286\":5,\"288\":1,\"289\":1,\"290\":1,\"291\":2,\"301\":4,\"302\":1,\"303\":2,\"304\":1,\"305\":5,\"306\":2,\"309\":1,\"310\":1,\"311\":1,\"312\":2,\"314\":1,\"318\":2,\"321\":1,\"323\":1,\"326\":8,\"327\":5,\"329\":1,\"332\":5,\"334\":1,\"335\":1,\"336\":2,\"339\":1,\"340\":1,\"341\":2,\"351\":4,\"352\":1,\"353\":2,\"354\":1,\"355\":5,\"356\":1,\"357\":1,\"358\":2,\"360\":1,\"364\":2,\"367\":1,\"369\":1,\"372\":8,\"373\":5,\"375\":1,\"378\":5,\"380\":1,\"381\":1,\"387\":1,\"388\":1,\"391\":1,\"396\":1,\"402\":1,\"405\":1,\"408\":1,\"409\":1,\"410\":2,\"418\":1,\"419\":3,\"424\":1,\"429\":1,\"432\":2,\"433\":2,\"435\":1,\"436\":2,\"444\":1,\"473\":1,\"478\":1,\"479\":1,\"481\":1,\"485\":1,\"486\":1,\"487\":1,\"498\":1,\"499\":1,\"512\":1,\"538\":1,\"539\":1,\"542\":1,\"547\":1,\"553\":1,\"556\":1,\"559\":1,\"560\":1,\"561\":2,\"569\":1,\"570\":3,\"575\":1,\"580\":1,\"583\":2,\"584\":2,\"586\":1,\"587\":2,\"595\":1,\"596\":1,\"610\":3,\"611\":1,\"612\":1,\"613\":1,\"615\":1,\"617\":1,\"618\":2,\"626\":1,\"631\":1,\"632\":1,\"634\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"651\":1,\"677\":1,\"681\":1,\"682\":2,\"692\":4,\"693\":1,\"694\":2,\"695\":1,\"696\":5,\"697\":2,\"700\":1,\"701\":1,\"702\":1,\"703\":2,\"705\":1,\"709\":2,\"712\":1,\"714\":1,\"717\":8,\"718\":5,\"720\":1,\"723\":5,\"725\":1,\"726\":1,\"730\":1,\"756\":1,\"757\":1,\"760\":1,\"765\":2,\"766\":2,\"772\":1,\"775\":1,\"778\":1,\"779\":2,\"787\":1,\"788\":3,\"793\":1,\"798\":1,\"804\":2,\"805\":2,\"807\":1,\"808\":2,\"809\":2,\"817\":3,\"818\":1,\"819\":1,\"820\":1,\"822\":1,\"824\":1,\"825\":2,\"833\":1,\"838\":1,\"839\":1,\"841\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"858\":1,\"884\":1,\"888\":1,\"889\":2,\"899\":4,\"900\":1,\"901\":2,\"902\":1,\"903\":5,\"904\":2,\"907\":1,\"909\":1,\"910\":1,\"924\":1,\"925\":1,\"926\":2,\"929\":1,\"930\":1,\"932\":2,\"935\":1,\"937\":1,\"940\":8,\"941\":5,\"943\":1,\"946\":5,\"948\":1,\"949\":1,\"953\":1,\"979\":1,\"980\":1,\"983\":1,\"988\":2,\"989\":2,\"995\":1,\"998\":1,\"1001\":1,\"1002\":2,\"1010\":1,\"1011\":3,\"1016\":1,\"1021\":1,\"1027\":2,\"1028\":2,\"1030\":1,\"1031\":2,\"1032\":2,\"1040\":3,\"1041\":1,\"1042\":1,\"1043\":1,\"1045\":1,\"1047\":1,\"1048\":2,\"1056\":1,\"1061\":1,\"1062\":1,\"1064\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1081\":1,\"1107\":1,\"1114\":1,\"1140\":1,\"1141\":1,\"1144\":1,\"1149\":2,\"1150\":2,\"1156\":1,\"1159\":1,\"1162\":1,\"1163\":2,\"1171\":1,\"1172\":3,\"1177\":1,\"1182\":1,\"1188\":2,\"1189\":2,\"1191\":1,\"1192\":2,\"1193\":2,\"1201\":1,\"1202\":1,\"1217\":3,\"1218\":1,\"1219\":1,\"1220\":1,\"1222\":1,\"1224\":1,\"1225\":2,\"1233\":1,\"1238\":1,\"1239\":1,\"1241\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1258\":1,\"1284\":1,\"1289\":1,\"1290\":1,\"1307\":1,\"1333\":1,\"1334\":1,\"1337\":1,\"1342\":2,\"1343\":2,\"1349\":1,\"1352\":1,\"1355\":1,\"1356\":2,\"1364\":1,\"1365\":3,\"1370\":1,\"1375\":1,\"1381\":2,\"1382\":2,\"1384\":1,\"1385\":2,\"1386\":2,\"1394\":1,\"1395\":1,\"1410\":3,\"1411\":1,\"1412\":1,\"1413\":1,\"1415\":1,\"1417\":1,\"1418\":2,\"1426\":1,\"1431\":1,\"1432\":1,\"1434\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1451\":1,\"1477\":1,\"1482\":2,\"1483\":1,\"1484\":1,\"1485\":1,\"1487\":1,\"1490\":2,\"1494\":1,\"1520\":1,\"1521\":1,\"1524\":1,\"1527\":1,\"1528\":1,\"1531\":2,\"1532\":2,\"1533\":1,\"1539\":1,\"1542\":1,\"1545\":1,\"1546\":2,\"1554\":1,\"1555\":3,\"1560\":1,\"1565\":1,\"1571\":2,\"1572\":2,\"1574\":1,\"1575\":2,\"1576\":2,\"1577\":1,\"1588\":1,\"1593\":1,\"1594\":1,\"1609\":3,\"1610\":1,\"1611\":1,\"1612\":1,\"1614\":1,\"1616\":1,\"1617\":2,\"1625\":1,\"1630\":1,\"1631\":1,\"1633\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1654\":1,\"1680\":1,\"1685\":1,\"1686\":1,\"1703\":1,\"1729\":1,\"1730\":1,\"1733\":1,\"1738\":2,\"1739\":2,\"1745\":1,\"1748\":1,\"1751\":1,\"1752\":2,\"1760\":1,\"1761\":3,\"1766\":1,\"1771\":1,\"1777\":2,\"1778\":2,\"1780\":1,\"1781\":2,\"1782\":2,\"1790\":3,\"1791\":1,\"1792\":1,\"1793\":1,\"1795\":1,\"1797\":1,\"1798\":2,\"1806\":1,\"1811\":1,\"1812\":1,\"1814\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1831\":1,\"1857\":1,\"1862\":1,\"1863\":1,\"1878\":2,\"1879\":1,\"1880\":1,\"1881\":1,\"1883\":1,\"1886\":2,\"1890\":1,\"1916\":1,\"1917\":1,\"1920\":1,\"1923\":1,\"1924\":1,\"1927\":2,\"1928\":2,\"1929\":1,\"1935\":1,\"1938\":1,\"1941\":1,\"1942\":2,\"1950\":1,\"1951\":3,\"1956\":1,\"1961\":1,\"1967\":2,\"1968\":2,\"1970\":1,\"1971\":2,\"1972\":2,\"1973\":1,\"1984\":1,\"1989\":1,\"1990\":1,\"2005\":3,\"2006\":1,\"2007\":1,\"2008\":1,\"2010\":1,\"2012\":1,\"2013\":2,\"2021\":1,\"2026\":1,\"2027\":1,\"2029\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2050\":1,\"2076\":1,\"2081\":1,\"2082\":1,\"2097\":2,\"2098\":1,\"2099\":1,\"2100\":1,\"2102\":1,\"2105\":2,\"2109\":1,\"2135\":1,\"2136\":1,\"2139\":1,\"2142\":1,\"2143\":1,\"2146\":2,\"2147\":2,\"2148\":1,\"2154\":1,\"2157\":1,\"2160\":1,\"2161\":2,\"2169\":1,\"2170\":3,\"2175\":1,\"2180\":1,\"2186\":2,\"2187\":2,\"2189\":1,\"2190\":2,\"2191\":2,\"2192\":1,\"2203\":1,\"2208\":1,\"2209\":1,\"2224\":3,\"2225\":1,\"2226\":1,\"2227\":1,\"2229\":1,\"2231\":1,\"2232\":2,\"2240\":1,\"2245\":1,\"2246\":1,\"2248\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2269\":1,\"2295\":1,\"2300\":1,\"2301\":1}}],[\"orchestrates\",{\"1\":{\"62\":1}}],[\"org\",{\"1\":{\"52\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"618\":2,\"678\":1,\"723\":1,\"825\":2,\"885\":1,\"946\":1,\"1048\":2,\"1108\":1,\"1225\":2,\"1285\":1,\"1418\":2,\"1478\":1,\"1490\":2,\"1589\":1,\"1617\":2,\"1681\":1,\"1798\":2,\"1858\":1,\"1886\":2,\"1985\":1,\"2013\":2,\"2077\":1,\"2105\":2,\"2204\":1,\"2232\":2,\"2296\":1}}],[\"organisational\",{\"1\":{\"62\":1}}],[\"organisationaffiliation\",{\"1\":{\"49\":1}}],[\"organisations\",{\"1\":{\"52\":2,\"55\":1,\"73\":3,\"76\":1}}],[\"organisation\",{\"1\":{\"52\":3,\"53\":2,\"54\":1,\"73\":1}}],[\"organization\",{\"0\":{\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"641\":1,\"847\":1,\"848\":1,\"1070\":1,\"1071\":1,\"1247\":1,\"1248\":1,\"1440\":1,\"1441\":1,\"1642\":1,\"1643\":1,\"1820\":1,\"1821\":1,\"2038\":1,\"2039\":1,\"2257\":1,\"2258\":1},\"1\":{\"49\":5,\"61\":3,\"63\":1,\"67\":1,\"71\":1,\"89\":1,\"127\":4,\"137\":4,\"138\":3,\"150\":4,\"160\":5,\"161\":4,\"174\":4,\"184\":5,\"185\":4,\"206\":4,\"220\":5,\"221\":4,\"236\":3,\"250\":5,\"251\":1,\"266\":3,\"280\":5,\"281\":1,\"312\":3,\"326\":5,\"327\":1,\"358\":3,\"372\":5,\"373\":1,\"409\":2,\"432\":1,\"487\":2,\"560\":2,\"583\":1,\"610\":2,\"640\":2,\"641\":2,\"703\":3,\"717\":5,\"718\":1,\"804\":1,\"817\":2,\"847\":2,\"848\":2,\"926\":3,\"940\":5,\"941\":1,\"1027\":1,\"1040\":2,\"1070\":2,\"1071\":2,\"1188\":1,\"1217\":2,\"1247\":2,\"1248\":2,\"1381\":1,\"1410\":2,\"1440\":2,\"1441\":2,\"1571\":1,\"1609\":2,\"1642\":2,\"1643\":2,\"1777\":1,\"1790\":2,\"1820\":2,\"1821\":2,\"1967\":1,\"2005\":2,\"2038\":2,\"2039\":2,\"2186\":1,\"2224\":2,\"2257\":2,\"2258\":2}}],[\"organizational\",{\"1\":{\"0\":1,\"11\":1,\"58\":2,\"62\":1,\"80\":1,\"81\":1}}],[\"organizations\",{\"1\":{\"0\":1,\"20\":1,\"21\":1,\"25\":1,\"49\":3,\"58\":1,\"61\":1,\"63\":4,\"64\":1,\"68\":1,\"70\":4,\"71\":2,\"74\":4,\"76\":1,\"80\":1,\"81\":2,\"92\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"236\":1,\"250\":1,\"266\":1,\"280\":1,\"312\":1,\"326\":1,\"358\":1,\"372\":1,\"703\":1,\"717\":1,\"926\":1,\"940\":1,\"1482\":1,\"1878\":1,\"2097\":1}}],[\"ort\",{\"1\":{\"29\":1,\"103\":1}}],[\"or\",{\"0\":{\"385\":1,\"389\":1,\"392\":1,\"399\":1,\"415\":1,\"420\":1,\"426\":1,\"438\":1,\"453\":1,\"462\":1,\"469\":1,\"476\":1,\"480\":1,\"482\":1,\"492\":1,\"521\":1,\"530\":1,\"536\":1,\"540\":1,\"543\":1,\"550\":1,\"566\":1,\"571\":1,\"577\":1,\"589\":1,\"622\":1,\"629\":1,\"633\":1,\"635\":1,\"646\":1,\"660\":1,\"669\":1,\"739\":1,\"748\":1,\"754\":1,\"758\":1,\"761\":1,\"769\":1,\"784\":1,\"789\":1,\"795\":1,\"811\":1,\"829\":1,\"836\":1,\"840\":1,\"842\":1,\"853\":1,\"867\":1,\"876\":1,\"962\":1,\"971\":1,\"977\":1,\"981\":1,\"984\":1,\"992\":1,\"1007\":1,\"1012\":1,\"1018\":1,\"1034\":1,\"1052\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1076\":1,\"1090\":1,\"1099\":1,\"1123\":1,\"1132\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1153\":1,\"1168\":1,\"1173\":1,\"1179\":1,\"1195\":1,\"1229\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1253\":1,\"1267\":1,\"1276\":1,\"1316\":1,\"1325\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1346\":1,\"1361\":1,\"1366\":1,\"1372\":1,\"1388\":1,\"1422\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1446\":1,\"1460\":1,\"1469\":1,\"1503\":1,\"1512\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1536\":1,\"1551\":1,\"1556\":1,\"1562\":1,\"1582\":1,\"1621\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1649\":1,\"1663\":1,\"1672\":1,\"1712\":1,\"1721\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1742\":1,\"1757\":1,\"1762\":1,\"1768\":1,\"1784\":1,\"1802\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1826\":1,\"1840\":1,\"1849\":1,\"1899\":1,\"1908\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1932\":1,\"1947\":1,\"1952\":1,\"1958\":1,\"1978\":1,\"2017\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2045\":1,\"2059\":1,\"2068\":1,\"2118\":1,\"2127\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2151\":1,\"2166\":1,\"2171\":1,\"2177\":1,\"2197\":1,\"2236\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2264\":1,\"2278\":1,\"2287\":1},\"1\":{\"0\":1,\"8\":1,\"10\":1,\"27\":2,\"50\":1,\"55\":1,\"58\":7,\"59\":3,\"61\":3,\"62\":1,\"63\":2,\"64\":1,\"66\":1,\"77\":1,\"81\":1,\"84\":1,\"88\":1,\"95\":1,\"98\":1,\"99\":2,\"100\":1,\"101\":1,\"102\":1,\"126\":2,\"128\":2,\"129\":1,\"133\":1,\"134\":1,\"136\":1,\"137\":2,\"138\":1,\"140\":1,\"149\":2,\"151\":2,\"152\":1,\"156\":1,\"157\":1,\"159\":1,\"160\":1,\"161\":1,\"163\":1,\"173\":2,\"175\":2,\"176\":1,\"180\":1,\"181\":1,\"183\":1,\"184\":1,\"185\":1,\"187\":1,\"192\":1,\"205\":2,\"206\":1,\"207\":2,\"212\":1,\"216\":1,\"217\":1,\"219\":1,\"220\":1,\"221\":1,\"223\":1,\"227\":1,\"235\":2,\"236\":1,\"237\":2,\"242\":1,\"246\":1,\"247\":1,\"249\":1,\"250\":1,\"251\":1,\"253\":1,\"257\":1,\"265\":2,\"266\":1,\"267\":2,\"272\":1,\"276\":1,\"277\":1,\"279\":1,\"280\":1,\"281\":1,\"283\":1,\"287\":1,\"300\":3,\"301\":2,\"302\":1,\"303\":3,\"304\":2,\"305\":2,\"311\":2,\"312\":1,\"313\":2,\"318\":1,\"322\":1,\"323\":1,\"325\":1,\"326\":1,\"327\":1,\"329\":1,\"333\":1,\"350\":3,\"351\":2,\"352\":1,\"353\":3,\"354\":2,\"355\":2,\"357\":2,\"358\":1,\"359\":2,\"364\":1,\"368\":1,\"369\":1,\"371\":1,\"372\":1,\"373\":1,\"375\":1,\"379\":1,\"387\":1,\"396\":1,\"398\":1,\"406\":1,\"414\":1,\"422\":1,\"427\":1,\"428\":1,\"429\":1,\"432\":1,\"435\":1,\"436\":1,\"437\":2,\"452\":1,\"456\":1,\"458\":1,\"468\":1,\"472\":1,\"478\":1,\"486\":1,\"491\":2,\"498\":1,\"506\":1,\"520\":1,\"524\":1,\"526\":1,\"538\":1,\"547\":1,\"549\":1,\"557\":1,\"565\":1,\"573\":1,\"578\":1,\"579\":1,\"580\":1,\"583\":1,\"586\":1,\"587\":1,\"588\":2,\"595\":1,\"603\":1,\"610\":1,\"611\":2,\"612\":1,\"621\":1,\"625\":1,\"631\":1,\"639\":1,\"643\":1,\"645\":2,\"659\":1,\"663\":1,\"665\":1,\"691\":3,\"692\":2,\"693\":1,\"694\":3,\"695\":2,\"696\":2,\"702\":2,\"703\":1,\"704\":2,\"709\":1,\"713\":1,\"714\":1,\"716\":1,\"717\":1,\"718\":1,\"720\":1,\"724\":1,\"738\":1,\"742\":1,\"744\":1,\"756\":1,\"765\":1,\"766\":1,\"768\":1,\"776\":1,\"783\":1,\"791\":1,\"796\":1,\"797\":1,\"798\":1,\"804\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":2,\"817\":1,\"818\":2,\"819\":1,\"828\":1,\"832\":1,\"838\":1,\"846\":1,\"852\":2,\"866\":1,\"870\":1,\"872\":1,\"898\":3,\"899\":2,\"900\":1,\"901\":3,\"902\":2,\"903\":2,\"909\":1,\"918\":1,\"925\":2,\"926\":1,\"927\":2,\"930\":1,\"931\":1,\"932\":1,\"936\":1,\"937\":1,\"939\":1,\"940\":1,\"941\":1,\"943\":1,\"947\":1,\"961\":1,\"965\":1,\"967\":1,\"979\":1,\"988\":1,\"989\":1,\"991\":1,\"999\":1,\"1006\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1027\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":2,\"1040\":1,\"1041\":2,\"1042\":1,\"1051\":1,\"1055\":1,\"1061\":1,\"1069\":1,\"1075\":2,\"1089\":1,\"1093\":1,\"1095\":1,\"1122\":1,\"1126\":1,\"1128\":1,\"1140\":1,\"1149\":1,\"1150\":1,\"1152\":1,\"1160\":1,\"1167\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1188\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":2,\"1201\":1,\"1210\":1,\"1217\":1,\"1218\":2,\"1219\":1,\"1228\":1,\"1232\":1,\"1238\":1,\"1246\":1,\"1252\":2,\"1266\":1,\"1270\":1,\"1272\":1,\"1289\":1,\"1298\":1,\"1315\":1,\"1319\":1,\"1321\":1,\"1333\":1,\"1342\":1,\"1343\":1,\"1345\":1,\"1353\":1,\"1360\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1381\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":2,\"1394\":1,\"1403\":1,\"1410\":1,\"1411\":2,\"1412\":1,\"1421\":1,\"1425\":1,\"1431\":1,\"1439\":1,\"1445\":2,\"1459\":1,\"1463\":1,\"1465\":1,\"1482\":3,\"1483\":2,\"1484\":1,\"1502\":1,\"1506\":1,\"1508\":1,\"1520\":1,\"1531\":1,\"1532\":1,\"1535\":1,\"1543\":1,\"1550\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1571\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1581\":2,\"1593\":1,\"1602\":1,\"1609\":1,\"1610\":2,\"1611\":1,\"1620\":1,\"1624\":1,\"1630\":1,\"1641\":1,\"1648\":2,\"1662\":1,\"1666\":1,\"1668\":1,\"1685\":1,\"1694\":1,\"1711\":1,\"1715\":1,\"1717\":1,\"1729\":1,\"1738\":1,\"1739\":1,\"1741\":1,\"1749\":1,\"1756\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1777\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":2,\"1790\":1,\"1791\":2,\"1792\":1,\"1801\":1,\"1805\":1,\"1811\":1,\"1819\":1,\"1825\":2,\"1839\":1,\"1843\":1,\"1845\":1,\"1862\":1,\"1871\":1,\"1878\":3,\"1879\":2,\"1880\":1,\"1898\":1,\"1902\":1,\"1904\":1,\"1916\":1,\"1927\":1,\"1928\":1,\"1931\":1,\"1939\":1,\"1946\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1967\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1977\":2,\"1989\":1,\"1998\":1,\"2005\":1,\"2006\":2,\"2007\":1,\"2016\":1,\"2020\":1,\"2026\":1,\"2037\":1,\"2044\":2,\"2058\":1,\"2062\":1,\"2064\":1,\"2081\":1,\"2090\":1,\"2097\":3,\"2098\":2,\"2099\":1,\"2117\":1,\"2121\":1,\"2123\":1,\"2135\":1,\"2146\":1,\"2147\":1,\"2150\":1,\"2158\":1,\"2165\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2186\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2196\":2,\"2208\":1,\"2217\":1,\"2224\":1,\"2225\":2,\"2226\":1,\"2235\":1,\"2239\":1,\"2245\":1,\"2256\":1,\"2263\":2,\"2277\":1,\"2281\":1,\"2283\":1,\"2300\":1,\"2309\":1}}],[\"order\",{\"1\":{\"0\":1,\"63\":1,\"90\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"others\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"other\",{\"1\":{\"0\":1,\"13\":1,\"24\":1,\"49\":1,\"52\":2,\"55\":1,\"59\":1,\"61\":1,\"62\":1,\"63\":4,\"74\":1,\"76\":2,\"80\":1,\"81\":1,\"99\":1,\"134\":4,\"137\":2,\"157\":4,\"160\":2,\"181\":4,\"184\":2,\"217\":4,\"220\":2,\"247\":4,\"250\":2,\"277\":4,\"280\":2,\"294\":1,\"303\":1,\"305\":2,\"323\":4,\"326\":2,\"344\":1,\"353\":1,\"355\":2,\"369\":4,\"372\":2,\"685\":1,\"694\":1,\"696\":2,\"714\":4,\"717\":2,\"892\":1,\"901\":1,\"903\":2,\"937\":4,\"940\":2,\"1482\":1,\"1878\":1,\"2097\":1}}],[\"onactivitystart\",{\"0\":{\"395\":1,\"546\":1,\"764\":1,\"987\":1,\"1148\":1,\"1341\":1,\"1530\":1,\"1737\":1,\"1926\":1,\"2145\":1},\"1\":{\"395\":1,\"546\":1,\"764\":1,\"987\":1,\"1148\":1,\"1341\":1,\"1530\":1,\"1737\":1,\"1926\":1,\"2145\":1}}],[\"onactivityend\",{\"0\":{\"394\":1,\"545\":1,\"763\":1,\"986\":1,\"1147\":1,\"1340\":1,\"1529\":1,\"1736\":1,\"1925\":1,\"2144\":1},\"1\":{\"394\":1,\"545\":1,\"763\":1,\"986\":1,\"1147\":1,\"1340\":1,\"1529\":1,\"1736\":1,\"1925\":1,\"2144\":1}}],[\"onopen\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"719\":2,\"942\":2}}],[\"onboarding\",{\"1\":{\"81\":1}}],[\"ones\",{\"1\":{\"61\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"one\",{\"1\":{\"61\":2,\"89\":1,\"129\":1,\"137\":1,\"152\":1,\"160\":1,\"176\":1,\"184\":1,\"193\":2,\"212\":1,\"220\":1,\"226\":1,\"242\":1,\"250\":1,\"256\":1,\"272\":1,\"280\":1,\"286\":1,\"318\":1,\"326\":1,\"332\":1,\"364\":1,\"372\":1,\"378\":1,\"406\":1,\"427\":1,\"429\":1,\"437\":1,\"456\":1,\"458\":1,\"472\":1,\"491\":1,\"524\":1,\"526\":1,\"557\":1,\"578\":1,\"580\":1,\"588\":1,\"612\":2,\"625\":1,\"645\":1,\"663\":1,\"665\":1,\"709\":1,\"717\":1,\"723\":1,\"742\":1,\"744\":1,\"776\":1,\"796\":1,\"798\":1,\"810\":1,\"819\":2,\"832\":1,\"852\":1,\"870\":1,\"872\":1,\"932\":1,\"940\":1,\"946\":1,\"965\":1,\"967\":1,\"999\":1,\"1019\":1,\"1021\":1,\"1033\":1,\"1042\":2,\"1055\":1,\"1075\":1,\"1093\":1,\"1095\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1180\":1,\"1182\":1,\"1194\":1,\"1219\":2,\"1232\":1,\"1252\":1,\"1270\":1,\"1272\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1373\":1,\"1375\":1,\"1387\":1,\"1412\":2,\"1425\":1,\"1445\":1,\"1463\":1,\"1465\":1,\"1484\":2,\"1506\":1,\"1508\":1,\"1543\":1,\"1563\":1,\"1565\":1,\"1581\":1,\"1611\":2,\"1624\":1,\"1648\":1,\"1666\":1,\"1668\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1769\":1,\"1771\":1,\"1783\":1,\"1792\":2,\"1805\":1,\"1825\":1,\"1843\":1,\"1845\":1,\"1880\":2,\"1902\":1,\"1904\":1,\"1939\":1,\"1959\":1,\"1961\":1,\"1977\":1,\"2007\":2,\"2020\":1,\"2044\":1,\"2062\":1,\"2064\":1,\"2099\":2,\"2121\":1,\"2123\":1,\"2158\":1,\"2178\":1,\"2180\":1,\"2196\":1,\"2226\":2,\"2239\":1,\"2263\":1,\"2281\":1,\"2283\":1}}],[\"once\",{\"1\":{\"52\":1,\"69\":1,\"100\":1}}],[\"ontologie\",{\"1\":{\"29\":1}}],[\"only\",{\"1\":{\"20\":1,\"49\":1,\"54\":1,\"57\":1,\"66\":1,\"67\":1,\"73\":2,\"89\":1,\"126\":1,\"128\":1,\"134\":3,\"137\":1,\"138\":1,\"149\":1,\"151\":1,\"157\":3,\"160\":1,\"161\":1,\"173\":1,\"175\":1,\"181\":3,\"184\":1,\"185\":1,\"207\":1,\"217\":3,\"220\":1,\"221\":1,\"226\":1,\"247\":3,\"250\":1,\"251\":1,\"256\":1,\"277\":3,\"280\":1,\"281\":1,\"286\":1,\"293\":1,\"294\":1,\"323\":3,\"326\":1,\"327\":1,\"332\":1,\"343\":1,\"344\":1,\"369\":3,\"372\":1,\"373\":1,\"378\":1,\"383\":1,\"387\":1,\"394\":1,\"395\":1,\"396\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"432\":1,\"435\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"470\":1,\"471\":1,\"474\":1,\"478\":1,\"486\":1,\"490\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"534\":1,\"538\":1,\"545\":1,\"546\":1,\"547\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"583\":1,\"586\":1,\"610\":3,\"618\":2,\"623\":1,\"624\":1,\"627\":1,\"631\":1,\"639\":1,\"644\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"684\":1,\"685\":1,\"714\":3,\"717\":1,\"718\":1,\"723\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"752\":1,\"756\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"804\":1,\"807\":1,\"817\":3,\"825\":2,\"830\":1,\"831\":1,\"834\":1,\"838\":1,\"846\":1,\"851\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"891\":1,\"892\":1,\"937\":3,\"940\":1,\"941\":1,\"946\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"975\":1,\"979\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1027\":1,\"1030\":1,\"1040\":3,\"1048\":2,\"1053\":1,\"1054\":1,\"1057\":1,\"1061\":1,\"1069\":1,\"1074\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1136\":1,\"1140\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1188\":1,\"1191\":1,\"1217\":3,\"1225\":2,\"1230\":1,\"1231\":1,\"1234\":1,\"1238\":1,\"1246\":1,\"1251\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1329\":1,\"1333\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1381\":1,\"1384\":1,\"1410\":3,\"1418\":2,\"1423\":1,\"1424\":1,\"1427\":1,\"1431\":1,\"1439\":1,\"1444\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1482\":2,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1516\":1,\"1520\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1571\":1,\"1574\":1,\"1579\":1,\"1586\":1,\"1609\":3,\"1617\":2,\"1622\":1,\"1623\":1,\"1626\":1,\"1630\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1641\":1,\"1646\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1677\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1725\":1,\"1729\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1777\":1,\"1780\":1,\"1790\":3,\"1798\":2,\"1803\":1,\"1804\":1,\"1807\":1,\"1811\":1,\"1819\":1,\"1824\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1878\":2,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1912\":1,\"1916\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1967\":1,\"1970\":1,\"1975\":1,\"1982\":1,\"2005\":3,\"2013\":2,\"2018\":1,\"2019\":1,\"2022\":1,\"2026\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2037\":1,\"2042\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2073\":1,\"2097\":2,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2131\":1,\"2135\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2186\":1,\"2189\":1,\"2194\":1,\"2201\":1,\"2224\":3,\"2232\":2,\"2237\":1,\"2238\":1,\"2241\":1,\"2245\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2256\":1,\"2261\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2292\":1}}],[\"on\",{\"0\":{\"140\":1,\"163\":1,\"187\":1,\"223\":1,\"253\":1,\"283\":1,\"329\":1,\"375\":1,\"720\":1,\"943\":1},\"1\":{\"0\":1,\"6\":1,\"7\":1,\"10\":2,\"11\":1,\"14\":1,\"15\":1,\"20\":1,\"27\":1,\"41\":1,\"52\":1,\"54\":2,\"59\":1,\"60\":1,\"61\":5,\"63\":7,\"66\":1,\"76\":1,\"77\":1,\"80\":2,\"81\":3,\"83\":1,\"84\":1,\"88\":1,\"89\":2,\"92\":2,\"95\":3,\"99\":1,\"119\":1,\"122\":1,\"126\":2,\"128\":2,\"137\":1,\"139\":1,\"140\":1,\"144\":1,\"147\":1,\"149\":2,\"151\":2,\"160\":1,\"162\":1,\"163\":1,\"168\":2,\"169\":1,\"173\":2,\"175\":2,\"184\":1,\"186\":1,\"187\":1,\"192\":2,\"193\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"205\":2,\"207\":1,\"220\":1,\"222\":1,\"223\":1,\"228\":2,\"229\":1,\"230\":1,\"233\":1,\"235\":1,\"237\":1,\"250\":1,\"252\":1,\"253\":1,\"258\":2,\"259\":1,\"260\":1,\"263\":1,\"265\":1,\"267\":1,\"280\":1,\"282\":1,\"283\":1,\"288\":2,\"289\":1,\"293\":2,\"297\":1,\"299\":1,\"300\":2,\"301\":3,\"305\":4,\"306\":1,\"309\":1,\"311\":1,\"313\":1,\"326\":1,\"328\":1,\"329\":1,\"334\":2,\"335\":1,\"336\":1,\"339\":1,\"343\":2,\"347\":1,\"349\":1,\"350\":2,\"351\":3,\"355\":4,\"357\":1,\"359\":1,\"372\":1,\"374\":1,\"375\":1,\"380\":2,\"381\":1,\"418\":1,\"419\":1,\"424\":1,\"432\":1,\"435\":1,\"486\":1,\"569\":1,\"570\":1,\"575\":1,\"583\":1,\"586\":1,\"639\":1,\"677\":1,\"684\":2,\"688\":1,\"690\":1,\"691\":2,\"692\":3,\"696\":4,\"697\":1,\"700\":1,\"702\":1,\"704\":1,\"717\":1,\"719\":1,\"720\":1,\"725\":2,\"726\":1,\"787\":1,\"788\":1,\"793\":1,\"804\":1,\"807\":1,\"846\":1,\"884\":1,\"891\":2,\"895\":1,\"897\":1,\"898\":2,\"899\":3,\"903\":4,\"904\":1,\"907\":1,\"925\":1,\"927\":1,\"929\":1,\"940\":1,\"942\":1,\"943\":1,\"948\":2,\"949\":1,\"1010\":1,\"1011\":1,\"1016\":1,\"1027\":1,\"1030\":1,\"1069\":1,\"1107\":1,\"1171\":1,\"1172\":1,\"1177\":1,\"1188\":1,\"1191\":1,\"1246\":1,\"1284\":1,\"1364\":1,\"1365\":1,\"1370\":1,\"1381\":1,\"1384\":1,\"1439\":1,\"1477\":1,\"1554\":1,\"1555\":1,\"1560\":1,\"1571\":1,\"1574\":1,\"1588\":1,\"1641\":1,\"1680\":1,\"1760\":1,\"1761\":1,\"1766\":1,\"1777\":1,\"1780\":1,\"1819\":1,\"1857\":1,\"1950\":1,\"1951\":1,\"1956\":1,\"1967\":1,\"1970\":1,\"1984\":1,\"2037\":1,\"2076\":1,\"2169\":1,\"2170\":1,\"2175\":1,\"2186\":1,\"2189\":1,\"2203\":1,\"2256\":1,\"2295\":1}}],[\"ip\",{\"0\":{\"498\":1,\"595\":1,\"909\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1},\"1\":{\"498\":1,\"595\":1,\"909\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"icon\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"icd\",{\"1\":{\"58\":1}}],[\"io\",{\"1\":{\"132\":1,\"155\":1,\"168\":4,\"169\":2,\"179\":1,\"192\":4,\"193\":2,\"215\":1,\"228\":4,\"229\":2,\"245\":1,\"258\":4,\"259\":2,\"275\":1,\"288\":4,\"289\":2,\"321\":1,\"334\":4,\"335\":2,\"367\":1,\"380\":4,\"381\":2,\"678\":1,\"712\":1,\"725\":4,\"726\":2,\"885\":1,\"935\":1,\"948\":4,\"949\":2,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"illustrate\",{\"1\":{\"67\":1,\"81\":1}}],[\"idle\",{\"1\":{\"455\":1,\"523\":1,\"662\":1,\"741\":1,\"869\":1,\"964\":1,\"1092\":1,\"1125\":1,\"1269\":1,\"1318\":1,\"1462\":1,\"1505\":1,\"1665\":1,\"1714\":1,\"1842\":1,\"1901\":1,\"2061\":1,\"2120\":1,\"2280\":1}}],[\"idletimeout\",{\"0\":{\"455\":1,\"523\":1,\"662\":1,\"741\":1,\"869\":1,\"964\":1,\"1092\":1,\"1125\":1,\"1269\":1,\"1318\":1,\"1462\":1,\"1505\":1,\"1665\":1,\"1714\":1,\"1842\":1,\"1901\":1,\"2061\":1,\"2120\":1,\"2280\":1},\"1\":{\"455\":1,\"523\":1,\"662\":1,\"741\":1,\"869\":1,\"964\":1,\"1092\":1,\"1125\":1,\"1269\":1,\"1318\":1,\"1462\":1,\"1505\":1,\"1665\":1,\"1714\":1,\"1842\":1,\"1901\":1,\"2061\":1,\"2120\":1,\"2280\":1}}],[\"idea\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"ideas\",{\"1\":{\"81\":1,\"82\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"290\":1,\"305\":1,\"313\":1,\"329\":1,\"340\":1,\"355\":1,\"359\":1,\"375\":1,\"681\":1,\"696\":1,\"704\":1,\"720\":1,\"888\":1,\"903\":1,\"927\":1,\"943\":1}}],[\"ide\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"identify\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"identifying\",{\"1\":{\"63\":1}}],[\"identifier\",{\"0\":{\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"847\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1},\"1\":{\"127\":1,\"137\":3,\"138\":3,\"150\":1,\"160\":2,\"161\":2,\"174\":1,\"184\":2,\"185\":2,\"206\":1,\"220\":2,\"221\":2,\"236\":1,\"250\":2,\"266\":1,\"280\":2,\"312\":1,\"326\":2,\"358\":1,\"372\":2,\"409\":2,\"487\":2,\"560\":2,\"640\":2,\"703\":1,\"717\":2,\"847\":2,\"926\":1,\"940\":2,\"1070\":2,\"1247\":2,\"1440\":2,\"1642\":2,\"1820\":2,\"2038\":2,\"2257\":2}}],[\"identified\",{\"1\":{\"63\":1}}],[\"id\",{\"0\":{\"449\":1,\"517\":1,\"656\":1,\"735\":1,\"863\":1,\"958\":1,\"1086\":1,\"1119\":1,\"1263\":1,\"1312\":1,\"1456\":1,\"1499\":1,\"1659\":1,\"1708\":1,\"1836\":1,\"1895\":1,\"2055\":1,\"2114\":1,\"2274\":1},\"1\":{\"76\":1,\"77\":1,\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"445\":1,\"446\":1,\"449\":2,\"513\":1,\"514\":1,\"517\":2,\"652\":1,\"653\":1,\"656\":2,\"675\":1,\"678\":1,\"731\":1,\"732\":1,\"735\":2,\"859\":1,\"860\":1,\"863\":2,\"882\":1,\"885\":1,\"954\":1,\"955\":1,\"958\":2,\"1082\":1,\"1083\":1,\"1086\":2,\"1105\":1,\"1108\":1,\"1115\":1,\"1116\":1,\"1119\":2,\"1259\":1,\"1260\":1,\"1263\":2,\"1282\":1,\"1285\":1,\"1308\":1,\"1309\":1,\"1312\":2,\"1452\":1,\"1453\":1,\"1456\":2,\"1475\":1,\"1478\":1,\"1495\":1,\"1496\":1,\"1499\":2,\"1587\":1,\"1589\":1,\"1655\":1,\"1656\":1,\"1659\":2,\"1678\":1,\"1681\":1,\"1704\":1,\"1705\":1,\"1708\":2,\"1832\":1,\"1833\":1,\"1836\":2,\"1855\":1,\"1858\":1,\"1891\":1,\"1892\":1,\"1895\":2,\"1983\":1,\"1985\":1,\"2051\":1,\"2052\":1,\"2055\":2,\"2074\":1,\"2077\":1,\"2110\":1,\"2111\":1,\"2114\":2,\"2202\":1,\"2204\":1,\"2270\":1,\"2271\":1,\"2274\":2,\"2293\":1,\"2296\":1}}],[\"idat\",{\"1\":{\"63\":1}}],[\"ihe\",{\"1\":{\"63\":2}}],[\"ihres\",{\"1\":{\"31\":1}}],[\"i\",{\"1\":{\"39\":1,\"67\":1,\"89\":1}}],[\"image\",{\"1\":{\"168\":4,\"169\":2,\"192\":5,\"193\":3,\"228\":4,\"229\":2,\"258\":4,\"259\":2,\"288\":4,\"289\":2,\"334\":4,\"335\":2,\"380\":4,\"381\":2,\"442\":1,\"443\":1,\"463\":2,\"465\":1,\"510\":1,\"511\":1,\"531\":2,\"533\":1,\"649\":1,\"650\":1,\"670\":2,\"672\":1,\"678\":1,\"725\":4,\"726\":2,\"728\":1,\"729\":1,\"749\":2,\"751\":1,\"856\":1,\"857\":1,\"877\":2,\"879\":1,\"885\":1,\"948\":4,\"949\":2,\"951\":1,\"952\":1,\"972\":2,\"974\":1,\"1079\":1,\"1080\":1,\"1100\":2,\"1102\":1,\"1108\":1,\"1112\":1,\"1113\":1,\"1133\":2,\"1135\":1,\"1256\":1,\"1257\":1,\"1277\":2,\"1279\":1,\"1285\":1,\"1305\":1,\"1306\":1,\"1326\":2,\"1328\":1,\"1449\":1,\"1450\":1,\"1470\":2,\"1472\":1,\"1478\":1,\"1492\":1,\"1493\":1,\"1513\":2,\"1515\":1,\"1589\":1,\"1652\":1,\"1653\":1,\"1673\":2,\"1675\":1,\"1681\":1,\"1701\":1,\"1702\":1,\"1722\":2,\"1724\":1,\"1829\":1,\"1830\":1,\"1850\":2,\"1852\":1,\"1858\":1,\"1888\":1,\"1889\":1,\"1909\":2,\"1911\":1,\"1985\":1,\"2048\":1,\"2049\":1,\"2069\":2,\"2071\":1,\"2077\":1,\"2107\":1,\"2108\":1,\"2128\":2,\"2130\":1,\"2204\":1,\"2267\":1,\"2268\":1,\"2288\":2,\"2290\":1,\"2296\":1}}],[\"imagine\",{\"1\":{\"66\":1}}],[\"im\",{\"1\":{\"31\":1,\"32\":2,\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"improving\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"improvement\",{\"1\":{\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"290\":1,\"303\":1,\"304\":1,\"305\":1,\"313\":1,\"329\":1,\"340\":1,\"353\":1,\"354\":1,\"355\":1,\"359\":1,\"375\":1,\"681\":1,\"694\":1,\"695\":1,\"696\":1,\"704\":1,\"720\":1,\"888\":1,\"901\":1,\"902\":1,\"903\":1,\"927\":1,\"943\":1}}],[\"improvements\",{\"1\":{\"81\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"improved\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"improve\",{\"1\":{\"11\":1,\"21\":1,\"303\":1,\"305\":2,\"353\":1,\"355\":2,\"694\":1,\"696\":2,\"901\":1,\"903\":2}}],[\"import\",{\"1\":{\"293\":3,\"343\":3,\"684\":3,\"891\":3}}],[\"importantly\",{\"1\":{\"58\":1}}],[\"important\",{\"1\":{\"53\":1,\"61\":2,\"66\":1,\"81\":1,\"95\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1,\"227\":1,\"257\":1,\"287\":1,\"296\":1,\"299\":1,\"333\":1,\"346\":1,\"349\":1,\"379\":1,\"687\":1,\"690\":1,\"724\":1,\"894\":1,\"897\":1,\"947\":1}}],[\"impact\",{\"1\":{\"99\":1,\"291\":1,\"301\":1,\"304\":1,\"341\":1,\"351\":1,\"354\":1,\"682\":1,\"692\":1,\"695\":1,\"889\":1,\"899\":1,\"902\":1}}],[\"implemented\",{\"1\":{\"61\":1}}],[\"implements\",{\"1\":{\"52\":1,\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"implementing\",{\"1\":{\"41\":1,\"84\":1}}],[\"implementation\",{\"1\":{\"20\":1,\"39\":2,\"42\":1,\"60\":2,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"implement\",{\"0\":{\"28\":1},\"1\":{\"11\":1,\"20\":1,\"27\":1,\"28\":1,\"60\":1,\"95\":2}}],[\"if\",{\"1\":{\"6\":1,\"8\":1,\"27\":1,\"28\":1,\"50\":1,\"57\":1,\"61\":2,\"70\":1,\"71\":1,\"76\":1,\"84\":1,\"99\":4,\"100\":1,\"102\":1,\"125\":1,\"127\":2,\"129\":1,\"133\":1,\"137\":4,\"138\":3,\"139\":2,\"148\":1,\"150\":2,\"152\":1,\"156\":1,\"160\":3,\"161\":3,\"162\":2,\"167\":1,\"172\":1,\"174\":2,\"176\":1,\"180\":1,\"184\":3,\"185\":3,\"186\":2,\"191\":1,\"192\":1,\"206\":2,\"216\":1,\"220\":3,\"221\":3,\"222\":2,\"226\":2,\"227\":1,\"236\":2,\"246\":1,\"250\":3,\"251\":3,\"252\":2,\"256\":2,\"266\":2,\"276\":1,\"280\":3,\"281\":3,\"282\":2,\"286\":2,\"293\":1,\"300\":3,\"303\":3,\"305\":5,\"312\":2,\"322\":1,\"326\":3,\"327\":3,\"328\":2,\"332\":2,\"343\":1,\"350\":3,\"353\":3,\"355\":5,\"358\":2,\"368\":1,\"372\":3,\"373\":3,\"374\":2,\"378\":2,\"387\":1,\"398\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"414\":1,\"420\":1,\"430\":1,\"435\":1,\"437\":1,\"438\":1,\"440\":1,\"449\":1,\"450\":1,\"452\":1,\"468\":1,\"470\":1,\"471\":1,\"478\":1,\"486\":1,\"491\":1,\"492\":1,\"494\":1,\"505\":1,\"506\":1,\"517\":1,\"518\":1,\"520\":1,\"538\":1,\"549\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"565\":1,\"571\":1,\"581\":1,\"586\":1,\"588\":1,\"589\":1,\"591\":1,\"602\":1,\"603\":1,\"610\":1,\"612\":1,\"613\":1,\"617\":2,\"621\":1,\"623\":1,\"624\":1,\"631\":1,\"639\":1,\"643\":1,\"645\":1,\"646\":1,\"648\":1,\"656\":1,\"657\":1,\"659\":1,\"677\":1,\"684\":1,\"691\":3,\"694\":3,\"696\":5,\"703\":2,\"713\":1,\"717\":3,\"718\":3,\"719\":2,\"723\":2,\"735\":1,\"736\":1,\"738\":1,\"756\":1,\"768\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"783\":1,\"789\":1,\"799\":1,\"802\":1,\"803\":1,\"807\":1,\"810\":1,\"811\":1,\"813\":1,\"817\":1,\"819\":1,\"820\":1,\"824\":2,\"828\":1,\"830\":1,\"831\":1,\"838\":1,\"846\":1,\"852\":1,\"853\":1,\"855\":1,\"863\":1,\"864\":1,\"866\":1,\"884\":1,\"891\":1,\"898\":3,\"901\":3,\"903\":5,\"917\":1,\"918\":1,\"926\":2,\"936\":1,\"940\":3,\"941\":3,\"942\":2,\"946\":2,\"958\":1,\"959\":1,\"961\":1,\"979\":1,\"991\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1006\":1,\"1012\":1,\"1022\":1,\"1025\":1,\"1026\":1,\"1030\":1,\"1033\":1,\"1034\":1,\"1036\":1,\"1040\":1,\"1042\":1,\"1043\":1,\"1047\":2,\"1051\":1,\"1053\":1,\"1054\":1,\"1061\":1,\"1069\":1,\"1075\":1,\"1076\":1,\"1078\":1,\"1086\":1,\"1087\":1,\"1089\":1,\"1107\":1,\"1119\":1,\"1120\":1,\"1122\":1,\"1140\":1,\"1152\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1167\":1,\"1173\":1,\"1183\":1,\"1186\":1,\"1187\":1,\"1191\":1,\"1194\":1,\"1195\":1,\"1197\":1,\"1209\":1,\"1210\":1,\"1217\":1,\"1219\":1,\"1220\":1,\"1224\":2,\"1228\":1,\"1230\":1,\"1231\":1,\"1238\":1,\"1246\":1,\"1252\":1,\"1253\":1,\"1255\":1,\"1263\":1,\"1264\":1,\"1266\":1,\"1284\":1,\"1297\":1,\"1298\":1,\"1312\":1,\"1313\":1,\"1315\":1,\"1333\":1,\"1345\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1360\":1,\"1366\":1,\"1376\":1,\"1379\":1,\"1380\":1,\"1384\":1,\"1387\":1,\"1388\":1,\"1390\":1,\"1402\":1,\"1403\":1,\"1410\":1,\"1412\":1,\"1413\":1,\"1417\":2,\"1421\":1,\"1423\":1,\"1424\":1,\"1431\":1,\"1439\":1,\"1445\":1,\"1446\":1,\"1448\":1,\"1456\":1,\"1457\":1,\"1459\":1,\"1477\":1,\"1482\":1,\"1484\":1,\"1485\":1,\"1499\":1,\"1500\":1,\"1502\":1,\"1520\":1,\"1535\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1550\":1,\"1556\":1,\"1566\":1,\"1569\":1,\"1570\":1,\"1574\":1,\"1581\":1,\"1582\":1,\"1584\":1,\"1588\":1,\"1601\":1,\"1602\":1,\"1609\":1,\"1611\":1,\"1612\":1,\"1616\":2,\"1620\":1,\"1622\":1,\"1623\":1,\"1630\":1,\"1641\":1,\"1648\":1,\"1649\":1,\"1651\":1,\"1659\":1,\"1660\":1,\"1662\":1,\"1680\":1,\"1693\":1,\"1694\":1,\"1708\":1,\"1709\":1,\"1711\":1,\"1729\":1,\"1741\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1756\":1,\"1762\":1,\"1772\":1,\"1775\":1,\"1776\":1,\"1780\":1,\"1783\":1,\"1784\":1,\"1786\":1,\"1790\":1,\"1792\":1,\"1793\":1,\"1797\":2,\"1801\":1,\"1803\":1,\"1804\":1,\"1811\":1,\"1819\":1,\"1825\":1,\"1826\":1,\"1828\":1,\"1836\":1,\"1837\":1,\"1839\":1,\"1857\":1,\"1870\":1,\"1871\":1,\"1878\":1,\"1880\":1,\"1881\":1,\"1895\":1,\"1896\":1,\"1898\":1,\"1916\":1,\"1931\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1946\":1,\"1952\":1,\"1962\":1,\"1965\":1,\"1966\":1,\"1970\":1,\"1977\":1,\"1978\":1,\"1980\":1,\"1984\":1,\"1997\":1,\"1998\":1,\"2005\":1,\"2007\":1,\"2008\":1,\"2012\":2,\"2016\":1,\"2018\":1,\"2019\":1,\"2026\":1,\"2037\":1,\"2044\":1,\"2045\":1,\"2047\":1,\"2055\":1,\"2056\":1,\"2058\":1,\"2076\":1,\"2089\":1,\"2090\":1,\"2097\":1,\"2099\":1,\"2100\":1,\"2114\":1,\"2115\":1,\"2117\":1,\"2135\":1,\"2150\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2165\":1,\"2171\":1,\"2181\":1,\"2184\":1,\"2185\":1,\"2189\":1,\"2196\":1,\"2197\":1,\"2199\":1,\"2203\":1,\"2216\":1,\"2217\":1,\"2224\":1,\"2226\":1,\"2227\":1,\"2231\":2,\"2235\":1,\"2237\":1,\"2238\":1,\"2245\":1,\"2256\":1,\"2263\":1,\"2264\":1,\"2266\":1,\"2274\":1,\"2275\":1,\"2277\":1,\"2295\":1,\"2308\":1,\"2309\":1}}],[\"its\",{\"1\":{\"26\":1,\"53\":1,\"63\":1,\"89\":1,\"95\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"299\":1,\"302\":1,\"305\":1,\"323\":1,\"349\":1,\"352\":1,\"355\":1,\"369\":1,\"690\":1,\"693\":1,\"696\":1,\"714\":1,\"897\":1,\"900\":1,\"903\":1,\"937\":1}}],[\"it\",{\"1\":{\"1\":1,\"21\":1,\"24\":1,\"27\":1,\"52\":2,\"53\":1,\"58\":1,\"59\":1,\"60\":1,\"61\":2,\"66\":4,\"84\":1,\"90\":1,\"95\":2,\"99\":2,\"138\":1,\"161\":1,\"185\":1,\"193\":2,\"221\":1,\"227\":1,\"251\":1,\"257\":1,\"281\":1,\"287\":1,\"297\":1,\"300\":2,\"301\":1,\"303\":1,\"305\":2,\"327\":1,\"333\":1,\"347\":1,\"350\":2,\"351\":1,\"353\":1,\"355\":2,\"373\":1,\"379\":1,\"688\":1,\"691\":2,\"692\":1,\"694\":1,\"696\":2,\"718\":1,\"724\":1,\"895\":1,\"898\":2,\"899\":1,\"901\":1,\"903\":2,\"941\":1,\"947\":1}}],[\"initial\",{\"1\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"initiate\",{\"1\":{\"101\":1}}],[\"initiative\",{\"1\":{\"10\":1,\"21\":1,\"32\":1,\"37\":1,\"62\":2,\"80\":2,\"81\":1,\"89\":1,\"210\":2,\"240\":2,\"270\":3,\"305\":1,\"316\":3,\"355\":1,\"362\":3,\"696\":1,\"707\":4,\"903\":1,\"931\":1}}],[\"init\",{\"0\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1},\"1\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"innovative\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"input\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"invaluable\",{\"1\":{\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"invite\",{\"1\":{\"290\":1,\"340\":1,\"681\":1,\"888\":1}}],[\"involves\",{\"1\":{\"167\":1,\"191\":1,\"227\":1,\"257\":1,\"287\":1,\"333\":1,\"379\":1,\"724\":1,\"929\":1,\"947\":1}}],[\"involved\",{\"1\":{\"11\":2,\"80\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"investigation\",{\"1\":{\"100\":1}}],[\"investigate\",{\"1\":{\"99\":1,\"100\":1}}],[\"insights\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"insight\",{\"1\":{\"80\":1}}],[\"instead\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"723\":2,\"946\":2}}],[\"instances\",{\"1\":{\"62\":1,\"143\":2,\"166\":2,\"190\":2,\"226\":4,\"256\":4,\"286\":4,\"332\":4,\"378\":4,\"723\":4,\"946\":4}}],[\"instance\",{\"0\":{\"141\":1,\"164\":1,\"188\":1,\"224\":1,\"254\":1,\"284\":1,\"330\":1,\"376\":1,\"721\":1,\"944\":1},\"1\":{\"61\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"127\":1,\"129\":1,\"137\":1,\"143\":1,\"150\":1,\"152\":1,\"160\":1,\"166\":1,\"171\":1,\"174\":1,\"176\":1,\"184\":1,\"190\":1,\"203\":1,\"206\":1,\"212\":1,\"220\":1,\"226\":1,\"236\":1,\"242\":1,\"250\":1,\"256\":1,\"266\":1,\"272\":1,\"280\":1,\"286\":1,\"312\":1,\"318\":1,\"326\":1,\"332\":1,\"358\":1,\"364\":1,\"372\":1,\"378\":1,\"703\":1,\"709\":1,\"717\":1,\"723\":1,\"926\":1,\"932\":1,\"940\":1,\"946\":1}}],[\"install\",{\"0\":{\"129\":1,\"152\":1,\"176\":1,\"208\":1,\"212\":1,\"238\":1,\"242\":1,\"268\":1,\"272\":1,\"314\":1,\"318\":1,\"360\":1,\"364\":1,\"705\":1,\"709\":1,\"928\":1,\"932\":1},\"1\":{\"95\":2,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"129\":2,\"132\":4,\"142\":1,\"143\":1,\"152\":2,\"155\":4,\"165\":1,\"166\":1,\"169\":1,\"170\":1,\"176\":2,\"179\":4,\"189\":1,\"190\":1,\"193\":1,\"202\":1,\"212\":1,\"215\":4,\"225\":1,\"226\":1,\"229\":1,\"242\":1,\"245\":4,\"255\":1,\"256\":1,\"259\":1,\"272\":1,\"275\":4,\"285\":1,\"286\":1,\"289\":1,\"318\":1,\"321\":4,\"331\":1,\"332\":1,\"335\":1,\"364\":1,\"367\":4,\"377\":1,\"378\":1,\"381\":1,\"709\":1,\"712\":4,\"722\":1,\"723\":1,\"726\":1,\"928\":1,\"929\":1,\"932\":1,\"935\":4,\"945\":1,\"946\":1,\"949\":1}}],[\"installed\",{\"1\":{\"52\":2,\"88\":1,\"91\":1,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"297\":1,\"321\":1,\"347\":1,\"367\":1,\"688\":1,\"712\":1,\"895\":1,\"935\":1}}],[\"installations\",{\"1\":{\"192\":1}}],[\"installationshinweise\",{\"0\":{\"33\":1},\"1\":{\"29\":1}}],[\"installation\",{\"1\":{\"32\":1,\"34\":1,\"37\":1,\"129\":4,\"143\":1,\"152\":4,\"166\":1,\"176\":4,\"190\":1,\"206\":1,\"212\":4,\"226\":5,\"236\":1,\"242\":4,\"256\":5,\"266\":1,\"272\":4,\"286\":5,\"312\":1,\"318\":4,\"332\":5,\"358\":1,\"364\":4,\"378\":5,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"703\":1,\"709\":4,\"723\":5,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"926\":1,\"930\":2,\"932\":4,\"946\":5,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"instructions\",{\"1\":{\"35\":5,\"36\":2,\"95\":2,\"126\":1,\"129\":1,\"143\":1,\"149\":1,\"152\":1,\"166\":1,\"167\":1,\"173\":1,\"176\":1,\"190\":1,\"191\":1,\"205\":1,\"212\":1,\"226\":1,\"227\":1,\"242\":1,\"256\":1,\"272\":1,\"286\":1,\"318\":1,\"332\":1,\"364\":1,\"378\":1,\"709\":1,\"723\":1,\"932\":1,\"946\":1}}],[\"institutions\",{\"1\":{\"62\":2,\"89\":1}}],[\"institutional\",{\"1\":{\"21\":1,\"89\":1}}],[\"institution\",{\"1\":{\"13\":1}}],[\"institute\",{\"0\":{\"13\":1,\"14\":1,\"15\":1},\"1\":{\"11\":1,\"13\":1,\"14\":2,\"15\":1,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"indicator\",{\"1\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"individuals\",{\"1\":{\"80\":1,\"101\":1}}],[\"individual\",{\"1\":{\"66\":1}}],[\"index\",{\"1\":{\"63\":1}}],[\"independent\",{\"1\":{\"62\":1,\"81\":1}}],[\"introduced\",{\"1\":{\"84\":1}}],[\"introduction\",{\"0\":{\"62\":1},\"1\":{\"41\":1,\"44\":1,\"46\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"701\":1,\"924\":1}}],[\"intranet\",{\"1\":{\"52\":1}}],[\"into\",{\"1\":{\"24\":1,\"27\":1,\"53\":1,\"57\":1,\"58\":1,\"59\":1,\"80\":1,\"81\":1,\"89\":2,\"137\":2,\"138\":2,\"143\":1,\"160\":2,\"161\":2,\"166\":1,\"184\":2,\"185\":2,\"190\":1,\"220\":2,\"221\":2,\"226\":1,\"250\":2,\"251\":2,\"256\":1,\"280\":2,\"281\":2,\"286\":1,\"301\":1,\"326\":2,\"327\":2,\"332\":1,\"351\":1,\"372\":2,\"373\":2,\"378\":1,\"692\":1,\"717\":2,\"718\":2,\"723\":1,\"899\":1,\"940\":2,\"941\":2,\"946\":1}}],[\"intellij\",{\"1\":{\"293\":2,\"343\":2,\"684\":2,\"891\":2}}],[\"intended\",{\"1\":{\"67\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"integrated\",{\"1\":{\"58\":1,\"89\":1}}],[\"integrating\",{\"1\":{\"27\":1}}],[\"integration\",{\"1\":{\"10\":2,\"11\":1,\"14\":1,\"26\":1,\"55\":1,\"62\":1,\"89\":2,\"90\":1,\"92\":1}}],[\"integrity\",{\"1\":{\"20\":1,\"25\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"interface\",{\"1\":{\"610\":3,\"616\":1,\"674\":2,\"817\":3,\"823\":1,\"881\":2,\"1040\":3,\"1046\":1,\"1104\":2,\"1217\":3,\"1223\":1,\"1281\":2,\"1410\":3,\"1416\":1,\"1474\":2,\"1482\":3,\"1488\":1,\"1586\":2,\"1609\":3,\"1615\":1,\"1677\":2,\"1790\":3,\"1796\":1,\"1854\":2,\"1878\":3,\"1884\":1,\"1982\":2,\"2005\":3,\"2011\":1,\"2073\":2,\"2097\":3,\"2103\":1,\"2201\":2,\"2224\":3,\"2230\":1,\"2292\":2}}],[\"interfaces\",{\"1\":{\"13\":1}}],[\"intermediate\",{\"1\":{\"504\":1,\"601\":1,\"916\":1,\"1208\":1,\"1296\":1,\"1401\":1,\"1600\":1,\"1692\":1,\"1869\":1,\"1996\":1,\"2088\":1,\"2215\":1,\"2307\":1}}],[\"interception\",{\"1\":{\"134\":2,\"157\":2,\"181\":2,\"217\":2,\"247\":2,\"277\":2,\"323\":2,\"369\":2,\"714\":2,\"937\":2}}],[\"interconnectivity\",{\"1\":{\"58\":1}}],[\"interval\",{\"1\":{\"69\":4,\"192\":1,\"193\":1}}],[\"internet\",{\"1\":{\"63\":1,\"134\":3,\"157\":3,\"181\":3,\"217\":3,\"247\":3,\"277\":3,\"323\":3,\"369\":3,\"714\":3,\"937\":3}}],[\"international\",{\"1\":{\"62\":1}}],[\"internal\",{\"1\":{\"54\":2,\"63\":2,\"73\":2,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"interpretation\",{\"1\":{\"58\":1}}],[\"interested\",{\"1\":{\"27\":1,\"80\":1}}],[\"interoperability\",{\"0\":{\"58\":1},\"1\":{\"13\":1,\"21\":1,\"39\":1,\"57\":1,\"58\":3,\"59\":1}}],[\"interoperable\",{\"1\":{\"0\":1,\"27\":1,\"62\":1}}],[\"incredibly\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"increase\",{\"1\":{\"11\":1}}],[\"incoming\",{\"1\":{\"63\":4,\"64\":1,\"70\":1}}],[\"incorporated\",{\"1\":{\"24\":1}}],[\"including\",{\"1\":{\"18\":1,\"80\":1,\"99\":1,\"504\":1,\"601\":1,\"916\":1,\"1208\":1,\"1296\":1,\"1401\":1,\"1600\":1,\"1692\":1,\"1869\":1,\"1996\":1,\"2088\":1,\"2215\":1,\"2307\":1}}],[\"included\",{\"1\":{\"63\":1,\"73\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"include\",{\"1\":{\"13\":1,\"99\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"305\":1,\"328\":1,\"355\":1,\"374\":1,\"418\":1,\"569\":1,\"696\":1,\"719\":1,\"787\":1,\"903\":1,\"942\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\"includes\",{\"1\":{\"0\":1,\"18\":1,\"25\":1,\"58\":1,\"101\":1}}],[\"infile=certificate\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"infile=client\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"641\":1,\"717\":1,\"848\":1,\"940\":1,\"1071\":1,\"1248\":1,\"1441\":1,\"1643\":1,\"1821\":1,\"2039\":1,\"2258\":1}}],[\"infinite\",{\"1\":{\"410\":1,\"433\":1,\"561\":1,\"584\":1,\"779\":1,\"805\":1,\"1002\":1,\"1028\":1,\"1163\":1,\"1189\":1,\"1356\":1,\"1382\":1,\"1546\":1,\"1572\":1,\"1752\":1,\"1778\":1,\"1942\":1,\"1968\":1,\"2161\":1,\"2187\":1}}],[\"infastructure\",{\"1\":{\"207\":1}}],[\"info\",{\"0\":{\"2316\":1},\"1\":{\"139\":2,\"162\":2,\"169\":2,\"186\":2,\"193\":2,\"222\":2,\"229\":2,\"252\":2,\"259\":2,\"282\":2,\"289\":2,\"328\":2,\"335\":2,\"374\":2,\"381\":2,\"418\":1,\"569\":1,\"719\":4,\"726\":2,\"787\":1,\"942\":4,\"949\":2,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\"informed\",{\"1\":{\"100\":1}}],[\"inform\",{\"1\":{\"39\":9}}],[\"informational\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"information\",{\"0\":{\"90\":1},\"1\":{\"7\":1,\"14\":1,\"28\":1,\"50\":1,\"55\":2,\"56\":1,\"57\":1,\"58\":1,\"59\":3,\"63\":1,\"73\":1,\"74\":1,\"76\":1,\"77\":1,\"88\":1,\"89\":1,\"92\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"126\":3,\"134\":1,\"139\":1,\"140\":1,\"149\":3,\"157\":1,\"160\":1,\"162\":1,\"163\":1,\"170\":1,\"173\":3,\"181\":1,\"184\":1,\"186\":1,\"187\":1,\"202\":1,\"205\":2,\"217\":1,\"220\":1,\"222\":1,\"223\":1,\"235\":2,\"247\":1,\"250\":1,\"252\":1,\"253\":1,\"265\":2,\"277\":1,\"280\":1,\"282\":1,\"283\":1,\"301\":1,\"305\":1,\"311\":2,\"323\":1,\"326\":1,\"328\":1,\"329\":1,\"351\":1,\"355\":1,\"357\":2,\"369\":1,\"372\":1,\"374\":1,\"375\":1,\"396\":1,\"547\":1,\"692\":1,\"696\":1,\"702\":2,\"714\":1,\"717\":1,\"719\":1,\"720\":1,\"765\":1,\"766\":1,\"899\":1,\"903\":1,\"925\":2,\"937\":1,\"940\":1,\"942\":1,\"943\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"informatician\",{\"1\":{\"1\":1}}],[\"informatics\",{\"0\":{\"10\":1,\"14\":1},\"1\":{\"0\":1,\"1\":1,\"10\":1,\"11\":1,\"13\":1,\"14\":1,\"15\":1,\"21\":1,\"62\":3,\"80\":1,\"81\":1,\"82\":1,\"89\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"infrastructure\",{\"1\":{\"0\":1,\"10\":1,\"35\":1,\"62\":1,\"81\":2,\"91\":1,\"92\":1,\"126\":1,\"127\":1,\"149\":1,\"150\":1,\"173\":1,\"174\":1,\"206\":1,\"207\":2,\"236\":1,\"237\":3,\"266\":1,\"267\":3,\"312\":1,\"313\":3,\"358\":1,\"359\":3,\"703\":1,\"704\":3,\"926\":1,\"927\":3}}],[\"in\",{\"0\":{\"11\":1,\"26\":1,\"56\":1,\"64\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1},\"1\":{\"0\":3,\"1\":2,\"7\":1,\"10\":6,\"11\":3,\"13\":1,\"14\":1,\"15\":1,\"20\":3,\"26\":2,\"27\":1,\"28\":2,\"29\":2,\"30\":1,\"31\":2,\"32\":1,\"39\":5,\"42\":2,\"49\":1,\"52\":4,\"53\":3,\"54\":3,\"55\":3,\"59\":1,\"60\":1,\"61\":4,\"62\":1,\"63\":1,\"64\":2,\"66\":2,\"67\":1,\"69\":1,\"70\":2,\"73\":4,\"74\":1,\"77\":1,\"80\":3,\"81\":4,\"84\":2,\"88\":2,\"90\":1,\"91\":2,\"92\":2,\"95\":1,\"97\":1,\"99\":2,\"100\":2,\"101\":2,\"105\":1,\"106\":1,\"107\":1,\"108\":1,\"109\":1,\"110\":1,\"111\":1,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"119\":3,\"122\":3,\"123\":1,\"124\":1,\"129\":1,\"137\":1,\"139\":5,\"144\":3,\"147\":3,\"152\":1,\"160\":1,\"162\":5,\"169\":2,\"170\":1,\"171\":1,\"176\":1,\"184\":1,\"186\":5,\"193\":2,\"194\":3,\"197\":3,\"198\":3,\"201\":3,\"202\":1,\"203\":1,\"204\":1,\"207\":1,\"212\":1,\"220\":1,\"222\":5,\"226\":1,\"229\":2,\"230\":3,\"233\":3,\"234\":1,\"242\":1,\"250\":1,\"252\":5,\"256\":1,\"259\":2,\"260\":3,\"263\":3,\"264\":1,\"272\":1,\"280\":1,\"282\":5,\"286\":1,\"289\":2,\"291\":2,\"298\":1,\"299\":1,\"300\":2,\"301\":1,\"302\":3,\"303\":3,\"304\":1,\"305\":3,\"306\":3,\"309\":3,\"310\":1,\"318\":1,\"326\":1,\"328\":5,\"332\":1,\"335\":2,\"336\":3,\"339\":3,\"341\":2,\"348\":1,\"349\":1,\"350\":2,\"351\":1,\"352\":3,\"353\":3,\"354\":1,\"355\":3,\"356\":1,\"364\":1,\"372\":1,\"374\":5,\"378\":1,\"381\":2,\"384\":1,\"387\":1,\"390\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"409\":1,\"418\":1,\"419\":1,\"432\":1,\"442\":1,\"443\":1,\"454\":1,\"455\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":2,\"465\":1,\"470\":1,\"471\":1,\"475\":1,\"478\":1,\"486\":1,\"487\":1,\"510\":1,\"511\":1,\"522\":1,\"523\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":2,\"533\":1,\"535\":1,\"538\":1,\"541\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"560\":1,\"569\":1,\"570\":1,\"583\":1,\"610\":1,\"613\":3,\"617\":2,\"623\":1,\"624\":1,\"628\":1,\"631\":1,\"639\":1,\"640\":1,\"643\":1,\"649\":1,\"650\":1,\"661\":1,\"662\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":2,\"672\":1,\"682\":2,\"689\":1,\"690\":1,\"691\":2,\"692\":1,\"693\":3,\"694\":3,\"695\":1,\"696\":3,\"697\":3,\"700\":3,\"701\":1,\"709\":1,\"717\":1,\"719\":5,\"723\":1,\"726\":2,\"728\":1,\"729\":1,\"740\":1,\"741\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":2,\"751\":1,\"753\":1,\"756\":1,\"759\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"787\":1,\"788\":1,\"804\":1,\"817\":1,\"820\":3,\"824\":2,\"830\":1,\"831\":1,\"835\":1,\"838\":1,\"846\":1,\"847\":1,\"850\":1,\"856\":1,\"857\":1,\"868\":1,\"869\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":2,\"879\":1,\"889\":2,\"896\":1,\"897\":1,\"898\":2,\"899\":1,\"900\":3,\"901\":3,\"902\":1,\"903\":3,\"904\":3,\"907\":3,\"924\":1,\"929\":1,\"931\":2,\"932\":1,\"940\":1,\"942\":5,\"946\":1,\"949\":2,\"951\":1,\"952\":1,\"963\":1,\"964\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":2,\"974\":1,\"976\":1,\"979\":1,\"982\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1010\":1,\"1011\":1,\"1027\":1,\"1040\":1,\"1043\":3,\"1047\":2,\"1053\":1,\"1054\":1,\"1058\":1,\"1061\":1,\"1069\":1,\"1070\":1,\"1073\":1,\"1079\":1,\"1080\":1,\"1091\":1,\"1092\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":2,\"1102\":1,\"1112\":1,\"1113\":1,\"1124\":1,\"1125\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":2,\"1135\":1,\"1137\":1,\"1140\":1,\"1143\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1171\":1,\"1172\":1,\"1188\":1,\"1217\":1,\"1220\":3,\"1224\":2,\"1230\":1,\"1231\":1,\"1235\":1,\"1238\":1,\"1246\":1,\"1247\":1,\"1250\":1,\"1256\":1,\"1257\":1,\"1268\":1,\"1269\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":2,\"1279\":1,\"1305\":1,\"1306\":1,\"1317\":1,\"1318\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":2,\"1328\":1,\"1330\":1,\"1333\":1,\"1336\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1364\":1,\"1365\":1,\"1381\":1,\"1410\":1,\"1413\":3,\"1417\":2,\"1423\":1,\"1424\":1,\"1428\":1,\"1431\":1,\"1439\":1,\"1440\":1,\"1443\":1,\"1449\":1,\"1450\":1,\"1461\":1,\"1462\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":2,\"1472\":1,\"1482\":1,\"1485\":3,\"1492\":1,\"1493\":1,\"1504\":1,\"1505\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":2,\"1515\":1,\"1517\":1,\"1520\":1,\"1523\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1554\":1,\"1555\":1,\"1571\":1,\"1578\":1,\"1609\":1,\"1612\":3,\"1616\":2,\"1622\":1,\"1623\":1,\"1627\":1,\"1630\":1,\"1641\":1,\"1642\":1,\"1645\":1,\"1652\":1,\"1653\":1,\"1664\":1,\"1665\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":2,\"1675\":1,\"1701\":1,\"1702\":1,\"1713\":1,\"1714\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":2,\"1724\":1,\"1726\":1,\"1729\":1,\"1732\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1760\":1,\"1761\":1,\"1777\":1,\"1790\":1,\"1793\":3,\"1797\":2,\"1803\":1,\"1804\":1,\"1808\":1,\"1811\":1,\"1819\":1,\"1820\":1,\"1823\":1,\"1829\":1,\"1830\":1,\"1841\":1,\"1842\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":2,\"1852\":1,\"1878\":1,\"1881\":3,\"1888\":1,\"1889\":1,\"1900\":1,\"1901\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":2,\"1911\":1,\"1913\":1,\"1916\":1,\"1919\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1950\":1,\"1951\":1,\"1967\":1,\"1974\":1,\"2005\":1,\"2008\":3,\"2012\":2,\"2018\":1,\"2019\":1,\"2023\":1,\"2026\":1,\"2037\":1,\"2038\":1,\"2041\":1,\"2048\":1,\"2049\":1,\"2060\":1,\"2061\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":2,\"2071\":1,\"2097\":1,\"2100\":3,\"2107\":1,\"2108\":1,\"2119\":1,\"2120\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":2,\"2130\":1,\"2132\":1,\"2135\":1,\"2138\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2169\":1,\"2170\":1,\"2186\":1,\"2193\":1,\"2224\":1,\"2227\":3,\"2231\":2,\"2237\":1,\"2238\":1,\"2242\":1,\"2245\":1,\"2256\":1,\"2257\":1,\"2260\":1,\"2267\":1,\"2268\":1,\"2279\":1,\"2280\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":2,\"2290\":1}}],[\"issuing\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"issued\",{\"1\":{\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"issue\",{\"1\":{\"99\":2,\"100\":2,\"294\":1,\"295\":1,\"300\":4,\"303\":2,\"305\":3,\"344\":1,\"345\":1,\"350\":4,\"353\":2,\"355\":3,\"685\":1,\"686\":1,\"691\":4,\"694\":2,\"696\":3,\"892\":1,\"893\":1,\"898\":4,\"901\":2,\"903\":3}}],[\"issues\",{\"1\":{\"8\":1,\"81\":1,\"100\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"ist\",{\"1\":{\"29\":1,\"30\":1}}],[\"is\",{\"1\":{\"0\":4,\"1\":2,\"5\":1,\"10\":1,\"11\":2,\"13\":2,\"14\":1,\"20\":2,\"21\":1,\"24\":1,\"25\":1,\"26\":1,\"28\":1,\"39\":1,\"49\":3,\"52\":4,\"53\":2,\"54\":4,\"55\":4,\"58\":2,\"59\":2,\"60\":3,\"61\":8,\"62\":5,\"63\":5,\"64\":2,\"66\":7,\"67\":2,\"68\":1,\"69\":1,\"70\":1,\"71\":1,\"73\":4,\"74\":3,\"76\":1,\"80\":1,\"81\":2,\"84\":1,\"88\":1,\"89\":5,\"91\":1,\"92\":2,\"95\":2,\"100\":1,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"125\":1,\"126\":2,\"128\":1,\"129\":1,\"132\":1,\"134\":1,\"137\":3,\"138\":2,\"139\":1,\"140\":1,\"143\":1,\"148\":1,\"149\":2,\"151\":1,\"152\":1,\"155\":1,\"157\":1,\"160\":3,\"161\":2,\"162\":1,\"163\":1,\"166\":1,\"169\":3,\"170\":2,\"172\":1,\"173\":2,\"175\":1,\"176\":1,\"179\":1,\"181\":1,\"184\":3,\"185\":2,\"186\":1,\"187\":1,\"190\":1,\"192\":2,\"193\":5,\"202\":2,\"205\":1,\"207\":1,\"215\":1,\"217\":1,\"220\":3,\"221\":2,\"222\":1,\"223\":1,\"226\":1,\"227\":1,\"229\":3,\"235\":1,\"237\":1,\"245\":1,\"247\":1,\"250\":3,\"251\":2,\"252\":1,\"253\":1,\"256\":1,\"257\":1,\"259\":3,\"265\":1,\"267\":1,\"275\":1,\"277\":1,\"280\":3,\"281\":2,\"282\":1,\"283\":1,\"286\":1,\"287\":1,\"289\":3,\"293\":1,\"294\":1,\"295\":1,\"298\":1,\"299\":1,\"301\":1,\"302\":2,\"303\":1,\"305\":2,\"311\":1,\"313\":1,\"321\":1,\"323\":1,\"326\":3,\"327\":2,\"328\":1,\"329\":1,\"332\":1,\"333\":1,\"335\":3,\"343\":1,\"344\":1,\"345\":1,\"348\":1,\"349\":1,\"351\":1,\"352\":2,\"353\":1,\"355\":2,\"357\":1,\"359\":1,\"367\":1,\"369\":1,\"372\":3,\"373\":2,\"374\":1,\"375\":1,\"378\":1,\"379\":1,\"381\":3,\"396\":1,\"398\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"414\":1,\"437\":1,\"449\":1,\"450\":1,\"452\":1,\"468\":1,\"470\":1,\"471\":1,\"491\":1,\"506\":1,\"517\":1,\"518\":1,\"520\":1,\"547\":1,\"549\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"565\":1,\"588\":1,\"603\":1,\"610\":3,\"621\":1,\"623\":1,\"624\":1,\"645\":1,\"656\":1,\"657\":1,\"659\":1,\"674\":1,\"684\":1,\"685\":1,\"686\":1,\"689\":1,\"690\":1,\"692\":1,\"693\":2,\"694\":1,\"696\":2,\"702\":1,\"704\":1,\"712\":1,\"714\":1,\"717\":3,\"718\":2,\"719\":1,\"720\":1,\"723\":1,\"724\":1,\"726\":3,\"735\":1,\"736\":1,\"738\":1,\"765\":1,\"766\":1,\"768\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"783\":1,\"802\":1,\"810\":1,\"817\":3,\"828\":1,\"830\":1,\"831\":1,\"852\":1,\"863\":1,\"864\":1,\"866\":1,\"881\":1,\"891\":1,\"892\":1,\"893\":1,\"896\":1,\"897\":1,\"899\":1,\"900\":2,\"901\":1,\"903\":2,\"918\":1,\"925\":1,\"927\":1,\"931\":1,\"935\":1,\"937\":1,\"940\":3,\"941\":2,\"942\":1,\"943\":1,\"946\":1,\"947\":1,\"949\":3,\"958\":1,\"959\":1,\"961\":1,\"988\":1,\"989\":1,\"991\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1006\":1,\"1025\":1,\"1033\":1,\"1040\":3,\"1051\":1,\"1053\":1,\"1054\":1,\"1075\":1,\"1086\":1,\"1087\":1,\"1089\":1,\"1104\":1,\"1119\":1,\"1120\":1,\"1122\":1,\"1149\":1,\"1150\":1,\"1152\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1167\":1,\"1186\":1,\"1194\":1,\"1210\":1,\"1217\":3,\"1228\":1,\"1230\":1,\"1231\":1,\"1252\":1,\"1263\":1,\"1264\":1,\"1266\":1,\"1281\":1,\"1298\":1,\"1312\":1,\"1313\":1,\"1315\":1,\"1342\":1,\"1343\":1,\"1345\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1360\":1,\"1379\":1,\"1387\":1,\"1403\":1,\"1410\":3,\"1421\":1,\"1423\":1,\"1424\":1,\"1445\":1,\"1456\":1,\"1457\":1,\"1459\":1,\"1474\":1,\"1482\":2,\"1499\":1,\"1500\":1,\"1502\":1,\"1531\":1,\"1532\":1,\"1535\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1550\":1,\"1569\":1,\"1581\":1,\"1586\":1,\"1602\":1,\"1609\":3,\"1620\":1,\"1622\":1,\"1623\":1,\"1648\":1,\"1659\":1,\"1660\":1,\"1662\":1,\"1677\":1,\"1694\":1,\"1708\":1,\"1709\":1,\"1711\":1,\"1738\":1,\"1739\":1,\"1741\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1756\":1,\"1775\":1,\"1783\":1,\"1790\":3,\"1801\":1,\"1803\":1,\"1804\":1,\"1825\":1,\"1836\":1,\"1837\":1,\"1839\":1,\"1854\":1,\"1871\":1,\"1878\":2,\"1895\":1,\"1896\":1,\"1898\":1,\"1927\":1,\"1928\":1,\"1931\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1946\":1,\"1965\":1,\"1977\":1,\"1982\":1,\"1998\":1,\"2005\":3,\"2016\":1,\"2018\":1,\"2019\":1,\"2044\":1,\"2055\":1,\"2056\":1,\"2058\":1,\"2073\":1,\"2090\":1,\"2097\":2,\"2114\":1,\"2115\":1,\"2117\":1,\"2146\":1,\"2147\":1,\"2150\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2165\":1,\"2184\":1,\"2196\":1,\"2201\":1,\"2217\":1,\"2224\":3,\"2235\":1,\"2237\":1,\"2238\":1,\"2263\":1,\"2274\":1,\"2275\":1,\"2277\":1,\"2292\":1,\"2309\":1}}],[\"p12\",{\"1\":{\"425\":1,\"426\":1,\"576\":1,\"577\":1,\"794\":1,\"795\":1,\"1017\":1,\"1018\":1,\"1178\":1,\"1179\":1,\"1371\":1,\"1372\":1,\"1561\":1,\"1562\":1,\"1767\":1,\"1768\":1,\"1957\":1,\"1958\":1,\"2176\":1,\"2177\":1}}],[\"p12keystore\",{\"0\":{\"425\":1,\"426\":2,\"576\":1,\"577\":2,\"794\":1,\"795\":2,\"1017\":1,\"1018\":2,\"1178\":1,\"1179\":2,\"1371\":1,\"1372\":2,\"1561\":1,\"1562\":2,\"1767\":1,\"1768\":2,\"1957\":1,\"1958\":2,\"2176\":1,\"2177\":2},\"1\":{\"425\":1,\"426\":2,\"576\":1,\"577\":2,\"794\":1,\"795\":2,\"1017\":1,\"1018\":2,\"1178\":1,\"1179\":2,\"1371\":1,\"1372\":2,\"1561\":1,\"1562\":2,\"1767\":1,\"1768\":2,\"1957\":1,\"1958\":2,\"2176\":1,\"2177\":2}}],[\"pkcs\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"pkcs12\",{\"1\":{\"425\":1,\"426\":1,\"576\":1,\"577\":1,\"794\":1,\"795\":1,\"1017\":1,\"1018\":1,\"1178\":1,\"1179\":1,\"1371\":1,\"1372\":1,\"1561\":1,\"1562\":1,\"1767\":1,\"1768\":1,\"1957\":1,\"1958\":1,\"2176\":1,\"2177\":1}}],[\"pki\",{\"1\":{\"74\":2,\"76\":1,\"77\":1,\"133\":3,\"137\":1,\"156\":3,\"180\":3,\"216\":3,\"246\":3,\"276\":3,\"322\":3,\"368\":3,\"713\":3,\"936\":3}}],[\"pformat\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"peer\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"pem\",{\"1\":{\"136\":14,\"137\":15,\"138\":7,\"159\":14,\"160\":15,\"161\":7,\"183\":14,\"184\":15,\"185\":7,\"219\":14,\"220\":15,\"221\":7,\"249\":14,\"250\":15,\"251\":7,\"279\":14,\"280\":15,\"281\":7,\"325\":14,\"326\":15,\"327\":7,\"371\":14,\"372\":15,\"373\":7,\"397\":2,\"398\":2,\"399\":1,\"406\":2,\"413\":2,\"414\":2,\"415\":1,\"429\":2,\"451\":2,\"452\":2,\"453\":1,\"456\":2,\"458\":2,\"467\":2,\"468\":2,\"469\":1,\"472\":2,\"504\":2,\"505\":1,\"506\":2,\"507\":2,\"508\":2,\"519\":2,\"520\":2,\"521\":1,\"524\":2,\"526\":2,\"548\":2,\"549\":2,\"550\":1,\"557\":2,\"564\":2,\"565\":2,\"566\":1,\"580\":2,\"601\":2,\"602\":1,\"603\":2,\"604\":2,\"605\":2,\"610\":1,\"620\":2,\"621\":2,\"622\":1,\"625\":2,\"641\":1,\"658\":2,\"659\":2,\"660\":1,\"663\":2,\"665\":2,\"677\":1,\"678\":4,\"716\":14,\"717\":15,\"718\":7,\"737\":2,\"738\":2,\"739\":1,\"742\":2,\"744\":2,\"767\":2,\"768\":2,\"769\":1,\"776\":2,\"782\":2,\"783\":2,\"784\":1,\"798\":2,\"817\":1,\"827\":2,\"828\":2,\"829\":1,\"832\":2,\"848\":1,\"865\":2,\"866\":2,\"867\":1,\"870\":2,\"872\":2,\"884\":1,\"885\":4,\"916\":2,\"917\":1,\"918\":2,\"919\":2,\"920\":2,\"939\":14,\"940\":15,\"941\":7,\"960\":2,\"961\":2,\"962\":1,\"965\":2,\"967\":2,\"990\":2,\"991\":2,\"992\":1,\"999\":2,\"1005\":2,\"1006\":2,\"1007\":1,\"1021\":2,\"1040\":1,\"1050\":2,\"1051\":2,\"1052\":1,\"1055\":2,\"1071\":1,\"1088\":2,\"1089\":2,\"1090\":1,\"1093\":2,\"1095\":2,\"1107\":1,\"1108\":4,\"1121\":2,\"1122\":2,\"1123\":1,\"1126\":2,\"1128\":2,\"1151\":2,\"1152\":2,\"1153\":1,\"1160\":2,\"1166\":2,\"1167\":2,\"1168\":1,\"1182\":2,\"1208\":2,\"1209\":1,\"1210\":2,\"1211\":2,\"1212\":2,\"1217\":1,\"1227\":2,\"1228\":2,\"1229\":1,\"1232\":2,\"1248\":1,\"1265\":2,\"1266\":2,\"1267\":1,\"1270\":2,\"1272\":2,\"1284\":1,\"1285\":4,\"1296\":2,\"1297\":1,\"1298\":2,\"1299\":2,\"1300\":2,\"1314\":2,\"1315\":2,\"1316\":1,\"1319\":2,\"1321\":2,\"1344\":2,\"1345\":2,\"1346\":1,\"1353\":2,\"1359\":2,\"1360\":2,\"1361\":1,\"1375\":2,\"1401\":2,\"1402\":1,\"1403\":2,\"1404\":2,\"1405\":2,\"1410\":1,\"1420\":2,\"1421\":2,\"1422\":1,\"1425\":2,\"1441\":1,\"1458\":2,\"1459\":2,\"1460\":1,\"1463\":2,\"1465\":2,\"1477\":1,\"1478\":4,\"1482\":1,\"1501\":2,\"1502\":2,\"1503\":1,\"1506\":2,\"1508\":2,\"1534\":2,\"1535\":2,\"1536\":1,\"1543\":2,\"1549\":2,\"1550\":2,\"1551\":1,\"1565\":2,\"1588\":1,\"1589\":4,\"1600\":2,\"1601\":1,\"1602\":2,\"1603\":2,\"1604\":2,\"1609\":1,\"1619\":2,\"1620\":2,\"1621\":1,\"1624\":2,\"1643\":1,\"1661\":2,\"1662\":2,\"1663\":1,\"1666\":2,\"1668\":2,\"1680\":1,\"1681\":4,\"1692\":2,\"1693\":1,\"1694\":2,\"1695\":2,\"1696\":2,\"1710\":2,\"1711\":2,\"1712\":1,\"1715\":2,\"1717\":2,\"1740\":2,\"1741\":2,\"1742\":1,\"1749\":2,\"1755\":2,\"1756\":2,\"1757\":1,\"1771\":2,\"1790\":1,\"1800\":2,\"1801\":2,\"1802\":1,\"1805\":2,\"1821\":1,\"1838\":2,\"1839\":2,\"1840\":1,\"1843\":2,\"1845\":2,\"1857\":1,\"1858\":4,\"1869\":2,\"1870\":1,\"1871\":2,\"1872\":2,\"1873\":2,\"1878\":1,\"1897\":2,\"1898\":2,\"1899\":1,\"1902\":2,\"1904\":2,\"1930\":2,\"1931\":2,\"1932\":1,\"1939\":2,\"1945\":2,\"1946\":2,\"1947\":1,\"1961\":2,\"1984\":1,\"1985\":4,\"1996\":2,\"1997\":1,\"1998\":2,\"1999\":2,\"2000\":2,\"2005\":1,\"2015\":2,\"2016\":2,\"2017\":1,\"2020\":2,\"2039\":1,\"2057\":2,\"2058\":2,\"2059\":1,\"2062\":2,\"2064\":2,\"2076\":1,\"2077\":4,\"2088\":2,\"2089\":1,\"2090\":2,\"2091\":2,\"2092\":2,\"2097\":1,\"2116\":2,\"2117\":2,\"2118\":1,\"2121\":2,\"2123\":2,\"2149\":2,\"2150\":2,\"2151\":1,\"2158\":2,\"2164\":2,\"2165\":2,\"2166\":1,\"2180\":2,\"2203\":1,\"2204\":4,\"2215\":2,\"2216\":1,\"2217\":2,\"2218\":2,\"2219\":2,\"2224\":1,\"2234\":2,\"2235\":2,\"2236\":1,\"2239\":2,\"2258\":1,\"2276\":2,\"2277\":2,\"2278\":1,\"2281\":2,\"2283\":2,\"2295\":1,\"2296\":4,\"2307\":2,\"2308\":1,\"2309\":2,\"2310\":2,\"2311\":2}}],[\"permanent\",{\"0\":{\"481\":1,\"482\":2,\"483\":1,\"634\":1,\"635\":2,\"636\":1,\"841\":1,\"842\":2,\"843\":1,\"1064\":1,\"1065\":2,\"1066\":1,\"1241\":1,\"1242\":2,\"1243\":1,\"1434\":1,\"1435\":2,\"1436\":1,\"1633\":1,\"1634\":2,\"1635\":1,\"1814\":1,\"1815\":2,\"1816\":1,\"2029\":1,\"2030\":2,\"2031\":1,\"2248\":1,\"2249\":2,\"2250\":1},\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"481\":3,\"482\":4,\"483\":3,\"616\":1,\"634\":3,\"635\":4,\"636\":3,\"717\":1,\"823\":1,\"841\":3,\"842\":4,\"843\":3,\"940\":1,\"1046\":1,\"1064\":3,\"1065\":4,\"1066\":3,\"1223\":1,\"1241\":3,\"1242\":4,\"1243\":3,\"1416\":1,\"1434\":3,\"1435\":4,\"1436\":3,\"1615\":1,\"1633\":3,\"1634\":4,\"1635\":3,\"1796\":1,\"1814\":3,\"1815\":4,\"1816\":3,\"2011\":1,\"2029\":3,\"2030\":4,\"2031\":3,\"2230\":1,\"2248\":3,\"2249\":4,\"2250\":3}}],[\"permissions\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"300\":1,\"326\":1,\"350\":1,\"372\":1,\"691\":1,\"717\":1,\"898\":1,\"940\":1}}],[\"permission\",{\"1\":{\"99\":1}}],[\"per\",{\"1\":{\"69\":1}}],[\"periodic\",{\"1\":{\"68\":1}}],[\"performs\",{\"1\":{\"69\":1,\"70\":1,\"71\":1}}],[\"performed\",{\"1\":{\"63\":1}}],[\"perform\",{\"1\":{\"49\":1,\"66\":1,\"88\":1,\"143\":1,\"166\":1,\"190\":1,\"226\":3,\"256\":3,\"286\":3,\"332\":3,\"378\":3,\"723\":3,\"946\":3}}],[\"person\",{\"1\":{\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"703\":1,\"926\":1}}],[\"personal\",{\"1\":{\"126\":1,\"137\":1,\"149\":1,\"160\":1,\"173\":1,\"184\":1,\"205\":1,\"220\":1,\"235\":1,\"250\":1,\"265\":1,\"280\":1,\"302\":6,\"311\":1,\"326\":1,\"352\":6,\"357\":1,\"372\":1,\"693\":6,\"702\":1,\"717\":1,\"900\":6,\"925\":1,\"940\":1}}],[\"personalized\",{\"1\":{\"27\":1}}],[\"persisted\",{\"1\":{\"54\":1}}],[\"persisting\",{\"1\":{\"53\":1}}],[\"perspective\",{\"1\":{\"10\":1,\"41\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"pdf\",{\"1\":{\"74\":1}}],[\"pdp\",{\"1\":{\"63\":2}}],[\"picture\",{\"1\":{\"61\":1}}],[\"ping\",{\"0\":{\"68\":1,\"69\":1,\"70\":1},\"1\":{\"35\":1,\"60\":1,\"66\":1,\"68\":3,\"69\":2,\"70\":4,\"71\":2,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"169\":1,\"193\":3,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"209\":2,\"229\":1,\"230\":1,\"233\":1,\"239\":2,\"259\":1,\"260\":1,\"263\":1,\"269\":2,\"289\":1,\"306\":1,\"309\":1,\"315\":2,\"335\":1,\"336\":1,\"339\":1,\"361\":2,\"381\":1,\"697\":1,\"700\":1,\"706\":2,\"726\":1,\"904\":1,\"907\":1,\"929\":1,\"949\":1}}],[\"pushing\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"pull\",{\"0\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1},\"1\":{\"293\":1,\"300\":2,\"301\":5,\"303\":2,\"305\":1,\"343\":1,\"350\":2,\"351\":5,\"353\":2,\"355\":1,\"684\":1,\"691\":2,\"692\":5,\"694\":2,\"696\":1,\"891\":1,\"898\":2,\"899\":5,\"901\":2,\"903\":1}}],[\"publish\",{\"1\":{\"61\":1}}],[\"publication\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"publications\",{\"0\":{\"38\":1,\"39\":1}}],[\"publicly\",{\"1\":{\"99\":1}}],[\"public\",{\"0\":{\"9\":1},\"1\":{\"15\":1,\"17\":1,\"98\":1,\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"purposes\",{\"1\":{\"55\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"punkt\",{\"1\":{\"31\":1}}],[\"pool\",{\"1\":{\"801\":1,\"802\":2,\"803\":1,\"1024\":1,\"1025\":2,\"1026\":1,\"1185\":1,\"1186\":2,\"1187\":1,\"1378\":1,\"1379\":2,\"1380\":1,\"1568\":1,\"1569\":2,\"1570\":1,\"1774\":1,\"1775\":2,\"1776\":1,\"1964\":1,\"1965\":2,\"1966\":1,\"2183\":1,\"2184\":2,\"2185\":1}}],[\"power\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"popup\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1}}],[\"potential\",{\"1\":{\"98\":1,\"99\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"point\",{\"1\":{\"63\":1,\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"723\":2,\"946\":2}}],[\"poses\",{\"1\":{\"89\":1}}],[\"postgresql\",{\"1\":{\"63\":2,\"387\":1,\"478\":1,\"538\":1,\"631\":1,\"756\":1,\"838\":1,\"979\":1,\"1061\":1,\"1140\":1,\"1238\":1,\"1333\":1,\"1431\":1,\"1520\":1,\"1630\":1,\"1729\":1,\"1811\":1,\"1916\":1,\"2026\":1,\"2135\":1,\"2245\":1}}],[\"possible\",{\"0\":{\"2\":1,\"51\":1},\"1\":{\"4\":1,\"58\":1,\"66\":3,\"99\":2,\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"847\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"ports\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"810\":1,\"852\":1,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1}}],[\"portion\",{\"1\":{\"83\":1}}],[\"port\",{\"0\":{\"421\":1,\"443\":1,\"465\":1,\"499\":1,\"511\":1,\"533\":1,\"572\":1,\"596\":1,\"650\":1,\"672\":1,\"729\":1,\"751\":1,\"790\":1,\"857\":1,\"879\":1,\"910\":1,\"952\":1,\"974\":1,\"1013\":1,\"1080\":1,\"1102\":1,\"1113\":1,\"1135\":1,\"1174\":1,\"1202\":1,\"1257\":1,\"1279\":1,\"1290\":1,\"1306\":1,\"1328\":1,\"1367\":1,\"1395\":1,\"1450\":1,\"1472\":1,\"1493\":1,\"1515\":1,\"1557\":1,\"1594\":1,\"1653\":1,\"1675\":1,\"1686\":1,\"1702\":1,\"1724\":1,\"1763\":1,\"1830\":1,\"1852\":1,\"1863\":1,\"1889\":1,\"1911\":1,\"1953\":1,\"1990\":1,\"2049\":1,\"2071\":1,\"2082\":1,\"2108\":1,\"2130\":1,\"2172\":1,\"2209\":1,\"2268\":1,\"2290\":1,\"2301\":1},\"1\":{\"63\":1,\"134\":1,\"137\":1,\"157\":1,\"160\":1,\"181\":1,\"184\":1,\"217\":1,\"220\":1,\"247\":1,\"250\":1,\"277\":1,\"280\":1,\"323\":1,\"326\":1,\"369\":1,\"372\":1,\"421\":2,\"437\":1,\"443\":2,\"465\":2,\"491\":1,\"499\":1,\"511\":2,\"533\":2,\"572\":2,\"588\":1,\"596\":1,\"645\":1,\"650\":2,\"672\":2,\"714\":1,\"717\":1,\"729\":2,\"751\":2,\"790\":2,\"810\":1,\"852\":1,\"857\":2,\"879\":2,\"910\":1,\"937\":1,\"940\":1,\"952\":2,\"974\":2,\"1013\":2,\"1033\":1,\"1075\":1,\"1080\":2,\"1102\":2,\"1113\":2,\"1135\":2,\"1174\":2,\"1194\":1,\"1202\":1,\"1252\":1,\"1257\":2,\"1279\":2,\"1290\":1,\"1306\":2,\"1328\":2,\"1367\":2,\"1387\":1,\"1395\":1,\"1445\":1,\"1450\":2,\"1472\":2,\"1493\":2,\"1515\":2,\"1557\":2,\"1581\":1,\"1594\":1,\"1648\":1,\"1653\":2,\"1675\":2,\"1686\":1,\"1702\":2,\"1724\":2,\"1763\":2,\"1783\":1,\"1825\":1,\"1830\":2,\"1852\":2,\"1863\":1,\"1889\":2,\"1911\":2,\"1953\":2,\"1977\":1,\"1990\":1,\"2044\":1,\"2049\":2,\"2071\":2,\"2082\":1,\"2108\":2,\"2130\":2,\"2172\":2,\"2196\":1,\"2209\":1,\"2263\":1,\"2268\":2,\"2290\":2,\"2301\":1}}],[\"portal\",{\"1\":{\"10\":1,\"55\":1,\"62\":1,\"88\":2,\"90\":1,\"126\":3,\"149\":3,\"173\":3,\"205\":3,\"235\":3,\"265\":3,\"311\":3,\"357\":3,\"702\":3,\"925\":3}}],[\"policy\",{\"0\":{\"96\":1},\"1\":{\"58\":1,\"63\":1,\"101\":1,\"102\":1}}],[\"pong\",{\"0\":{\"68\":1,\"71\":1},\"1\":{\"35\":1,\"60\":1,\"66\":1,\"68\":2,\"70\":2,\"71\":3,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"169\":1,\"193\":3,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"209\":2,\"229\":1,\"230\":1,\"233\":1,\"239\":2,\"259\":1,\"260\":1,\"263\":1,\"269\":2,\"289\":1,\"306\":1,\"309\":1,\"315\":2,\"335\":1,\"336\":1,\"339\":1,\"361\":2,\"381\":1,\"697\":1,\"700\":1,\"706\":2,\"726\":1,\"904\":1,\"907\":1,\"929\":1,\"949\":1}}],[\"play\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"place\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"304\":1,\"332\":1,\"354\":1,\"378\":1,\"695\":1,\"723\":1,\"902\":1,\"946\":1}}],[\"planning\",{\"1\":{\"84\":1}}],[\"planen\",{\"1\":{\"31\":1}}],[\"platform\",{\"1\":{\"39\":1,\"90\":1,\"91\":1}}],[\"plugin\",{\"0\":{\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"435\":1,\"586\":1,\"697\":1,\"807\":1,\"904\":1,\"1030\":1,\"1191\":1,\"1384\":1,\"1574\":1,\"1780\":1,\"1970\":1,\"2189\":1},\"1\":{\"10\":2,\"35\":1,\"54\":1,\"66\":3,\"68\":1,\"85\":1,\"105\":1,\"106\":1,\"107\":1,\"108\":1,\"109\":1,\"110\":1,\"111\":1,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"119\":5,\"121\":1,\"122\":5,\"123\":1,\"124\":1,\"129\":1,\"132\":1,\"134\":1,\"143\":1,\"144\":5,\"146\":1,\"147\":5,\"152\":1,\"155\":1,\"157\":1,\"166\":1,\"170\":1,\"171\":1,\"176\":1,\"179\":1,\"181\":1,\"190\":1,\"193\":3,\"194\":5,\"196\":1,\"197\":5,\"198\":5,\"200\":1,\"201\":5,\"202\":1,\"203\":1,\"212\":1,\"215\":1,\"217\":1,\"226\":2,\"230\":5,\"232\":1,\"233\":5,\"242\":1,\"245\":1,\"247\":1,\"256\":2,\"260\":5,\"262\":1,\"263\":5,\"272\":1,\"275\":1,\"277\":1,\"286\":2,\"305\":2,\"306\":5,\"308\":1,\"309\":5,\"318\":1,\"321\":1,\"323\":1,\"332\":2,\"336\":5,\"338\":1,\"339\":5,\"355\":2,\"364\":1,\"367\":1,\"369\":1,\"378\":2,\"394\":1,\"395\":1,\"396\":1,\"435\":1,\"545\":1,\"546\":1,\"547\":1,\"586\":1,\"617\":1,\"696\":2,\"697\":5,\"699\":1,\"700\":5,\"709\":1,\"712\":1,\"714\":1,\"723\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"807\":1,\"824\":1,\"903\":2,\"904\":5,\"906\":1,\"907\":5,\"928\":1,\"929\":3,\"932\":1,\"935\":1,\"937\":1,\"946\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1030\":1,\"1047\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1191\":1,\"1224\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1384\":1,\"1417\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1574\":1,\"1616\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1780\":1,\"1797\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1970\":1,\"2012\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2189\":1,\"2231\":1}}],[\"plugins\",{\"0\":{\"65\":1,\"120\":1,\"145\":1,\"195\":1,\"199\":1,\"208\":1,\"231\":1,\"238\":1,\"261\":1,\"268\":1,\"307\":1,\"314\":1,\"337\":1,\"360\":1,\"698\":1,\"705\":1,\"905\":1,\"928\":1},\"1\":{\"10\":3,\"20\":1,\"41\":1,\"44\":1,\"54\":1,\"66\":3,\"95\":2,\"122\":1,\"134\":1,\"138\":1,\"143\":2,\"147\":1,\"157\":1,\"161\":1,\"166\":2,\"181\":1,\"185\":1,\"190\":2,\"197\":1,\"201\":1,\"208\":1,\"217\":1,\"221\":1,\"226\":2,\"233\":1,\"238\":1,\"247\":1,\"251\":1,\"256\":2,\"263\":1,\"268\":1,\"277\":1,\"281\":1,\"286\":2,\"302\":1,\"305\":3,\"309\":1,\"314\":1,\"323\":1,\"327\":1,\"332\":2,\"339\":1,\"352\":1,\"355\":3,\"360\":1,\"369\":1,\"373\":1,\"378\":2,\"435\":1,\"586\":1,\"617\":1,\"693\":1,\"696\":3,\"700\":1,\"705\":1,\"714\":1,\"718\":1,\"723\":2,\"807\":1,\"824\":1,\"900\":1,\"903\":3,\"907\":1,\"928\":1,\"929\":2,\"937\":1,\"941\":1,\"946\":2,\"1030\":1,\"1047\":1,\"1191\":1,\"1224\":1,\"1384\":1,\"1417\":1,\"1574\":1,\"1616\":1,\"1780\":1,\"1797\":1,\"1970\":1,\"2012\":1,\"2189\":1,\"2231\":1}}],[\"please\",{\"1\":{\"6\":1,\"28\":2,\"35\":1,\"99\":2,\"102\":1,\"125\":1,\"126\":2,\"128\":1,\"129\":1,\"134\":1,\"139\":1,\"140\":2,\"143\":3,\"148\":1,\"149\":2,\"151\":1,\"152\":1,\"157\":1,\"162\":1,\"163\":2,\"166\":3,\"167\":1,\"172\":1,\"173\":2,\"175\":1,\"176\":1,\"181\":1,\"186\":1,\"187\":2,\"190\":3,\"191\":1,\"193\":1,\"205\":1,\"207\":1,\"217\":1,\"222\":1,\"223\":2,\"226\":5,\"227\":1,\"237\":1,\"247\":1,\"252\":1,\"253\":2,\"256\":5,\"267\":1,\"277\":1,\"282\":1,\"283\":2,\"286\":5,\"302\":1,\"303\":2,\"305\":3,\"313\":1,\"323\":1,\"328\":1,\"329\":2,\"332\":5,\"352\":1,\"353\":2,\"355\":3,\"359\":1,\"369\":1,\"374\":1,\"375\":2,\"378\":5,\"382\":1,\"466\":1,\"693\":1,\"694\":2,\"696\":3,\"704\":1,\"714\":1,\"719\":1,\"720\":2,\"723\":5,\"900\":1,\"901\":2,\"903\":3,\"927\":1,\"937\":1,\"942\":1,\"943\":2,\"946\":5}}],[\"pleased\",{\"1\":{\"1\":1}}],[\"pass\",{\"0\":{\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1}}],[\"passwords\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"password\",{\"0\":{\"385\":2,\"389\":2,\"392\":2,\"399\":2,\"415\":2,\"420\":2,\"426\":2,\"438\":2,\"453\":2,\"462\":2,\"469\":2,\"476\":2,\"480\":2,\"482\":2,\"492\":2,\"521\":2,\"530\":2,\"536\":2,\"540\":2,\"543\":2,\"550\":2,\"566\":2,\"571\":2,\"577\":2,\"589\":2,\"622\":2,\"629\":2,\"633\":2,\"635\":2,\"646\":2,\"660\":2,\"669\":2,\"739\":2,\"748\":2,\"754\":2,\"758\":2,\"761\":2,\"769\":2,\"784\":2,\"789\":2,\"795\":2,\"811\":2,\"829\":2,\"836\":2,\"840\":2,\"842\":2,\"853\":2,\"867\":2,\"876\":2,\"962\":2,\"971\":2,\"977\":2,\"981\":2,\"984\":2,\"992\":2,\"1007\":2,\"1012\":2,\"1018\":2,\"1034\":2,\"1052\":2,\"1059\":2,\"1063\":2,\"1065\":2,\"1076\":2,\"1090\":2,\"1099\":2,\"1123\":2,\"1132\":2,\"1138\":2,\"1142\":2,\"1145\":2,\"1153\":2,\"1168\":2,\"1173\":2,\"1179\":2,\"1195\":2,\"1229\":2,\"1236\":2,\"1240\":2,\"1242\":2,\"1253\":2,\"1267\":2,\"1276\":2,\"1316\":2,\"1325\":2,\"1331\":2,\"1335\":2,\"1338\":2,\"1346\":2,\"1361\":2,\"1366\":2,\"1372\":2,\"1388\":2,\"1422\":2,\"1429\":2,\"1433\":2,\"1435\":2,\"1446\":2,\"1460\":2,\"1469\":2,\"1503\":2,\"1512\":2,\"1518\":2,\"1522\":2,\"1525\":2,\"1536\":2,\"1551\":2,\"1556\":2,\"1562\":2,\"1582\":2,\"1621\":2,\"1628\":2,\"1632\":2,\"1634\":2,\"1649\":2,\"1663\":2,\"1672\":2,\"1712\":2,\"1721\":2,\"1727\":2,\"1731\":2,\"1734\":2,\"1742\":2,\"1757\":2,\"1762\":2,\"1768\":2,\"1784\":2,\"1802\":2,\"1809\":2,\"1813\":2,\"1815\":2,\"1826\":2,\"1840\":2,\"1849\":2,\"1899\":2,\"1908\":2,\"1914\":2,\"1918\":2,\"1921\":2,\"1932\":2,\"1947\":2,\"1952\":2,\"1958\":2,\"1978\":2,\"2017\":2,\"2024\":2,\"2028\":2,\"2030\":2,\"2045\":2,\"2059\":2,\"2068\":2,\"2118\":2,\"2127\":2,\"2133\":2,\"2137\":2,\"2140\":2,\"2151\":2,\"2166\":2,\"2171\":2,\"2177\":2,\"2197\":2,\"2236\":2,\"2243\":2,\"2247\":2,\"2249\":2,\"2264\":2,\"2278\":2,\"2287\":2},\"1\":{\"137\":14,\"138\":14,\"160\":14,\"161\":14,\"184\":14,\"185\":14,\"220\":14,\"221\":14,\"250\":14,\"251\":14,\"280\":14,\"281\":14,\"326\":14,\"327\":14,\"372\":14,\"373\":14,\"385\":4,\"389\":4,\"392\":4,\"398\":2,\"399\":4,\"414\":2,\"415\":4,\"420\":4,\"426\":4,\"430\":1,\"438\":4,\"452\":2,\"453\":4,\"462\":2,\"468\":2,\"469\":4,\"476\":4,\"480\":4,\"482\":4,\"492\":4,\"520\":2,\"521\":4,\"530\":2,\"536\":4,\"540\":4,\"543\":4,\"549\":2,\"550\":4,\"565\":2,\"566\":4,\"571\":4,\"577\":4,\"581\":1,\"589\":4,\"621\":2,\"622\":4,\"629\":4,\"633\":4,\"635\":4,\"646\":4,\"659\":2,\"660\":4,\"669\":2,\"717\":14,\"718\":14,\"738\":2,\"739\":4,\"748\":2,\"754\":4,\"758\":4,\"761\":4,\"768\":2,\"769\":4,\"783\":2,\"784\":4,\"789\":4,\"795\":4,\"799\":1,\"811\":4,\"828\":2,\"829\":4,\"836\":4,\"840\":4,\"842\":4,\"853\":4,\"866\":2,\"867\":4,\"876\":2,\"940\":14,\"941\":14,\"961\":2,\"962\":4,\"971\":2,\"977\":4,\"981\":4,\"984\":4,\"991\":2,\"992\":4,\"1006\":2,\"1007\":4,\"1012\":4,\"1018\":4,\"1022\":1,\"1034\":4,\"1051\":2,\"1052\":4,\"1059\":4,\"1063\":4,\"1065\":4,\"1076\":4,\"1089\":2,\"1090\":4,\"1099\":2,\"1122\":2,\"1123\":4,\"1132\":2,\"1138\":4,\"1142\":4,\"1145\":4,\"1152\":2,\"1153\":4,\"1167\":2,\"1168\":4,\"1173\":4,\"1179\":4,\"1183\":1,\"1195\":4,\"1228\":2,\"1229\":4,\"1236\":4,\"1240\":4,\"1242\":4,\"1253\":4,\"1266\":2,\"1267\":4,\"1276\":2,\"1315\":2,\"1316\":4,\"1325\":2,\"1331\":4,\"1335\":4,\"1338\":4,\"1345\":2,\"1346\":4,\"1360\":2,\"1361\":4,\"1366\":4,\"1372\":4,\"1376\":1,\"1388\":4,\"1421\":2,\"1422\":4,\"1429\":4,\"1433\":4,\"1435\":4,\"1446\":4,\"1459\":2,\"1460\":4,\"1469\":2,\"1502\":2,\"1503\":4,\"1512\":2,\"1518\":4,\"1522\":4,\"1525\":4,\"1535\":2,\"1536\":4,\"1550\":2,\"1551\":4,\"1556\":4,\"1562\":4,\"1566\":1,\"1582\":4,\"1620\":2,\"1621\":4,\"1628\":4,\"1632\":4,\"1634\":4,\"1649\":4,\"1662\":2,\"1663\":4,\"1672\":2,\"1711\":2,\"1712\":4,\"1721\":2,\"1727\":4,\"1731\":4,\"1734\":4,\"1741\":2,\"1742\":4,\"1756\":2,\"1757\":4,\"1762\":4,\"1768\":4,\"1772\":1,\"1784\":4,\"1801\":2,\"1802\":4,\"1809\":4,\"1813\":4,\"1815\":4,\"1826\":4,\"1839\":2,\"1840\":4,\"1849\":2,\"1898\":2,\"1899\":4,\"1908\":2,\"1914\":4,\"1918\":4,\"1921\":4,\"1931\":2,\"1932\":4,\"1946\":2,\"1947\":4,\"1952\":4,\"1958\":4,\"1962\":1,\"1978\":4,\"2016\":2,\"2017\":4,\"2024\":4,\"2028\":4,\"2030\":4,\"2045\":4,\"2058\":2,\"2059\":4,\"2068\":2,\"2117\":2,\"2118\":4,\"2127\":2,\"2133\":4,\"2137\":4,\"2140\":4,\"2150\":2,\"2151\":4,\"2165\":2,\"2166\":4,\"2171\":4,\"2177\":4,\"2181\":1,\"2197\":4,\"2235\":2,\"2236\":4,\"2243\":4,\"2247\":4,\"2249\":4,\"2264\":4,\"2277\":2,\"2278\":4,\"2287\":2}}],[\"payload=application\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"pandemic\",{\"1\":{\"91\":1}}],[\"parallel\",{\"1\":{\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1}}],[\"paramters\",{\"1\":{\"142\":1}}],[\"parameter\",{\"0\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"677\":1,\"777\":1,\"781\":1,\"884\":1,\"1000\":1,\"1004\":1,\"1107\":1,\"1161\":1,\"1165\":1,\"1284\":1,\"1354\":1,\"1358\":1,\"1477\":1,\"1544\":1,\"1548\":1,\"1588\":1,\"1680\":1,\"1750\":1,\"1754\":1,\"1857\":1,\"1940\":1,\"1944\":1,\"1984\":1,\"2076\":1,\"2159\":1,\"2163\":1,\"2203\":1,\"2295\":1},\"1\":{\"137\":1,\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"407\":1,\"412\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"558\":1,\"563\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"610\":3,\"674\":1,\"675\":1,\"676\":2,\"677\":3,\"723\":2,\"777\":1,\"781\":1,\"817\":3,\"881\":1,\"882\":1,\"883\":2,\"884\":3,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"946\":2,\"1000\":1,\"1004\":1,\"1040\":3,\"1104\":1,\"1105\":1,\"1106\":2,\"1107\":3,\"1161\":1,\"1165\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1217\":3,\"1281\":1,\"1282\":1,\"1283\":2,\"1284\":3,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1354\":1,\"1358\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1410\":3,\"1474\":1,\"1475\":1,\"1476\":2,\"1477\":3,\"1482\":2,\"1544\":1,\"1548\":1,\"1580\":1,\"1586\":1,\"1587\":1,\"1588\":3,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1609\":3,\"1647\":1,\"1677\":1,\"1678\":1,\"1679\":2,\"1680\":3,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1750\":1,\"1754\":1,\"1790\":3,\"1854\":1,\"1855\":1,\"1856\":2,\"1857\":3,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1878\":2,\"1940\":1,\"1944\":1,\"1976\":1,\"1982\":1,\"1983\":1,\"1984\":3,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2005\":3,\"2043\":1,\"2073\":1,\"2074\":1,\"2075\":2,\"2076\":3,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2097\":2,\"2159\":1,\"2163\":1,\"2195\":1,\"2201\":1,\"2202\":1,\"2203\":3,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2224\":3,\"2262\":1,\"2292\":1,\"2293\":1,\"2294\":2,\"2295\":3,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"parameters\",{\"0\":{\"382\":1,\"441\":1,\"466\":1,\"495\":1,\"497\":1,\"509\":1,\"594\":1,\"619\":1,\"727\":1,\"826\":1,\"908\":1,\"950\":1,\"1049\":1,\"1111\":1,\"1200\":1,\"1226\":1,\"1288\":1,\"1304\":1,\"1393\":1,\"1419\":1,\"1491\":1,\"1592\":1,\"1618\":1,\"1684\":1,\"1700\":1,\"1799\":1,\"1861\":1,\"1887\":1,\"1988\":1,\"2014\":1,\"2080\":1,\"2106\":1,\"2207\":1,\"2233\":1,\"2299\":1},\"1\":{\"76\":1,\"77\":1,\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"165\":3,\"184\":2,\"185\":1,\"189\":3,\"220\":2,\"221\":1,\"225\":3,\"250\":2,\"251\":1,\"255\":3,\"280\":2,\"281\":1,\"285\":3,\"326\":2,\"327\":1,\"331\":4,\"372\":2,\"373\":1,\"377\":3,\"382\":1,\"466\":1,\"496\":4,\"593\":1,\"608\":1,\"675\":1,\"680\":1,\"717\":2,\"718\":1,\"722\":4,\"815\":1,\"882\":1,\"887\":1,\"923\":1,\"940\":2,\"941\":1,\"945\":4,\"1038\":1,\"1105\":1,\"1110\":1,\"1199\":1,\"1215\":1,\"1282\":1,\"1287\":1,\"1303\":1,\"1392\":1,\"1408\":1,\"1475\":1,\"1480\":1,\"1587\":1,\"1591\":1,\"1607\":1,\"1678\":1,\"1683\":1,\"1699\":1,\"1788\":1,\"1855\":1,\"1860\":1,\"1876\":1,\"1983\":1,\"1987\":1,\"2003\":1,\"2074\":1,\"2079\":1,\"2095\":1,\"2202\":1,\"2206\":1,\"2222\":1,\"2293\":1,\"2298\":1,\"2314\":1}}],[\"parent\",{\"1\":{\"49\":2}}],[\"parts\",{\"1\":{\"61\":1}}],[\"parties\",{\"1\":{\"49\":1}}],[\"participants\",{\"1\":{\"80\":2,\"81\":1}}],[\"participating\",{\"1\":{\"0\":1,\"23\":1,\"52\":1,\"73\":1,\"74\":1}}],[\"particular\",{\"1\":{\"10\":2,\"11\":1,\"84\":1}}],[\"part\",{\"1\":{\"13\":1,\"21\":1,\"63\":1,\"68\":1,\"90\":1,\"91\":2,\"129\":2,\"152\":2,\"176\":2,\"192\":1,\"193\":1,\"212\":1,\"242\":1,\"272\":1,\"305\":2,\"318\":1,\"355\":2,\"364\":1,\"696\":2,\"709\":1,\"903\":2,\"932\":1}}],[\"partner\",{\"0\":{\"12\":1},\"1\":{\"17\":1,\"62\":1}}],[\"partners\",{\"1\":{\"11\":1,\"49\":1,\"62\":1,\"73\":1,\"126\":1,\"134\":4,\"149\":1,\"157\":4,\"173\":1,\"181\":4,\"205\":1,\"217\":4,\"235\":1,\"247\":4,\"265\":1,\"277\":4,\"311\":1,\"323\":4,\"357\":1,\"369\":4,\"702\":1,\"714\":4,\"925\":1,\"937\":4}}],[\"party\",{\"1\":{\"11\":1,\"39\":1,\"49\":1}}],[\"path\",{\"0\":{\"447\":1,\"463\":1,\"515\":1,\"531\":1,\"654\":1,\"670\":1,\"733\":1,\"749\":1,\"861\":1,\"877\":1,\"915\":1,\"956\":1,\"972\":1,\"1084\":1,\"1100\":1,\"1117\":1,\"1133\":1,\"1207\":1,\"1261\":1,\"1277\":1,\"1295\":1,\"1310\":1,\"1326\":1,\"1400\":1,\"1454\":1,\"1470\":1,\"1497\":1,\"1513\":1,\"1599\":1,\"1657\":1,\"1673\":1,\"1691\":1,\"1706\":1,\"1722\":1,\"1834\":1,\"1850\":1,\"1868\":1,\"1893\":1,\"1909\":1,\"1995\":1,\"2053\":1,\"2069\":1,\"2087\":1,\"2112\":1,\"2128\":1,\"2214\":1,\"2272\":1,\"2288\":1,\"2306\":1},\"1\":{\"446\":1,\"447\":2,\"463\":2,\"514\":1,\"515\":2,\"531\":2,\"653\":1,\"654\":2,\"670\":2,\"675\":2,\"732\":1,\"733\":2,\"749\":2,\"860\":1,\"861\":2,\"877\":2,\"882\":2,\"915\":2,\"955\":1,\"956\":2,\"972\":2,\"1083\":1,\"1084\":2,\"1100\":2,\"1105\":2,\"1116\":1,\"1117\":2,\"1133\":2,\"1207\":2,\"1260\":1,\"1261\":2,\"1277\":2,\"1282\":2,\"1295\":2,\"1309\":1,\"1310\":2,\"1326\":2,\"1400\":2,\"1453\":1,\"1454\":2,\"1470\":2,\"1475\":2,\"1496\":1,\"1497\":2,\"1513\":2,\"1587\":2,\"1599\":2,\"1656\":1,\"1657\":2,\"1673\":2,\"1678\":2,\"1691\":2,\"1705\":1,\"1706\":2,\"1722\":2,\"1833\":1,\"1834\":2,\"1850\":2,\"1855\":2,\"1868\":2,\"1892\":1,\"1893\":2,\"1909\":2,\"1983\":2,\"1995\":2,\"2052\":1,\"2053\":2,\"2069\":2,\"2074\":2,\"2087\":2,\"2111\":1,\"2112\":2,\"2128\":2,\"2202\":2,\"2214\":2,\"2271\":1,\"2272\":2,\"2288\":2,\"2293\":2,\"2306\":2}}],[\"patches\",{\"1\":{\"73\":1,\"100\":1}}],[\"patchen\",{\"1\":{\"29\":1}}],[\"patients\",{\"1\":{\"88\":1}}],[\"patient\",{\"1\":{\"11\":2,\"14\":1,\"59\":1,\"62\":2,\"63\":4}}],[\"pause\",{\"1\":{\"29\":1}}],[\"pages\",{\"1\":{\"95\":1,\"129\":1,\"134\":1,\"152\":1,\"157\":1,\"176\":1,\"181\":1,\"212\":1,\"217\":1,\"242\":1,\"247\":1,\"272\":1,\"277\":1,\"291\":1,\"318\":1,\"323\":1,\"341\":1,\"364\":1,\"369\":1,\"682\":1,\"709\":1,\"714\":1,\"889\":1,\"932\":1,\"937\":1}}],[\"page\",{\"0\":{\"488\":1,\"642\":1,\"849\":1,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1},\"1\":{\"27\":1,\"63\":1,\"99\":1,\"160\":2,\"161\":1,\"184\":2,\"185\":1,\"220\":2,\"221\":1,\"250\":2,\"251\":1,\"280\":2,\"281\":1,\"306\":1,\"326\":2,\"327\":1,\"336\":1,\"372\":2,\"373\":1,\"488\":2,\"610\":1,\"642\":2,\"677\":1,\"697\":1,\"717\":2,\"718\":1,\"817\":1,\"849\":2,\"884\":1,\"904\":1,\"940\":2,\"941\":1,\"1040\":1,\"1072\":2,\"1107\":1,\"1217\":1,\"1249\":2,\"1284\":1,\"1410\":1,\"1442\":2,\"1477\":1,\"1482\":1,\"1588\":1,\"1609\":1,\"1644\":2,\"1680\":1,\"1790\":1,\"1822\":2,\"1857\":1,\"1878\":1,\"1984\":1,\"2005\":1,\"2040\":2,\"2076\":1,\"2097\":1,\"2203\":1,\"2224\":1,\"2259\":2,\"2295\":1}}],[\"paper\",{\"1\":{\"1\":2}}],[\"pseudonymization\",{\"1\":{\"0\":1,\"11\":1,\"21\":1}}],[\"pseudonymize\",{\"1\":{\"0\":1,\"62\":1}}],[\"practionier\",{\"1\":{\"1489\":1,\"1885\":1,\"2104\":1}}],[\"practitioner\",{\"0\":{\"615\":1,\"617\":1,\"822\":1,\"824\":1,\"1045\":1,\"1047\":1,\"1222\":1,\"1224\":1,\"1415\":1,\"1417\":1,\"1487\":1,\"1489\":1,\"1614\":1,\"1616\":1,\"1795\":1,\"1797\":1,\"1883\":1,\"1885\":1,\"2010\":1,\"2012\":1,\"2102\":1,\"2104\":1,\"2229\":1,\"2231\":1},\"1\":{\"617\":3,\"618\":4,\"824\":3,\"825\":4,\"1047\":3,\"1048\":4,\"1224\":3,\"1225\":4,\"1417\":3,\"1418\":4,\"1616\":3,\"1617\":4,\"1797\":3,\"1798\":4,\"2012\":3,\"2013\":4,\"2231\":3,\"2232\":4}}],[\"praktische\",{\"1\":{\"29\":1}}],[\"previously\",{\"1\":{\"436\":1,\"587\":1,\"808\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"previous\",{\"1\":{\"418\":1,\"569\":1,\"787\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\"prevent\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"preferences\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"prefixes\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"pre\",{\"1\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"preparation\",{\"1\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"prepared\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"prepare\",{\"0\":{\"136\":1,\"159\":1,\"183\":1,\"219\":1,\"249\":1,\"279\":1,\"325\":1,\"371\":1,\"716\":1,\"939\":1}}],[\"prerequisites\",{\"0\":{\"127\":1,\"130\":1,\"150\":1,\"153\":1,\"174\":1,\"177\":1,\"206\":1,\"213\":1,\"236\":1,\"243\":1,\"266\":1,\"273\":1,\"312\":1,\"319\":1,\"358\":1,\"365\":1,\"703\":1,\"710\":1,\"926\":1,\"930\":1,\"933\":1},\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"predefined\",{\"1\":{\"69\":2}}],[\"prescriptions\",{\"1\":{\"88\":1}}],[\"president\",{\"1\":{\"1\":1}}],[\"present\",{\"1\":{\"81\":3,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"presentation\",{\"1\":{\"1\":1}}],[\"presented\",{\"1\":{\"1\":2}}],[\"preserving\",{\"1\":{\"0\":1}}],[\"präsentation\",{\"1\":{\"29\":1}}],[\"prior\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"prioritizes\",{\"1\":{\"20\":1}}],[\"print\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"principles\",{\"1\":{\"98\":1}}],[\"private\",{\"0\":{\"398\":1,\"399\":2,\"414\":1,\"415\":2,\"452\":1,\"453\":2,\"468\":1,\"469\":2,\"520\":1,\"521\":2,\"549\":1,\"550\":2,\"565\":1,\"566\":2,\"621\":1,\"622\":2,\"659\":1,\"660\":2,\"738\":1,\"739\":2,\"768\":1,\"769\":2,\"783\":1,\"784\":2,\"828\":1,\"829\":2,\"866\":1,\"867\":2,\"961\":1,\"962\":2,\"991\":1,\"992\":2,\"1006\":1,\"1007\":2,\"1051\":1,\"1052\":2,\"1089\":1,\"1090\":2,\"1122\":1,\"1123\":2,\"1152\":1,\"1153\":2,\"1167\":1,\"1168\":2,\"1228\":1,\"1229\":2,\"1266\":1,\"1267\":2,\"1315\":1,\"1316\":2,\"1345\":1,\"1346\":2,\"1360\":1,\"1361\":2,\"1421\":1,\"1422\":2,\"1459\":1,\"1460\":2,\"1502\":1,\"1503\":2,\"1535\":1,\"1536\":2,\"1550\":1,\"1551\":2,\"1620\":1,\"1621\":2,\"1662\":1,\"1663\":2,\"1711\":1,\"1712\":2,\"1741\":1,\"1742\":2,\"1756\":1,\"1757\":2,\"1801\":1,\"1802\":2,\"1839\":1,\"1840\":2,\"1898\":1,\"1899\":2,\"1931\":1,\"1932\":2,\"1946\":1,\"1947\":2,\"2016\":1,\"2017\":2,\"2058\":1,\"2059\":2,\"2117\":1,\"2118\":2,\"2150\":1,\"2151\":2,\"2165\":1,\"2166\":2,\"2235\":1,\"2236\":2,\"2277\":1,\"2278\":2},\"1\":{\"136\":5,\"137\":11,\"138\":10,\"159\":5,\"160\":11,\"161\":10,\"183\":5,\"184\":11,\"185\":10,\"219\":5,\"220\":11,\"221\":10,\"249\":5,\"250\":11,\"251\":10,\"279\":5,\"280\":11,\"281\":10,\"325\":5,\"326\":11,\"327\":10,\"371\":5,\"372\":11,\"373\":10,\"398\":6,\"399\":4,\"414\":6,\"415\":4,\"425\":1,\"452\":6,\"453\":4,\"461\":1,\"462\":1,\"468\":6,\"469\":4,\"508\":1,\"520\":6,\"521\":4,\"529\":1,\"530\":1,\"549\":6,\"550\":4,\"565\":6,\"566\":4,\"576\":1,\"605\":1,\"621\":6,\"622\":4,\"659\":6,\"660\":4,\"668\":1,\"669\":1,\"716\":5,\"717\":11,\"718\":10,\"738\":6,\"739\":4,\"747\":1,\"748\":1,\"768\":6,\"769\":4,\"783\":6,\"784\":4,\"794\":1,\"828\":6,\"829\":4,\"866\":6,\"867\":4,\"875\":1,\"876\":1,\"920\":1,\"939\":5,\"940\":11,\"941\":10,\"961\":6,\"962\":4,\"970\":1,\"971\":1,\"991\":6,\"992\":4,\"1006\":6,\"1007\":4,\"1017\":1,\"1051\":6,\"1052\":4,\"1089\":6,\"1090\":4,\"1098\":1,\"1099\":1,\"1122\":6,\"1123\":4,\"1131\":1,\"1132\":1,\"1152\":6,\"1153\":4,\"1167\":6,\"1168\":4,\"1178\":1,\"1212\":1,\"1228\":6,\"1229\":4,\"1266\":6,\"1267\":4,\"1275\":1,\"1276\":1,\"1300\":1,\"1315\":6,\"1316\":4,\"1324\":1,\"1325\":1,\"1345\":6,\"1346\":4,\"1360\":6,\"1361\":4,\"1371\":1,\"1405\":1,\"1421\":6,\"1422\":4,\"1459\":6,\"1460\":4,\"1468\":1,\"1469\":1,\"1502\":6,\"1503\":4,\"1511\":1,\"1512\":1,\"1535\":6,\"1536\":4,\"1550\":6,\"1551\":4,\"1561\":1,\"1604\":1,\"1620\":6,\"1621\":4,\"1662\":6,\"1663\":4,\"1671\":1,\"1672\":1,\"1696\":1,\"1711\":6,\"1712\":4,\"1720\":1,\"1721\":1,\"1741\":6,\"1742\":4,\"1756\":6,\"1757\":4,\"1767\":1,\"1801\":6,\"1802\":4,\"1839\":6,\"1840\":4,\"1848\":1,\"1849\":1,\"1873\":1,\"1898\":6,\"1899\":4,\"1907\":1,\"1908\":1,\"1931\":6,\"1932\":4,\"1946\":6,\"1947\":4,\"1957\":1,\"2000\":1,\"2016\":6,\"2017\":4,\"2058\":6,\"2059\":4,\"2067\":1,\"2068\":1,\"2092\":1,\"2117\":6,\"2118\":4,\"2126\":1,\"2127\":1,\"2150\":6,\"2151\":4,\"2165\":6,\"2166\":4,\"2176\":1,\"2219\":1,\"2235\":6,\"2236\":4,\"2277\":6,\"2278\":4,\"2286\":1,\"2287\":1,\"2311\":1}}],[\"privacy\",{\"1\":{\"0\":1,\"91\":1}}],[\"primary\",{\"1\":{\"62\":1,\"89\":1}}],[\"primarily\",{\"1\":{\"24\":1}}],[\"primär\",{\"1\":{\"31\":1}}],[\"properties\",{\"1\":{\"611\":1,\"614\":1,\"818\":1,\"821\":1,\"1041\":1,\"1044\":1,\"1218\":1,\"1221\":1,\"1411\":1,\"1414\":1,\"1483\":1,\"1486\":1,\"1610\":1,\"1613\":1,\"1791\":1,\"1794\":1,\"1879\":1,\"1882\":1,\"2006\":1,\"2009\":1,\"2098\":1,\"2101\":1,\"2225\":1,\"2228\":1}}],[\"property\",{\"1\":{\"383\":1,\"384\":1,\"385\":1,\"386\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":1,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":1,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":1,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":1,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":1,\"439\":1,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":1,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"469\":1,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":1,\"477\":1,\"478\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":1,\"493\":1,\"494\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":1,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":1,\"537\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":1,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":1,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":1,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":1,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":1,\"590\":1,\"591\":1,\"612\":1,\"613\":2,\"616\":1,\"617\":1,\"620\":1,\"621\":1,\"622\":1,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":1,\"630\":1,\"631\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":1,\"647\":1,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":1,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"671\":1,\"672\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":1,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":1,\"755\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":1,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":1,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":1,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":1,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":1,\"812\":1,\"813\":1,\"819\":1,\"820\":2,\"823\":1,\"824\":1,\"827\":1,\"828\":1,\"829\":1,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":1,\"837\":1,\"838\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":1,\"854\":1,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":1,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"878\":1,\"879\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":1,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":1,\"978\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":1,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":1,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":1,\"1035\":1,\"1036\":1,\"1042\":1,\"1043\":2,\"1046\":1,\"1047\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":1,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":1,\"1077\":1,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":1,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":1,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":1,\"1196\":1,\"1197\":1,\"1219\":1,\"1220\":2,\"1223\":1,\"1224\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":1,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":1,\"1254\":1,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":1,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":1,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":1,\"1389\":1,\"1390\":1,\"1412\":1,\"1413\":2,\"1416\":1,\"1417\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":1,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":1,\"1447\":1,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1484\":1,\"1485\":2,\"1488\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":1,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":1,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":1,\"1583\":1,\"1584\":1,\"1611\":1,\"1612\":2,\"1615\":1,\"1616\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":1,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":1,\"1650\":1,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":1,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":1,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":1,\"1785\":1,\"1786\":1,\"1792\":1,\"1793\":2,\"1796\":1,\"1797\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":1,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":1,\"1827\":1,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1880\":1,\"1881\":2,\"1884\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":1,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":1,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":1,\"1979\":1,\"1980\":1,\"2007\":1,\"2008\":2,\"2011\":1,\"2012\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":1,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":1,\"2046\":1,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2099\":1,\"2100\":2,\"2103\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":1,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":1,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":1,\"2198\":1,\"2199\":1,\"2226\":1,\"2227\":2,\"2230\":1,\"2231\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":1,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":1,\"2265\":1,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2289\":1,\"2290\":1}}],[\"properly\",{\"1\":{\"296\":1,\"346\":1,\"687\":1,\"894\":1}}],[\"proposed\",{\"1\":{\"305\":3,\"355\":3,\"696\":3,\"903\":3}}],[\"propose\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"proactive\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"proceeding\",{\"1\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"process|x\",{\"1\":{\"804\":1,\"808\":1,\"1027\":1,\"1031\":1,\"1188\":1,\"1192\":1,\"1381\":1,\"1385\":1,\"1571\":1,\"1575\":1,\"1777\":1,\"1781\":1,\"1967\":1,\"1971\":1,\"2186\":1,\"2190\":1}}],[\"processed\",{\"1\":{\"23\":1}}],[\"processes\",{\"0\":{\"23\":1,\"122\":1,\"147\":1,\"197\":1,\"201\":1,\"209\":1,\"210\":1,\"211\":1,\"233\":1,\"239\":1,\"240\":1,\"241\":1,\"263\":1,\"269\":1,\"270\":1,\"271\":1,\"309\":1,\"315\":1,\"316\":1,\"317\":1,\"339\":1,\"361\":1,\"362\":1,\"363\":1,\"700\":1,\"706\":1,\"707\":1,\"708\":1,\"907\":1},\"1\":{\"0\":2,\"13\":1,\"21\":1,\"39\":2,\"41\":1,\"42\":1,\"49\":1,\"52\":1,\"54\":2,\"58\":1,\"60\":3,\"61\":2,\"62\":2,\"63\":2,\"67\":1,\"80\":3,\"81\":4,\"84\":2,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"119\":1,\"121\":1,\"124\":1,\"126\":1,\"144\":1,\"146\":1,\"149\":1,\"171\":1,\"173\":1,\"194\":1,\"196\":1,\"198\":1,\"200\":1,\"203\":1,\"205\":1,\"211\":1,\"226\":1,\"230\":1,\"232\":1,\"235\":1,\"241\":1,\"256\":1,\"260\":1,\"262\":1,\"265\":1,\"271\":1,\"286\":1,\"305\":1,\"306\":1,\"308\":1,\"311\":1,\"317\":1,\"332\":1,\"336\":1,\"338\":1,\"355\":1,\"357\":1,\"363\":1,\"378\":1,\"388\":1,\"389\":1,\"390\":1,\"432\":1,\"436\":1,\"539\":1,\"540\":1,\"541\":1,\"583\":1,\"587\":1,\"617\":1,\"696\":1,\"697\":1,\"699\":1,\"702\":1,\"708\":1,\"723\":1,\"757\":1,\"758\":1,\"759\":1,\"804\":1,\"808\":1,\"809\":1,\"824\":1,\"903\":1,\"904\":1,\"906\":1,\"925\":1,\"946\":1,\"980\":1,\"981\":1,\"982\":1,\"1027\":1,\"1031\":1,\"1032\":1,\"1047\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1188\":1,\"1192\":1,\"1193\":1,\"1224\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1381\":1,\"1385\":1,\"1386\":1,\"1417\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1571\":1,\"1575\":1,\"1576\":1,\"1616\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1777\":1,\"1781\":1,\"1782\":1,\"1797\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1967\":1,\"1971\":1,\"1972\":1,\"2012\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2186\":1,\"2190\":1,\"2191\":1,\"2231\":1}}],[\"process\",{\"0\":{\"54\":1,\"65\":1,\"68\":1,\"69\":1,\"70\":1,\"71\":1,\"77\":1,\"78\":1,\"89\":1,\"92\":1,\"119\":1,\"120\":1,\"144\":1,\"145\":1,\"194\":1,\"195\":1,\"198\":1,\"199\":1,\"230\":1,\"231\":1,\"260\":1,\"261\":1,\"301\":1,\"306\":1,\"307\":1,\"336\":1,\"337\":1,\"351\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"692\":1,\"697\":1,\"698\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"899\":1,\"904\":1,\"905\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1},\"1\":{\"0\":3,\"20\":2,\"23\":1,\"32\":1,\"35\":3,\"37\":1,\"39\":1,\"41\":1,\"44\":1,\"52\":3,\"54\":2,\"60\":6,\"61\":3,\"62\":2,\"63\":2,\"66\":8,\"67\":1,\"68\":4,\"69\":2,\"70\":1,\"71\":1,\"74\":1,\"77\":1,\"81\":2,\"85\":1,\"88\":1,\"89\":3,\"90\":2,\"92\":3,\"95\":2,\"105\":1,\"106\":1,\"107\":1,\"108\":1,\"109\":1,\"110\":1,\"111\":1,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"119\":3,\"121\":1,\"122\":2,\"123\":1,\"124\":1,\"129\":2,\"134\":2,\"138\":1,\"143\":3,\"144\":3,\"146\":1,\"147\":2,\"152\":2,\"157\":2,\"161\":1,\"166\":3,\"170\":1,\"171\":1,\"176\":2,\"181\":2,\"185\":1,\"190\":3,\"193\":3,\"194\":3,\"196\":1,\"197\":2,\"198\":3,\"200\":1,\"201\":2,\"202\":1,\"203\":1,\"208\":1,\"209\":2,\"210\":2,\"212\":2,\"217\":2,\"221\":1,\"226\":4,\"230\":3,\"232\":1,\"233\":2,\"238\":1,\"239\":2,\"240\":2,\"242\":2,\"247\":2,\"251\":1,\"256\":4,\"260\":3,\"262\":1,\"263\":2,\"268\":1,\"269\":2,\"270\":3,\"272\":2,\"277\":2,\"281\":1,\"286\":4,\"299\":1,\"302\":1,\"305\":4,\"306\":3,\"308\":1,\"309\":2,\"314\":1,\"315\":2,\"316\":3,\"318\":2,\"323\":2,\"327\":1,\"332\":4,\"336\":3,\"338\":1,\"339\":2,\"349\":1,\"352\":1,\"355\":4,\"360\":1,\"361\":2,\"362\":3,\"364\":2,\"369\":2,\"373\":1,\"378\":4,\"394\":1,\"395\":1,\"396\":1,\"432\":2,\"433\":2,\"434\":2,\"435\":3,\"436\":2,\"545\":1,\"546\":1,\"547\":1,\"583\":2,\"584\":2,\"585\":2,\"586\":3,\"587\":2,\"617\":3,\"690\":1,\"693\":1,\"696\":4,\"697\":3,\"699\":1,\"700\":2,\"705\":1,\"706\":2,\"707\":4,\"709\":2,\"714\":2,\"718\":1,\"723\":4,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"801\":2,\"802\":2,\"803\":2,\"804\":2,\"805\":2,\"806\":2,\"807\":3,\"808\":2,\"809\":1,\"824\":3,\"897\":1,\"900\":1,\"903\":4,\"904\":3,\"906\":1,\"907\":2,\"928\":2,\"929\":10,\"931\":8,\"932\":2,\"937\":2,\"941\":1,\"946\":4,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1024\":2,\"1025\":2,\"1026\":2,\"1027\":2,\"1028\":2,\"1029\":2,\"1030\":3,\"1031\":2,\"1032\":1,\"1047\":3,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1185\":2,\"1186\":2,\"1187\":2,\"1188\":2,\"1189\":2,\"1190\":2,\"1191\":3,\"1192\":2,\"1193\":1,\"1224\":3,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1378\":2,\"1379\":2,\"1380\":2,\"1381\":2,\"1382\":2,\"1383\":2,\"1384\":3,\"1385\":2,\"1386\":1,\"1417\":3,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1568\":2,\"1569\":2,\"1570\":2,\"1571\":2,\"1572\":2,\"1573\":2,\"1574\":3,\"1575\":2,\"1576\":1,\"1616\":3,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1774\":2,\"1775\":2,\"1776\":2,\"1777\":2,\"1778\":2,\"1779\":2,\"1780\":3,\"1781\":2,\"1782\":1,\"1797\":3,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1964\":2,\"1965\":2,\"1966\":2,\"1967\":2,\"1968\":2,\"1969\":2,\"1970\":3,\"1971\":2,\"1972\":1,\"2012\":3,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2183\":2,\"2184\":2,\"2185\":2,\"2186\":2,\"2187\":2,\"2188\":2,\"2189\":3,\"2190\":2,\"2191\":1,\"2231\":3}}],[\"prompted\",{\"1\":{\"143\":3,\"166\":3,\"190\":3,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"promise\",{\"0\":{\"100\":1},\"1\":{\"89\":1,\"101\":1}}],[\"proof\",{\"1\":{\"99\":1}}],[\"protection\",{\"0\":{\"101\":1}}],[\"protect\",{\"1\":{\"98\":1}}],[\"protocol\",{\"1\":{\"73\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"protocols\",{\"1\":{\"20\":1,\"25\":2}}],[\"prototypical\",{\"1\":{\"11\":1}}],[\"program\",{\"1\":{\"62\":1}}],[\"progress\",{\"1\":{\"28\":2,\"61\":1,\"100\":1,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"problem\",{\"1\":{\"61\":1,\"62\":1}}],[\"proxy\",{\"0\":{\"56\":1,\"64\":1,\"437\":1,\"438\":2,\"439\":1,\"440\":1,\"491\":1,\"492\":2,\"493\":1,\"494\":1,\"497\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"588\":1,\"589\":2,\"590\":1,\"591\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"607\":1,\"645\":1,\"646\":2,\"647\":1,\"648\":1,\"810\":1,\"811\":2,\"812\":1,\"813\":1,\"852\":1,\"853\":2,\"854\":1,\"855\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"922\":1,\"1033\":1,\"1034\":2,\"1035\":1,\"1036\":1,\"1075\":1,\"1076\":2,\"1077\":1,\"1078\":1,\"1194\":1,\"1195\":2,\"1196\":1,\"1197\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1214\":1,\"1252\":1,\"1253\":2,\"1254\":1,\"1255\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1302\":1,\"1387\":1,\"1388\":2,\"1389\":1,\"1390\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1407\":1,\"1445\":1,\"1446\":2,\"1447\":1,\"1448\":1,\"1581\":1,\"1582\":2,\"1583\":1,\"1584\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1606\":1,\"1648\":1,\"1649\":2,\"1650\":1,\"1651\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1698\":1,\"1783\":1,\"1784\":2,\"1785\":1,\"1786\":1,\"1825\":1,\"1826\":2,\"1827\":1,\"1828\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1875\":1,\"1977\":1,\"1978\":2,\"1979\":1,\"1980\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2002\":1,\"2044\":1,\"2045\":2,\"2046\":1,\"2047\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2094\":1,\"2196\":1,\"2197\":2,\"2198\":1,\"2199\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2221\":1,\"2263\":1,\"2264\":2,\"2265\":1,\"2266\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2313\":1},\"1\":{\"63\":3,\"64\":3,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"137\":2,\"160\":2,\"165\":1,\"168\":3,\"171\":1,\"184\":2,\"189\":1,\"192\":3,\"203\":1,\"220\":2,\"225\":1,\"228\":3,\"250\":2,\"255\":1,\"258\":3,\"280\":2,\"285\":1,\"288\":3,\"326\":2,\"331\":2,\"334\":3,\"372\":2,\"377\":1,\"380\":3,\"437\":3,\"438\":4,\"439\":5,\"440\":3,\"444\":1,\"491\":3,\"492\":4,\"493\":5,\"494\":3,\"496\":1,\"498\":1,\"500\":2,\"501\":2,\"502\":2,\"503\":2,\"512\":1,\"588\":3,\"589\":4,\"590\":5,\"591\":3,\"595\":1,\"597\":2,\"598\":2,\"599\":2,\"600\":2,\"645\":3,\"646\":4,\"647\":5,\"648\":3,\"651\":1,\"674\":2,\"717\":2,\"722\":2,\"725\":3,\"730\":1,\"810\":3,\"811\":4,\"812\":5,\"813\":3,\"852\":3,\"853\":4,\"854\":5,\"855\":3,\"858\":1,\"881\":2,\"909\":1,\"911\":2,\"912\":2,\"913\":2,\"914\":2,\"915\":1,\"940\":2,\"945\":2,\"948\":3,\"953\":1,\"1033\":3,\"1034\":4,\"1035\":5,\"1036\":3,\"1075\":3,\"1076\":4,\"1077\":5,\"1078\":3,\"1081\":1,\"1104\":2,\"1114\":1,\"1194\":3,\"1195\":4,\"1196\":5,\"1197\":3,\"1201\":1,\"1203\":2,\"1204\":2,\"1205\":2,\"1206\":2,\"1207\":1,\"1252\":3,\"1253\":4,\"1254\":5,\"1255\":3,\"1258\":1,\"1281\":2,\"1289\":1,\"1291\":2,\"1292\":2,\"1293\":2,\"1294\":2,\"1295\":1,\"1307\":1,\"1387\":3,\"1388\":4,\"1389\":5,\"1390\":3,\"1394\":1,\"1396\":2,\"1397\":2,\"1398\":2,\"1399\":2,\"1400\":1,\"1445\":3,\"1446\":4,\"1447\":5,\"1448\":3,\"1451\":1,\"1474\":2,\"1494\":1,\"1581\":3,\"1582\":4,\"1583\":5,\"1584\":3,\"1586\":2,\"1593\":1,\"1595\":2,\"1596\":2,\"1597\":2,\"1598\":2,\"1599\":1,\"1648\":3,\"1649\":4,\"1650\":5,\"1651\":3,\"1654\":1,\"1677\":2,\"1685\":1,\"1687\":2,\"1688\":2,\"1689\":2,\"1690\":2,\"1691\":1,\"1703\":1,\"1783\":3,\"1784\":4,\"1785\":5,\"1786\":3,\"1825\":3,\"1826\":4,\"1827\":5,\"1828\":3,\"1831\":1,\"1854\":2,\"1862\":1,\"1864\":2,\"1865\":2,\"1866\":2,\"1867\":2,\"1868\":1,\"1890\":1,\"1977\":3,\"1978\":4,\"1979\":5,\"1980\":3,\"1982\":2,\"1989\":1,\"1991\":2,\"1992\":2,\"1993\":2,\"1994\":2,\"1995\":1,\"2044\":3,\"2045\":4,\"2046\":5,\"2047\":3,\"2050\":1,\"2073\":2,\"2081\":1,\"2083\":2,\"2084\":2,\"2085\":2,\"2086\":2,\"2087\":1,\"2109\":1,\"2196\":3,\"2197\":4,\"2198\":5,\"2199\":3,\"2201\":2,\"2208\":1,\"2210\":2,\"2211\":2,\"2212\":2,\"2213\":2,\"2214\":1,\"2263\":3,\"2264\":4,\"2265\":5,\"2266\":3,\"2269\":1,\"2292\":2,\"2300\":1,\"2302\":2,\"2303\":2,\"2304\":2,\"2305\":2,\"2306\":1}}],[\"prokosch\",{\"1\":{\"39\":1}}],[\"productive\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"production\",{\"1\":{\"81\":1,\"126\":1,\"129\":1,\"149\":1,\"152\":1,\"173\":1,\"176\":1,\"206\":1,\"207\":2,\"226\":1,\"236\":1,\"237\":2,\"256\":1,\"266\":1,\"267\":2,\"286\":1,\"300\":1,\"312\":1,\"313\":2,\"332\":1,\"350\":1,\"358\":1,\"359\":2,\"378\":1,\"691\":1,\"703\":1,\"704\":2,\"723\":1,\"898\":1,\"926\":1,\"927\":2,\"929\":1,\"946\":1}}],[\"produktivsysteme\",{\"1\":{\"29\":1}}],[\"prod\",{\"1\":{\"35\":1,\"1580\":2,\"1647\":2,\"1976\":2,\"2043\":2,\"2195\":2,\"2262\":2}}],[\"prozess\",{\"1\":{\"32\":1}}],[\"prozesses\",{\"1\":{\"32\":1}}],[\"prozesse\",{\"1\":{\"30\":1}}],[\"prozessplugins\",{\"0\":{\"35\":1},\"1\":{\"29\":3}}],[\"providing\",{\"1\":{\"23\":1,\"63\":1,\"91\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"provider\",{\"0\":{\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1},\"1\":{\"445\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":3,\"452\":5,\"453\":4,\"454\":2,\"455\":2,\"456\":3,\"457\":2,\"513\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":3,\"520\":5,\"521\":4,\"522\":2,\"523\":2,\"524\":3,\"525\":2,\"652\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":3,\"659\":5,\"660\":4,\"661\":2,\"662\":2,\"663\":3,\"664\":2,\"675\":1,\"676\":1,\"677\":2,\"678\":2,\"731\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":3,\"738\":5,\"739\":4,\"740\":2,\"741\":2,\"742\":3,\"743\":2,\"859\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":3,\"866\":5,\"867\":4,\"868\":2,\"869\":2,\"870\":3,\"871\":2,\"882\":1,\"883\":1,\"884\":2,\"885\":2,\"954\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":3,\"961\":5,\"962\":4,\"963\":2,\"964\":2,\"965\":3,\"966\":2,\"1082\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":3,\"1089\":5,\"1090\":4,\"1091\":2,\"1092\":2,\"1093\":3,\"1094\":2,\"1105\":1,\"1106\":1,\"1107\":2,\"1108\":2,\"1115\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":3,\"1122\":5,\"1123\":4,\"1124\":2,\"1125\":2,\"1126\":3,\"1127\":2,\"1259\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":3,\"1266\":5,\"1267\":4,\"1268\":2,\"1269\":2,\"1270\":3,\"1271\":2,\"1282\":1,\"1283\":1,\"1284\":2,\"1285\":2,\"1308\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":3,\"1315\":5,\"1316\":4,\"1317\":2,\"1318\":2,\"1319\":3,\"1320\":2,\"1452\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":3,\"1459\":5,\"1460\":4,\"1461\":2,\"1462\":2,\"1463\":3,\"1464\":2,\"1475\":1,\"1476\":1,\"1477\":2,\"1478\":2,\"1495\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":3,\"1502\":5,\"1503\":4,\"1504\":2,\"1505\":2,\"1506\":3,\"1507\":2,\"1587\":1,\"1588\":2,\"1589\":2,\"1655\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":3,\"1662\":5,\"1663\":4,\"1664\":2,\"1665\":2,\"1666\":3,\"1667\":2,\"1678\":1,\"1679\":1,\"1680\":2,\"1681\":2,\"1704\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":3,\"1711\":5,\"1712\":4,\"1713\":2,\"1714\":2,\"1715\":3,\"1716\":2,\"1832\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":3,\"1839\":5,\"1840\":4,\"1841\":2,\"1842\":2,\"1843\":3,\"1844\":2,\"1855\":1,\"1856\":1,\"1857\":2,\"1858\":2,\"1891\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":3,\"1898\":5,\"1899\":4,\"1900\":2,\"1901\":2,\"1902\":3,\"1903\":2,\"1983\":1,\"1984\":2,\"1985\":2,\"2051\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":3,\"2058\":5,\"2059\":4,\"2060\":2,\"2061\":2,\"2062\":3,\"2063\":2,\"2074\":1,\"2075\":1,\"2076\":2,\"2077\":2,\"2110\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":3,\"2117\":5,\"2118\":4,\"2119\":2,\"2120\":2,\"2121\":3,\"2122\":2,\"2202\":1,\"2203\":2,\"2204\":2,\"2270\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":3,\"2277\":5,\"2278\":4,\"2279\":2,\"2280\":2,\"2281\":3,\"2282\":2,\"2293\":1,\"2294\":1,\"2295\":2,\"2296\":2}}],[\"providers\",{\"1\":{\"81\":1}}],[\"provided\",{\"1\":{\"99\":2,\"122\":1,\"147\":1,\"197\":1,\"201\":1,\"233\":1,\"263\":1,\"309\":1,\"339\":1,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"700\":1,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"907\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"provides\",{\"1\":{\"55\":1,\"90\":1,\"1482\":1,\"1878\":1,\"2097\":1}}],[\"provide\",{\"1\":{\"0\":1,\"62\":1,\"63\":2,\"66\":1,\"73\":1,\"81\":1,\"99\":1,\"102\":1,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"447\":1,\"515\":1,\"654\":1,\"702\":1,\"733\":1,\"861\":1,\"925\":1,\"956\":1,\"1084\":1,\"1117\":1,\"1261\":1,\"1310\":1,\"1454\":1,\"1497\":1,\"1657\":1,\"1706\":1,\"1834\":1,\"1893\":1,\"2053\":1,\"2112\":1,\"2272\":1}}],[\"provisioning\",{\"1\":{\"21\":1}}],[\"proven\",{\"1\":{\"20\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"professionals\",{\"1\":{\"82\":1}}],[\"profile\",{\"1\":{\"76\":1,\"77\":1,\"133\":2,\"156\":2,\"180\":2,\"216\":2,\"246\":2,\"276\":2,\"322\":2,\"368\":2,\"713\":2,\"936\":2}}],[\"profiles\",{\"1\":{\"59\":3,\"74\":1}}],[\"prof\",{\"1\":{\"13\":1,\"18\":1}}],[\"project\",{\"0\":{\"20\":1,\"296\":1,\"346\":1,\"687\":1,\"894\":1},\"1\":{\"10\":1,\"18\":1,\"27\":1,\"62\":1,\"80\":1,\"81\":2,\"82\":1,\"84\":1,\"91\":2,\"294\":1,\"296\":1,\"297\":1,\"298\":1,\"299\":2,\"305\":1,\"344\":1,\"346\":1,\"347\":1,\"348\":1,\"349\":2,\"355\":1,\"685\":1,\"687\":1,\"688\":1,\"689\":1,\"690\":2,\"696\":1,\"892\":1,\"894\":1,\"895\":1,\"896\":1,\"897\":2,\"903\":1}}],[\"projects\",{\"1\":{\"10\":2,\"15\":1,\"24\":1,\"80\":2,\"81\":1,\"89\":1,\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"mvn\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"my\",{\"1\":{\"236\":2,\"266\":2,\"312\":2,\"358\":2,\"499\":1,\"596\":1,\"703\":2,\"910\":1,\"926\":2,\"1202\":1,\"1290\":1,\"1395\":1,\"1594\":1,\"1686\":1,\"1863\":1,\"1990\":1,\"2082\":1,\"2209\":1,\"2301\":1}}],[\"mdat\",{\"1\":{\"63\":3}}],[\"mpi\",{\"1\":{\"63\":2}}],[\"m\",{\"1\":{\"39\":8}}],[\"müssen\",{\"1\":{\"32\":1}}],[\"möglichst\",{\"1\":{\"29\":1}}],[\"mödinger\",{\"1\":{\"18\":1,\"39\":2}}],[\"must\",{\"1\":{\"49\":1,\"59\":1,\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"449\":1,\"450\":1,\"506\":1,\"517\":1,\"518\":1,\"603\":1,\"656\":1,\"657\":1,\"717\":1,\"735\":1,\"736\":1,\"863\":1,\"864\":1,\"918\":1,\"940\":1,\"958\":1,\"959\":1,\"1086\":1,\"1087\":1,\"1119\":1,\"1120\":1,\"1210\":1,\"1263\":1,\"1264\":1,\"1298\":1,\"1312\":1,\"1313\":1,\"1403\":1,\"1456\":1,\"1457\":1,\"1499\":1,\"1500\":1,\"1602\":1,\"1659\":1,\"1660\":1,\"1694\":1,\"1708\":1,\"1709\":1,\"1836\":1,\"1837\":1,\"1871\":1,\"1895\":1,\"1896\":1,\"1998\":1,\"2055\":1,\"2056\":1,\"2090\":1,\"2114\":1,\"2115\":1,\"2217\":1,\"2274\":1,\"2275\":1,\"2309\":1}}],[\"muss\",{\"1\":{\"31\":1}}],[\"multi\",{\"1\":{\"39\":1,\"80\":1,\"81\":1,\"82\":1}}],[\"multiple\",{\"1\":{\"0\":1,\"52\":1,\"62\":1,\"63\":1,\"81\":1,\"610\":1,\"612\":1,\"817\":1,\"819\":1,\"1040\":1,\"1042\":1,\"1217\":1,\"1219\":1,\"1410\":1,\"1412\":1,\"1482\":1,\"1484\":1,\"1609\":1,\"1611\":1,\"1790\":1,\"1792\":1,\"1878\":1,\"1880\":1,\"2005\":1,\"2007\":1,\"2097\":1,\"2099\":1,\"2224\":1,\"2226\":1}}],[\"much\",{\"1\":{\"14\":1,\"88\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"313\":1,\"329\":1,\"359\":1,\"375\":1,\"704\":1,\"720\":1,\"927\":1,\"943\":1}}],[\"most\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"mostly\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"moving\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"monitoring\",{\"1\":{\"39\":1}}],[\"montags\",{\"1\":{\"29\":1,\"103\":1}}],[\"mod\",{\"1\":{\"606\":1,\"921\":1,\"1213\":1,\"1301\":1,\"1406\":1,\"1605\":1,\"1697\":1,\"1874\":1,\"2001\":1,\"2093\":1,\"2220\":1,\"2312\":1}}],[\"modified\",{\"1\":{\"675\":1,\"882\":1,\"1105\":1,\"1282\":1,\"1475\":1,\"1587\":1,\"1678\":1,\"1855\":1,\"1983\":1,\"2074\":1,\"2202\":1,\"2293\":1}}],[\"modifies\",{\"1\":{\"606\":1,\"921\":1,\"1213\":1,\"1301\":1,\"1406\":1,\"1605\":1,\"1697\":1,\"1874\":1,\"2001\":1,\"2093\":1,\"2220\":1,\"2312\":1}}],[\"modify\",{\"0\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1},\"1\":{\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"168\":1,\"169\":1,\"184\":2,\"185\":2,\"192\":1,\"193\":1,\"220\":2,\"221\":2,\"228\":1,\"229\":1,\"250\":2,\"251\":2,\"258\":1,\"259\":1,\"280\":2,\"281\":2,\"288\":1,\"289\":1,\"326\":2,\"327\":2,\"334\":1,\"335\":1,\"372\":2,\"373\":2,\"380\":1,\"381\":1,\"419\":1,\"463\":1,\"531\":1,\"570\":1,\"670\":1,\"717\":2,\"718\":2,\"725\":1,\"726\":1,\"749\":1,\"788\":1,\"877\":1,\"931\":1,\"940\":2,\"941\":2,\"948\":1,\"949\":1,\"972\":1,\"1011\":1,\"1100\":1,\"1133\":1,\"1172\":1,\"1277\":1,\"1326\":1,\"1365\":1,\"1470\":1,\"1513\":1,\"1555\":1,\"1673\":1,\"1722\":1,\"1761\":1,\"1850\":1,\"1909\":1,\"1951\":1,\"2069\":1,\"2128\":1,\"2170\":1,\"2288\":1}}],[\"modifying\",{\"1\":{\"63\":1,\"99\":1,\"167\":1,\"191\":1,\"227\":1,\"257\":1,\"287\":1,\"333\":1,\"379\":1,\"724\":1,\"947\":1}}],[\"module\",{\"1\":{\"10\":2}}],[\"modeler\",{\"1\":{\"67\":1}}],[\"modelling\",{\"1\":{\"60\":2}}],[\"models\",{\"1\":{\"14\":1,\"58\":1,\"60\":1,\"62\":1,\"66\":1,\"67\":1}}],[\"model\",{\"1\":{\"7\":1,\"59\":1,\"60\":2,\"67\":2,\"89\":1}}],[\"more\",{\"1\":{\"7\":1,\"14\":1,\"53\":1,\"54\":1,\"55\":1,\"56\":1,\"60\":1,\"63\":1,\"73\":1,\"74\":1,\"76\":1,\"77\":1,\"88\":1,\"92\":1,\"100\":1,\"105\":1,\"106\":1,\"107\":1,\"108\":1,\"109\":1,\"110\":1,\"111\":1,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"123\":1,\"124\":1,\"134\":1,\"140\":1,\"157\":1,\"163\":1,\"170\":1,\"171\":1,\"181\":1,\"187\":1,\"202\":1,\"203\":1,\"217\":1,\"223\":1,\"247\":1,\"253\":1,\"277\":1,\"283\":1,\"291\":1,\"298\":1,\"301\":2,\"303\":3,\"305\":1,\"323\":1,\"329\":1,\"341\":1,\"348\":1,\"351\":2,\"353\":3,\"355\":1,\"369\":1,\"375\":1,\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"625\":1,\"663\":1,\"665\":1,\"682\":1,\"689\":1,\"692\":2,\"694\":3,\"696\":1,\"714\":1,\"720\":1,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"889\":1,\"896\":1,\"899\":2,\"901\":3,\"903\":1,\"928\":1,\"937\":1,\"943\":1,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2239\":1,\"2281\":1,\"2283\":1}}],[\"marketplace\",{\"1\":{\"928\":2,\"929\":1}}],[\"martin\",{\"1\":{\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"matches\",{\"1\":{\"612\":1,\"819\":1,\"1042\":1,\"1219\":1,\"1412\":1,\"1484\":1,\"1611\":1,\"1792\":1,\"1880\":1,\"2007\":1,\"2099\":1,\"2226\":1}}],[\"matched\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"611\":1,\"613\":3,\"615\":1,\"618\":2,\"645\":1,\"810\":1,\"818\":1,\"820\":3,\"822\":1,\"825\":2,\"852\":1,\"1033\":1,\"1041\":1,\"1043\":3,\"1045\":1,\"1048\":2,\"1075\":1,\"1194\":1,\"1218\":1,\"1220\":3,\"1222\":1,\"1225\":2,\"1252\":1,\"1387\":1,\"1411\":1,\"1413\":3,\"1415\":1,\"1418\":2,\"1445\":1,\"1483\":1,\"1485\":3,\"1487\":1,\"1490\":2,\"1581\":1,\"1610\":1,\"1612\":3,\"1614\":1,\"1617\":2,\"1648\":1,\"1783\":1,\"1791\":1,\"1793\":3,\"1795\":1,\"1798\":2,\"1825\":1,\"1879\":1,\"1881\":3,\"1883\":1,\"1886\":2,\"1977\":1,\"2006\":1,\"2008\":3,\"2010\":1,\"2013\":2,\"2044\":1,\"2098\":1,\"2100\":3,\"2102\":1,\"2105\":2,\"2196\":1,\"2225\":1,\"2227\":3,\"2229\":1,\"2232\":2,\"2263\":1}}],[\"matching\",{\"0\":{\"611\":1,\"818\":1,\"1041\":1,\"1218\":1,\"1411\":1,\"1483\":1,\"1610\":1,\"1791\":1,\"1879\":1,\"2006\":1,\"2098\":1,\"2225\":1},\"1\":{\"610\":2,\"817\":2,\"1040\":2,\"1217\":2,\"1410\":2,\"1482\":2,\"1609\":2,\"1790\":2,\"1878\":2,\"2005\":2,\"2097\":2,\"2224\":2}}],[\"match\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"614\":1,\"617\":1,\"618\":2,\"645\":1,\"810\":1,\"821\":1,\"824\":1,\"825\":2,\"852\":1,\"1033\":1,\"1044\":1,\"1047\":1,\"1048\":2,\"1075\":1,\"1194\":1,\"1221\":1,\"1224\":1,\"1225\":2,\"1252\":1,\"1387\":1,\"1414\":1,\"1417\":1,\"1418\":2,\"1445\":1,\"1486\":1,\"1490\":2,\"1581\":1,\"1613\":1,\"1616\":1,\"1617\":2,\"1648\":1,\"1783\":1,\"1794\":1,\"1797\":1,\"1798\":2,\"1825\":1,\"1882\":1,\"1886\":2,\"1977\":1,\"2009\":1,\"2012\":1,\"2013\":2,\"2044\":1,\"2101\":1,\"2105\":2,\"2196\":1,\"2228\":1,\"2231\":1,\"2232\":2,\"2263\":1}}],[\"maxpoolsize\",{\"0\":{\"802\":1,\"1025\":1,\"1186\":1,\"1379\":1,\"1569\":1,\"1775\":1,\"1965\":1,\"2184\":1},\"1\":{\"802\":1,\"1025\":1,\"1186\":1,\"1379\":1,\"1569\":1,\"1775\":1,\"1965\":1,\"2184\":1}}],[\"max\",{\"0\":{\"410\":1,\"433\":1,\"561\":1,\"584\":1,\"779\":1,\"805\":1,\"1002\":1,\"1028\":1,\"1163\":1,\"1189\":1,\"1356\":1,\"1382\":1,\"1546\":1,\"1572\":1,\"1752\":1,\"1778\":1,\"1942\":1,\"1968\":1,\"2161\":1,\"2187\":1},\"1\":{\"410\":1,\"433\":1,\"561\":1,\"584\":1,\"779\":1,\"802\":2,\"805\":1,\"1002\":1,\"1025\":2,\"1028\":1,\"1163\":1,\"1186\":2,\"1189\":1,\"1356\":1,\"1379\":2,\"1382\":1,\"1546\":1,\"1569\":2,\"1572\":1,\"1752\":1,\"1775\":2,\"1778\":1,\"1942\":1,\"1965\":2,\"1968\":1,\"2161\":1,\"2184\":2,\"2187\":1}}],[\"maximilian\",{\"1\":{\"18\":1}}],[\"maven\",{\"0\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1},\"1\":{\"293\":1,\"299\":2,\"343\":1,\"349\":2,\"684\":1,\"690\":2,\"891\":1,\"897\":2}}],[\"machine\",{\"1\":{\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"723\":2,\"946\":2}}],[\"machines\",{\"0\":{\"131\":1,\"154\":1,\"178\":1,\"214\":1,\"244\":1,\"274\":1,\"320\":1,\"366\":1,\"711\":1,\"934\":1}}],[\"machen\",{\"1\":{\"29\":1}}],[\"major\",{\"1\":{\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"170\":2,\"202\":2}}],[\"made\",{\"1\":{\"88\":1,\"301\":1,\"351\":1,\"387\":1,\"435\":1,\"478\":1,\"538\":1,\"586\":1,\"631\":1,\"692\":1,\"756\":1,\"807\":1,\"838\":1,\"899\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2135\":1,\"2189\":1,\"2245\":1}}],[\"master\",{\"1\":{\"63\":1}}],[\"making\",{\"1\":{\"62\":1,\"100\":1}}],[\"makers\",{\"1\":{\"82\":1}}],[\"makes\",{\"1\":{\"59\":1}}],[\"make\",{\"1\":{\"49\":1,\"66\":1,\"290\":1,\"297\":1,\"303\":2,\"304\":1,\"340\":1,\"347\":1,\"353\":2,\"354\":1,\"681\":1,\"688\":1,\"694\":2,\"695\":1,\"888\":1,\"895\":1,\"901\":2,\"902\":1,\"931\":1}}],[\"manual\",{\"1\":{\"129\":3,\"152\":3,\"176\":3,\"212\":3,\"226\":1,\"242\":3,\"256\":1,\"272\":3,\"286\":1,\"318\":3,\"332\":1,\"364\":3,\"378\":1,\"709\":3,\"723\":1,\"932\":3,\"946\":1}}],[\"many\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1,\"226\":2,\"256\":2,\"286\":2,\"332\":2,\"378\":2,\"723\":2,\"946\":2}}],[\"manner\",{\"1\":{\"100\":1}}],[\"mandatorily\",{\"1\":{\"59\":1}}],[\"managing\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"301\":1,\"313\":1,\"351\":1,\"359\":1,\"692\":1,\"704\":1,\"899\":1,\"927\":1}}],[\"managment\",{\"0\":{\"50\":1}}],[\"managed\",{\"1\":{\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"managers\",{\"1\":{\"81\":1}}],[\"manages\",{\"1\":{\"15\":1}}],[\"management\",{\"0\":{\"125\":1,\"148\":1,\"172\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"701\":1,\"924\":1},\"1\":{\"10\":1,\"31\":1,\"62\":1,\"91\":1,\"125\":1,\"126\":3,\"128\":1,\"142\":1,\"148\":1,\"149\":3,\"151\":1,\"165\":1,\"172\":1,\"173\":3,\"175\":1,\"189\":1,\"205\":2,\"207\":4,\"225\":1,\"235\":2,\"237\":2,\"255\":1,\"265\":2,\"267\":2,\"285\":1,\"299\":1,\"311\":2,\"313\":2,\"331\":1,\"349\":1,\"357\":2,\"359\":2,\"377\":1,\"690\":1,\"702\":2,\"704\":2,\"722\":1,\"897\":1,\"925\":2,\"927\":2,\"945\":1}}],[\"main\",{\"1\":{\"49\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"169\":2,\"184\":1,\"185\":1,\"193\":2,\"220\":1,\"221\":1,\"229\":2,\"250\":1,\"259\":2,\"280\":1,\"289\":2,\"294\":1,\"326\":1,\"335\":2,\"344\":1,\"372\":1,\"381\":2,\"685\":1,\"717\":1,\"726\":2,\"892\":1,\"940\":1,\"949\":2}}],[\"maintaining\",{\"1\":{\"25\":1,\"81\":1}}],[\"maintain\",{\"0\":{\"141\":1,\"164\":1,\"188\":1,\"224\":1,\"254\":1,\"284\":1,\"330\":1,\"376\":1,\"721\":1,\"944\":1},\"1\":{\"20\":1,\"99\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"mailonerrorlogeventdebugloglocation\",{\"0\":{\"419\":1,\"570\":1,\"788\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1},\"1\":{\"419\":1,\"570\":1,\"788\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1}}],[\"mailonerrorlogeventbuffersize\",{\"0\":{\"418\":1,\"569\":1,\"787\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1},\"1\":{\"418\":1,\"569\":1,\"787\":1,\"1010\":1,\"1171\":1,\"1364\":1,\"1554\":1,\"1760\":1,\"1950\":1,\"2169\":1}}],[\"mails\",{\"1\":{\"99\":1,\"102\":1,\"418\":1,\"419\":1,\"423\":1,\"425\":1,\"569\":1,\"570\":1,\"574\":1,\"576\":1,\"787\":1,\"788\":1,\"792\":1,\"794\":1,\"1010\":1,\"1011\":1,\"1015\":1,\"1017\":1,\"1171\":1,\"1172\":1,\"1176\":1,\"1178\":1,\"1364\":1,\"1365\":1,\"1369\":1,\"1371\":1,\"1554\":1,\"1555\":1,\"1559\":1,\"1561\":1,\"1760\":1,\"1761\":1,\"1765\":1,\"1767\":1,\"1950\":1,\"1951\":1,\"1955\":1,\"1957\":1,\"2169\":1,\"2170\":1,\"2174\":1,\"2176\":1}}],[\"mailbox\",{\"1\":{\"52\":1,\"53\":2}}],[\"mail\",{\"0\":{\"413\":1,\"414\":1,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":2,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"564\":1,\"565\":1,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":2,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"782\":1,\"783\":1,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":2,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":2,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":2,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":2,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":2,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":2,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":2,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":2,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1},\"1\":{\"4\":1,\"6\":1,\"99\":1,\"126\":1,\"127\":1,\"149\":1,\"150\":1,\"173\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"413\":2,\"414\":4,\"415\":2,\"416\":2,\"417\":1,\"418\":2,\"419\":2,\"420\":3,\"421\":1,\"422\":2,\"423\":1,\"424\":2,\"425\":1,\"426\":2,\"427\":2,\"428\":2,\"429\":2,\"430\":2,\"431\":1,\"564\":2,\"565\":4,\"566\":2,\"567\":2,\"568\":1,\"569\":2,\"570\":2,\"571\":3,\"572\":1,\"573\":2,\"574\":1,\"575\":2,\"576\":1,\"577\":2,\"578\":2,\"579\":2,\"580\":2,\"581\":2,\"582\":1,\"613\":2,\"618\":2,\"703\":1,\"782\":2,\"783\":4,\"784\":2,\"785\":2,\"786\":1,\"787\":2,\"788\":2,\"789\":3,\"790\":1,\"791\":2,\"792\":1,\"793\":2,\"794\":1,\"795\":2,\"796\":2,\"797\":2,\"798\":2,\"799\":2,\"800\":1,\"820\":2,\"825\":2,\"926\":1,\"1005\":2,\"1006\":4,\"1007\":2,\"1008\":2,\"1009\":1,\"1010\":2,\"1011\":2,\"1012\":3,\"1013\":1,\"1014\":2,\"1015\":1,\"1016\":2,\"1017\":1,\"1018\":2,\"1019\":2,\"1020\":2,\"1021\":2,\"1022\":2,\"1023\":1,\"1043\":2,\"1048\":2,\"1166\":2,\"1167\":4,\"1168\":2,\"1169\":2,\"1170\":1,\"1171\":2,\"1172\":2,\"1173\":3,\"1174\":1,\"1175\":2,\"1176\":1,\"1177\":2,\"1178\":1,\"1179\":2,\"1180\":2,\"1181\":2,\"1182\":2,\"1183\":2,\"1184\":1,\"1220\":2,\"1225\":2,\"1359\":2,\"1360\":4,\"1361\":2,\"1362\":2,\"1363\":1,\"1364\":2,\"1365\":2,\"1366\":3,\"1367\":1,\"1368\":2,\"1369\":1,\"1370\":2,\"1371\":1,\"1372\":2,\"1373\":2,\"1374\":2,\"1375\":2,\"1376\":2,\"1377\":1,\"1413\":2,\"1418\":2,\"1485\":2,\"1490\":2,\"1549\":2,\"1550\":4,\"1551\":2,\"1552\":2,\"1553\":1,\"1554\":2,\"1555\":2,\"1556\":3,\"1557\":1,\"1558\":2,\"1559\":1,\"1560\":2,\"1561\":1,\"1562\":2,\"1563\":2,\"1564\":2,\"1565\":2,\"1566\":2,\"1567\":1,\"1612\":2,\"1617\":2,\"1755\":2,\"1756\":4,\"1757\":2,\"1758\":2,\"1759\":1,\"1760\":2,\"1761\":2,\"1762\":3,\"1763\":1,\"1764\":2,\"1765\":1,\"1766\":2,\"1767\":1,\"1768\":2,\"1769\":2,\"1770\":2,\"1771\":2,\"1772\":2,\"1773\":1,\"1793\":2,\"1798\":2,\"1881\":2,\"1886\":2,\"1945\":2,\"1946\":4,\"1947\":2,\"1948\":2,\"1949\":1,\"1950\":2,\"1951\":2,\"1952\":3,\"1953\":1,\"1954\":2,\"1955\":1,\"1956\":2,\"1957\":1,\"1958\":2,\"1959\":2,\"1960\":2,\"1961\":2,\"1962\":2,\"1963\":1,\"2008\":2,\"2013\":2,\"2100\":2,\"2105\":2,\"2164\":2,\"2165\":4,\"2166\":2,\"2167\":2,\"2168\":1,\"2169\":2,\"2170\":2,\"2171\":3,\"2172\":1,\"2173\":2,\"2174\":1,\"2175\":2,\"2176\":1,\"2177\":2,\"2178\":2,\"2179\":2,\"2180\":2,\"2181\":2,\"2182\":1,\"2227\":2,\"2232\":2}}],[\"may\",{\"0\":{\"79\":1},\"1\":{\"1\":1,\"59\":1,\"299\":1,\"349\":1,\"396\":1,\"547\":1,\"690\":1,\"765\":1,\"766\":1,\"897\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"method\",{\"1\":{\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"metaphor\",{\"1\":{\"52\":1}}],[\"mention\",{\"1\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"mentioned\",{\"1\":{\"53\":1,\"61\":1}}],[\"meets\",{\"1\":{\"73\":1}}],[\"meeting\",{\"1\":{\"29\":1}}],[\"messages\",{\"1\":{\"70\":1,\"92\":1,\"394\":1,\"395\":1,\"418\":1,\"545\":1,\"546\":1,\"569\":1,\"763\":1,\"764\":1,\"787\":1,\"986\":1,\"987\":1,\"1010\":1,\"1147\":1,\"1148\":1,\"1171\":1,\"1340\":1,\"1341\":1,\"1364\":1,\"1529\":1,\"1530\":1,\"1554\":1,\"1736\":1,\"1737\":1,\"1760\":1,\"1925\":1,\"1926\":1,\"1950\":1,\"2144\":1,\"2145\":1,\"2169\":1}}],[\"messageevents\",{\"1\":{\"61\":1}}],[\"message\",{\"0\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1},\"1\":{\"61\":6,\"70\":3,\"71\":3,\"138\":1,\"161\":1,\"169\":2,\"185\":1,\"193\":2,\"221\":1,\"229\":2,\"251\":1,\"259\":2,\"281\":1,\"289\":2,\"327\":1,\"335\":2,\"373\":1,\"381\":2,\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"718\":1,\"726\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"941\":1,\"949\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"mesh\",{\"1\":{\"55\":2}}],[\"meaningful\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"meantime\",{\"1\":{\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"means\",{\"1\":{\"53\":1,\"59\":1,\"61\":1,\"66\":1,\"73\":1,\"410\":1,\"433\":1,\"561\":1,\"584\":1,\"779\":1,\"805\":1,\"809\":1,\"1002\":1,\"1028\":1,\"1032\":1,\"1163\":1,\"1189\":1,\"1193\":1,\"1356\":1,\"1382\":1,\"1386\":1,\"1546\":1,\"1572\":1,\"1576\":1,\"1752\":1,\"1778\":1,\"1782\":1,\"1942\":1,\"1968\":1,\"1972\":1,\"2161\":1,\"2187\":1,\"2191\":1}}],[\"measurereport\",{\"1\":{\"61\":1}}],[\"measure\",{\"1\":{\"61\":1}}],[\"mechanisms\",{\"1\":{\"95\":1}}],[\"mechanism\",{\"1\":{\"54\":1}}],[\"members\",{\"1\":{\"80\":1,\"82\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"member\",{\"1\":{\"49\":1,\"129\":1,\"152\":1,\"176\":1,\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"memorial\",{\"1\":{\"1\":2}}],[\"melden\",{\"1\":{\"37\":1}}],[\"medizininformatik\",{\"1\":{\"32\":1,\"37\":1,\"80\":1,\"210\":2,\"240\":2,\"270\":3,\"316\":3,\"362\":3,\"707\":4,\"931\":1}}],[\"medic\",{\"1\":{\"14\":1}}],[\"medicine\",{\"0\":{\"91\":1},\"1\":{\"10\":1,\"13\":2,\"15\":1,\"39\":1,\"91\":1,\"94\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"medical\",{\"0\":{\"10\":1,\"14\":1},\"1\":{\"0\":1,\"1\":2,\"10\":1,\"11\":2,\"14\":3,\"15\":1,\"21\":1,\"39\":1,\"42\":1,\"53\":1,\"54\":2,\"55\":1,\"58\":1,\"62\":5,\"63\":1,\"80\":1,\"81\":2,\"82\":1,\"84\":1,\"89\":3,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"merging\",{\"1\":{\"21\":1,\"89\":1}}],[\"merged\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"merge\",{\"1\":{\"0\":1,\"62\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"mimie\",{\"1\":{\"426\":1,\"577\":1,\"795\":1,\"1018\":1,\"1179\":1,\"1372\":1,\"1562\":1,\"1768\":1,\"1958\":1,\"2177\":1}}],[\"mime\",{\"1\":{\"99\":1,\"102\":1,\"137\":1,\"425\":2,\"576\":2,\"794\":2,\"1017\":2,\"1178\":2,\"1371\":2,\"1561\":2,\"1767\":2,\"1957\":2,\"2176\":2}}],[\"milliseconds\",{\"1\":{\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"411\":1,\"434\":1,\"454\":1,\"455\":1,\"470\":1,\"471\":1,\"522\":1,\"523\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"562\":1,\"585\":1,\"623\":1,\"624\":1,\"661\":1,\"662\":1,\"740\":1,\"741\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"780\":1,\"806\":1,\"830\":1,\"831\":1,\"868\":1,\"869\":1,\"963\":1,\"964\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1003\":1,\"1029\":1,\"1053\":1,\"1054\":1,\"1091\":1,\"1092\":1,\"1124\":1,\"1125\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1164\":1,\"1190\":1,\"1230\":1,\"1231\":1,\"1268\":1,\"1269\":1,\"1317\":1,\"1318\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1357\":1,\"1383\":1,\"1423\":1,\"1424\":1,\"1461\":1,\"1462\":1,\"1504\":1,\"1505\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1547\":1,\"1573\":1,\"1622\":1,\"1623\":1,\"1664\":1,\"1665\":1,\"1713\":1,\"1714\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1753\":1,\"1779\":1,\"1803\":1,\"1804\":1,\"1841\":1,\"1842\":1,\"1900\":1,\"1901\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1943\":1,\"1969\":1,\"2018\":1,\"2019\":1,\"2060\":1,\"2061\":1,\"2119\":1,\"2120\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2162\":1,\"2188\":1,\"2237\":1,\"2238\":1,\"2279\":1,\"2280\":1}}],[\"million\",{\"1\":{\"88\":2}}],[\"migrations\",{\"1\":{\"385\":1,\"386\":1,\"476\":1,\"477\":1,\"536\":1,\"537\":1,\"629\":1,\"630\":1,\"754\":1,\"755\":1,\"836\":1,\"837\":1,\"977\":1,\"978\":1,\"1059\":1,\"1060\":1,\"1138\":1,\"1139\":1,\"1236\":1,\"1237\":1,\"1331\":1,\"1332\":1,\"1429\":1,\"1430\":1,\"1518\":1,\"1519\":1,\"1628\":1,\"1629\":1,\"1727\":1,\"1728\":1,\"1809\":1,\"1810\":1,\"1914\":1,\"1915\":1,\"2024\":1,\"2025\":1,\"2133\":1,\"2134\":1,\"2243\":1,\"2244\":1}}],[\"migration\",{\"1\":{\"383\":2,\"474\":2,\"534\":2,\"627\":2,\"752\":2,\"834\":2,\"975\":2,\"1057\":2,\"1136\":2,\"1234\":2,\"1329\":2,\"1427\":2,\"1516\":2,\"1626\":2,\"1725\":2,\"1807\":2,\"1912\":2,\"2022\":2,\"2131\":2,\"2241\":2}}],[\"migrate\",{\"1\":{\"167\":1,\"191\":1,\"227\":2,\"257\":1,\"287\":1,\"333\":1,\"379\":1,\"724\":1,\"947\":1}}],[\"might\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"minimal\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"ministry\",{\"1\":{\"0\":1,\"21\":1,\"62\":2,\"80\":1,\"88\":1}}],[\"minutes\",{\"1\":{\"384\":2,\"475\":2,\"535\":2,\"628\":2,\"753\":2,\"835\":2,\"976\":2,\"1058\":2,\"1137\":2,\"1235\":2,\"1330\":2,\"1428\":2,\"1517\":2,\"1627\":2,\"1726\":2,\"1808\":2,\"1913\":2,\"2023\":2,\"2132\":2,\"2242\":2}}],[\"minor\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"min\",{\"1\":{\"131\":2,\"137\":3,\"138\":3,\"154\":2,\"160\":3,\"161\":3,\"178\":2,\"184\":3,\"185\":3,\"214\":2,\"220\":3,\"221\":3,\"244\":2,\"250\":3,\"251\":3,\"274\":2,\"280\":3,\"281\":3,\"320\":2,\"326\":3,\"327\":3,\"366\":2,\"372\":3,\"373\":3,\"711\":2,\"717\":3,\"718\":3,\"934\":2,\"940\":3,\"941\":3}}],[\"mitigate\",{\"1\":{\"98\":1}}],[\"mit\",{\"1\":{\"29\":2,\"31\":1,\"32\":1}}],[\"mii\",{\"0\":{\"210\":1,\"240\":1,\"270\":1,\"316\":1,\"362\":1,\"707\":1},\"1\":{\"6\":1,\"10\":3,\"29\":2,\"31\":2,\"32\":1,\"35\":4,\"37\":1,\"80\":1,\"81\":1,\"84\":1,\"128\":1,\"129\":2,\"143\":1,\"151\":1,\"152\":2,\"166\":1,\"175\":1,\"176\":2,\"190\":1,\"207\":1,\"210\":1,\"237\":1,\"240\":1,\"267\":1,\"270\":3,\"305\":2,\"313\":1,\"316\":4,\"355\":2,\"359\":1,\"362\":4,\"696\":2,\"704\":1,\"707\":6,\"903\":2,\"927\":1,\"929\":4,\"931\":4}}],[\"mie\",{\"0\":{\"79\":1},\"1\":{\"1\":2,\"85\":1}}],[\"middleware\",{\"1\":{\"0\":1,\"20\":1,\"21\":1,\"62\":1,\"66\":1,\"90\":2}}],[\"rfc\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"rp\",{\"1\":{\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"228\":1,\"229\":1,\"258\":1,\"259\":1,\"288\":1,\"289\":1,\"334\":1,\"335\":1,\"380\":1,\"381\":1,\"725\":1,\"726\":1,\"948\":1,\"949\":1}}],[\"rm\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"risks\",{\"1\":{\"98\":1}}],[\"right\",{\"1\":{\"55\":2}}],[\"rdp\",{\"1\":{\"91\":1,\"211\":1,\"241\":1,\"271\":1,\"317\":1,\"363\":1,\"708\":1,\"929\":1}}],[\"random\",{\"1\":{\"137\":3,\"138\":3,\"139\":2,\"160\":3,\"161\":3,\"162\":2,\"184\":3,\"185\":3,\"186\":2,\"220\":3,\"221\":3,\"222\":2,\"250\":3,\"251\":3,\"252\":2,\"280\":3,\"281\":3,\"282\":2,\"326\":3,\"327\":3,\"328\":2,\"372\":3,\"373\":3,\"374\":2,\"717\":3,\"718\":3,\"719\":2,\"940\":3,\"941\":3,\"942\":2}}],[\"range\",{\"1\":{\"24\":1}}],[\"ram\",{\"1\":{\"131\":2,\"154\":2,\"178\":2,\"214\":2,\"244\":2,\"274\":2,\"320\":2,\"366\":2,\"711\":2,\"934\":2}}],[\"rarely\",{\"1\":{\"89\":1}}],[\"rule\",{\"1\":{\"612\":1,\"819\":1,\"1042\":1,\"1219\":1,\"1412\":1,\"1482\":2,\"1484\":1,\"1609\":2,\"1611\":1,\"1792\":1,\"1878\":2,\"1880\":1,\"2005\":2,\"2007\":1,\"2097\":2,\"2099\":1,\"2224\":2,\"2226\":1}}],[\"ruleset\",{\"1\":{\"295\":1,\"345\":1,\"686\":1,\"893\":1}}],[\"rules\",{\"1\":{\"59\":1}}],[\"running\",{\"1\":{\"95\":1,\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"296\":1,\"335\":2,\"346\":1,\"381\":2,\"687\":1,\"726\":2,\"894\":1,\"949\":2}}],[\"run\",{\"1\":{\"63\":1,\"74\":2,\"137\":1,\"138\":2,\"160\":1,\"161\":2,\"184\":1,\"185\":2,\"220\":1,\"221\":2,\"250\":1,\"251\":2,\"280\":1,\"281\":2,\"298\":1,\"326\":1,\"327\":2,\"348\":1,\"372\":1,\"373\":2,\"385\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":1,\"425\":1,\"426\":1,\"429\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"480\":1,\"482\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"536\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":1,\"576\":1,\"577\":1,\"580\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"633\":1,\"635\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"678\":1,\"689\":1,\"717\":1,\"718\":2,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"754\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"794\":1,\"795\":1,\"798\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"840\":1,\"842\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"885\":1,\"896\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"940\":1,\"941\":2,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"977\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1108\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1285\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1478\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1589\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1681\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1858\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1985\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2077\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2204\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2296\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"runs\",{\"1\":{\"0\":1,\"52\":1}}],[\"r\",{\"1\":{\"39\":6}}],[\"root\",{\"1\":{\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"506\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"603\":1,\"625\":1,\"663\":1,\"665\":1,\"677\":2,\"678\":4,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"884\":2,\"885\":4,\"915\":1,\"918\":1,\"931\":2,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1107\":2,\"1108\":4,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1207\":1,\"1210\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1284\":2,\"1285\":4,\"1295\":1,\"1298\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1400\":1,\"1403\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1477\":2,\"1478\":4,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1588\":2,\"1589\":4,\"1599\":1,\"1602\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1680\":2,\"1681\":4,\"1691\":1,\"1694\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1857\":2,\"1858\":4,\"1868\":1,\"1871\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"1984\":2,\"1985\":4,\"1995\":1,\"1998\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2076\":2,\"2077\":4,\"2087\":1,\"2090\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2203\":2,\"2204\":4,\"2214\":1,\"2217\":1,\"2239\":1,\"2281\":1,\"2283\":1,\"2295\":2,\"2296\":4,\"2306\":1,\"2309\":1}}],[\"routing\",{\"1\":{\"64\":1}}],[\"routine\",{\"1\":{\"0\":1,\"62\":1,\"89\":1}}],[\"robust\",{\"1\":{\"25\":1}}],[\"role|dsf\",{\"1\":{\"618\":2,\"825\":2,\"1048\":2,\"1225\":2,\"1418\":2,\"1617\":2,\"1798\":2,\"2013\":2,\"2232\":2}}],[\"rolecreate\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"roleconfig\",{\"0\":{\"489\":1,\"643\":1,\"850\":1,\"1073\":1,\"1250\":1,\"1443\":1,\"1578\":1,\"1645\":1,\"1823\":1,\"1974\":1,\"2041\":1,\"2193\":1,\"2260\":1},\"1\":{\"137\":2,\"160\":1,\"184\":1,\"192\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"489\":1,\"610\":3,\"618\":3,\"643\":1,\"717\":1,\"817\":3,\"825\":3,\"850\":1,\"940\":1,\"1040\":3,\"1048\":3,\"1073\":1,\"1217\":3,\"1225\":3,\"1250\":1,\"1410\":3,\"1418\":3,\"1443\":1,\"1482\":3,\"1490\":3,\"1578\":1,\"1609\":3,\"1617\":3,\"1645\":1,\"1790\":3,\"1798\":3,\"1823\":1,\"1878\":3,\"1886\":3,\"1974\":1,\"2005\":3,\"2013\":3,\"2041\":1,\"2097\":3,\"2105\":3,\"2193\":1,\"2224\":3,\"2232\":3,\"2260\":1}}],[\"role\",{\"0\":{\"614\":1,\"616\":1,\"617\":1,\"821\":1,\"823\":1,\"824\":1,\"1044\":1,\"1046\":1,\"1047\":1,\"1221\":1,\"1223\":1,\"1224\":1,\"1414\":1,\"1416\":1,\"1417\":1,\"1486\":1,\"1488\":1,\"1489\":1,\"1613\":1,\"1615\":1,\"1616\":1,\"1794\":1,\"1796\":1,\"1797\":1,\"1882\":1,\"1884\":1,\"1885\":1,\"2009\":1,\"2011\":1,\"2012\":1,\"2101\":1,\"2103\":1,\"2104\":1,\"2228\":1,\"2230\":1,\"2231\":1},\"1\":{\"137\":1,\"192\":3,\"304\":1,\"354\":1,\"489\":1,\"610\":3,\"611\":1,\"614\":3,\"616\":1,\"617\":2,\"618\":10,\"643\":1,\"695\":1,\"817\":3,\"818\":1,\"821\":3,\"823\":1,\"824\":2,\"825\":10,\"850\":1,\"902\":1,\"1040\":3,\"1041\":1,\"1044\":3,\"1046\":1,\"1047\":2,\"1048\":10,\"1073\":1,\"1217\":3,\"1218\":1,\"1221\":3,\"1223\":1,\"1224\":2,\"1225\":10,\"1250\":1,\"1410\":3,\"1411\":1,\"1414\":3,\"1416\":1,\"1417\":2,\"1418\":10,\"1443\":1,\"1482\":3,\"1483\":1,\"1486\":3,\"1488\":1,\"1490\":8,\"1578\":1,\"1609\":3,\"1610\":1,\"1613\":3,\"1615\":1,\"1616\":2,\"1617\":10,\"1645\":1,\"1790\":3,\"1791\":1,\"1794\":3,\"1796\":1,\"1797\":2,\"1798\":10,\"1823\":1,\"1878\":3,\"1879\":1,\"1882\":3,\"1884\":1,\"1886\":8,\"1974\":1,\"2005\":3,\"2006\":1,\"2009\":3,\"2011\":1,\"2012\":2,\"2013\":10,\"2041\":1,\"2097\":3,\"2098\":1,\"2101\":3,\"2103\":1,\"2105\":8,\"2193\":1,\"2224\":3,\"2225\":1,\"2228\":3,\"2230\":1,\"2231\":2,\"2232\":10,\"2260\":1}}],[\"roles\",{\"0\":{\"615\":1,\"822\":1,\"1045\":1,\"1222\":1,\"1415\":1,\"1487\":1,\"1614\":1,\"1795\":1,\"1883\":1,\"2010\":1,\"2102\":1,\"2229\":1},\"1\":{\"49\":2,\"192\":1,\"432\":1,\"583\":1,\"610\":7,\"611\":1,\"612\":1,\"615\":1,\"616\":1,\"617\":1,\"643\":1,\"674\":1,\"804\":1,\"817\":7,\"818\":1,\"819\":1,\"822\":1,\"823\":1,\"824\":1,\"881\":1,\"1027\":1,\"1040\":7,\"1041\":1,\"1042\":1,\"1045\":1,\"1046\":1,\"1047\":1,\"1104\":1,\"1188\":1,\"1217\":7,\"1218\":1,\"1219\":1,\"1222\":1,\"1223\":1,\"1224\":1,\"1281\":1,\"1381\":1,\"1410\":7,\"1411\":1,\"1412\":1,\"1415\":1,\"1416\":1,\"1417\":1,\"1474\":1,\"1482\":7,\"1483\":1,\"1484\":1,\"1487\":1,\"1488\":1,\"1489\":1,\"1571\":1,\"1586\":1,\"1609\":7,\"1610\":1,\"1611\":1,\"1614\":1,\"1615\":1,\"1616\":1,\"1677\":1,\"1777\":1,\"1790\":7,\"1791\":1,\"1792\":1,\"1795\":1,\"1796\":1,\"1797\":1,\"1854\":1,\"1878\":7,\"1879\":1,\"1880\":1,\"1883\":1,\"1884\":1,\"1885\":1,\"1967\":1,\"1982\":1,\"2005\":7,\"2006\":1,\"2007\":1,\"2010\":1,\"2011\":1,\"2012\":1,\"2073\":1,\"2097\":7,\"2098\":1,\"2099\":1,\"2102\":1,\"2103\":1,\"2104\":1,\"2186\":1,\"2201\":1,\"2224\":7,\"2225\":1,\"2226\":1,\"2229\":1,\"2230\":1,\"2231\":1,\"2292\":1}}],[\"rollout\",{\"1\":{\"10\":1}}],[\"rolf\",{\"1\":{\"1\":3}}],[\"reqiures\",{\"1\":{\"420\":1,\"430\":1,\"571\":1,\"581\":1,\"789\":1,\"799\":1,\"1012\":1,\"1022\":1,\"1173\":1,\"1183\":1,\"1366\":1,\"1376\":1,\"1556\":1,\"1566\":1,\"1762\":1,\"1772\":1,\"1952\":1,\"1962\":1,\"2171\":1,\"2181\":1}}],[\"require\",{\"1\":{\"439\":1,\"493\":1,\"590\":1,\"606\":1,\"647\":1,\"812\":1,\"854\":1,\"921\":1,\"1035\":1,\"1077\":1,\"1196\":1,\"1213\":1,\"1254\":1,\"1301\":1,\"1389\":1,\"1406\":1,\"1447\":1,\"1583\":1,\"1605\":1,\"1650\":1,\"1697\":1,\"1785\":1,\"1827\":1,\"1874\":1,\"1979\":1,\"2001\":1,\"2046\":1,\"2093\":1,\"2198\":1,\"2220\":1,\"2265\":1,\"2312\":1}}],[\"required\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"226\":1,\"251\":1,\"256\":1,\"281\":1,\"286\":1,\"301\":1,\"327\":1,\"332\":1,\"351\":1,\"373\":1,\"378\":1,\"383\":1,\"384\":1,\"385\":1,\"386\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":1,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":1,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":1,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":1,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":1,\"439\":1,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":1,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"469\":1,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":1,\"477\":1,\"478\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":1,\"493\":1,\"494\":1,\"498\":1,\"499\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":1,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":1,\"537\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":1,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":1,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":1,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":1,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":1,\"590\":1,\"591\":1,\"595\":1,\"596\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"620\":1,\"621\":1,\"622\":1,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":1,\"630\":1,\"631\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":1,\"647\":1,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":1,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"671\":1,\"672\":1,\"692\":1,\"718\":1,\"723\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":1,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":1,\"755\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":1,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":1,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":1,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":1,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":1,\"812\":1,\"813\":1,\"827\":1,\"828\":1,\"829\":1,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":1,\"837\":1,\"838\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":1,\"854\":1,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":1,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"878\":1,\"879\":1,\"899\":1,\"909\":1,\"910\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"931\":1,\"941\":1,\"946\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":1,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":1,\"978\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":1,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":1,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":1,\"1035\":1,\"1036\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":1,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":1,\"1077\":1,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":1,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":1,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":1,\"1196\":1,\"1197\":1,\"1201\":1,\"1202\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":1,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":1,\"1254\":1,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1289\":1,\"1290\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":1,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":1,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":1,\"1389\":1,\"1390\":1,\"1394\":1,\"1395\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":1,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":1,\"1447\":1,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":1,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":1,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":1,\"1583\":1,\"1584\":1,\"1593\":1,\"1594\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":1,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":1,\"1650\":1,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1685\":1,\"1686\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":1,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":1,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":1,\"1785\":1,\"1786\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":1,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":1,\"1827\":1,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1862\":1,\"1863\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":1,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":1,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":1,\"1979\":1,\"1980\":1,\"1989\":1,\"1990\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":1,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":1,\"2046\":1,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2081\":1,\"2082\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":1,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":1,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":1,\"2198\":1,\"2199\":1,\"2208\":1,\"2209\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":1,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":1,\"2265\":1,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2289\":1,\"2290\":1,\"2300\":1,\"2301\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"requires\",{\"1\":{\"81\":1,\"413\":1,\"414\":1,\"418\":1,\"419\":1,\"423\":1,\"424\":1,\"429\":1,\"438\":1,\"440\":1,\"445\":1,\"446\":1,\"448\":1,\"492\":1,\"494\":1,\"513\":1,\"514\":1,\"516\":1,\"564\":1,\"565\":1,\"569\":1,\"570\":1,\"574\":1,\"575\":1,\"580\":1,\"589\":1,\"591\":1,\"646\":1,\"648\":1,\"652\":1,\"653\":1,\"655\":1,\"674\":1,\"731\":1,\"732\":1,\"734\":1,\"782\":1,\"783\":1,\"787\":1,\"788\":1,\"792\":1,\"793\":1,\"798\":1,\"811\":1,\"813\":1,\"853\":1,\"855\":1,\"859\":1,\"860\":1,\"862\":1,\"881\":1,\"954\":1,\"955\":1,\"957\":1,\"1005\":1,\"1006\":1,\"1010\":1,\"1011\":1,\"1015\":1,\"1016\":1,\"1021\":1,\"1034\":1,\"1036\":1,\"1076\":1,\"1078\":1,\"1082\":1,\"1083\":1,\"1085\":1,\"1104\":1,\"1115\":1,\"1116\":1,\"1118\":1,\"1166\":1,\"1167\":1,\"1171\":1,\"1172\":1,\"1176\":1,\"1177\":1,\"1182\":1,\"1195\":1,\"1197\":1,\"1253\":1,\"1255\":1,\"1259\":1,\"1260\":1,\"1262\":1,\"1281\":1,\"1308\":1,\"1309\":1,\"1311\":1,\"1359\":1,\"1360\":1,\"1364\":1,\"1365\":1,\"1369\":1,\"1370\":1,\"1375\":1,\"1388\":1,\"1390\":1,\"1446\":1,\"1448\":1,\"1452\":1,\"1453\":1,\"1455\":1,\"1474\":1,\"1495\":1,\"1496\":1,\"1498\":1,\"1549\":1,\"1550\":1,\"1554\":1,\"1555\":1,\"1559\":1,\"1560\":1,\"1565\":1,\"1582\":1,\"1584\":1,\"1586\":1,\"1649\":1,\"1651\":1,\"1655\":1,\"1656\":1,\"1658\":1,\"1677\":1,\"1704\":1,\"1705\":1,\"1707\":1,\"1755\":1,\"1756\":1,\"1760\":1,\"1761\":1,\"1765\":1,\"1766\":1,\"1771\":1,\"1784\":1,\"1786\":1,\"1826\":1,\"1828\":1,\"1832\":1,\"1833\":1,\"1835\":1,\"1854\":1,\"1891\":1,\"1892\":1,\"1894\":1,\"1945\":1,\"1946\":1,\"1950\":1,\"1951\":1,\"1955\":1,\"1956\":1,\"1961\":1,\"1978\":1,\"1980\":1,\"1982\":1,\"2045\":1,\"2047\":1,\"2051\":1,\"2052\":1,\"2054\":1,\"2073\":1,\"2110\":1,\"2111\":1,\"2113\":1,\"2164\":1,\"2165\":1,\"2169\":1,\"2170\":1,\"2174\":1,\"2175\":1,\"2180\":1,\"2197\":1,\"2199\":1,\"2201\":1,\"2264\":1,\"2266\":1,\"2270\":1,\"2271\":1,\"2273\":1,\"2292\":1}}],[\"requirements\",{\"1\":{\"11\":1,\"58\":1,\"206\":1,\"236\":1,\"266\":1,\"296\":1,\"312\":1,\"346\":1,\"358\":1,\"687\":1,\"703\":1,\"894\":1,\"926\":1}}],[\"requester\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"requested\",{\"1\":{\"54\":2,\"61\":1,\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"requests\",{\"0\":{\"75\":1},\"1\":{\"54\":2,\"90\":1,\"293\":1,\"300\":1,\"301\":5,\"305\":2,\"343\":1,\"350\":1,\"351\":5,\"355\":2,\"402\":1,\"405\":1,\"473\":1,\"553\":1,\"556\":1,\"626\":1,\"684\":1,\"691\":1,\"692\":5,\"696\":2,\"772\":1,\"775\":1,\"833\":1,\"891\":1,\"898\":1,\"899\":5,\"903\":2,\"995\":1,\"998\":1,\"1056\":1,\"1156\":1,\"1159\":1,\"1233\":1,\"1349\":1,\"1352\":1,\"1426\":1,\"1533\":1,\"1539\":1,\"1542\":1,\"1625\":1,\"1639\":1,\"1745\":1,\"1748\":1,\"1806\":1,\"1929\":1,\"1935\":1,\"1938\":1,\"2021\":1,\"2035\":1,\"2148\":1,\"2154\":1,\"2157\":1,\"2240\":1,\"2254\":1}}],[\"requesting\",{\"1\":{\"53\":1,\"71\":3,\"1527\":1,\"1637\":1,\"1923\":1,\"2033\":1,\"2142\":1,\"2252\":1}}],[\"request\",{\"0\":{\"2\":1,\"51\":1,\"301\":1,\"351\":1,\"505\":1,\"602\":1,\"692\":1,\"899\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1},\"1\":{\"4\":1,\"8\":1,\"99\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"300\":3,\"303\":2,\"305\":1,\"328\":1,\"350\":3,\"353\":2,\"355\":1,\"374\":1,\"447\":1,\"505\":1,\"515\":1,\"602\":1,\"654\":1,\"691\":3,\"694\":2,\"696\":1,\"719\":1,\"733\":1,\"861\":1,\"898\":3,\"901\":2,\"903\":1,\"917\":1,\"942\":1,\"956\":1,\"1084\":1,\"1117\":1,\"1209\":1,\"1261\":1,\"1297\":1,\"1310\":1,\"1402\":1,\"1454\":1,\"1497\":1,\"1601\":1,\"1657\":1,\"1693\":1,\"1706\":1,\"1834\":1,\"1870\":1,\"1893\":1,\"1997\":1,\"2053\":1,\"2089\":1,\"2112\":1,\"2216\":1,\"2272\":1,\"2308\":1}}],[\"refine\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"refer\",{\"1\":{\"59\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"references\",{\"1\":{\"59\":2}}],[\"reference\",{\"1\":{\"45\":1,\"226\":2,\"256\":2,\"286\":2,\"305\":1,\"332\":2,\"355\":1,\"378\":2,\"696\":1,\"723\":2,\"903\":1,\"946\":2}}],[\"reviewing\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"review\",{\"1\":{\"300\":1,\"301\":2,\"302\":2,\"305\":1,\"350\":1,\"351\":2,\"352\":2,\"355\":1,\"691\":1,\"692\":2,\"693\":2,\"696\":1,\"898\":1,\"899\":2,\"900\":2,\"903\":1}}],[\"reverse\",{\"0\":{\"56\":1,\"64\":1,\"497\":1,\"607\":1,\"922\":1,\"1214\":1,\"1302\":1,\"1407\":1,\"1606\":1,\"1698\":1,\"1875\":1,\"2002\":1,\"2094\":1,\"2221\":1,\"2313\":1},\"1\":{\"63\":3,\"64\":2,\"137\":1,\"160\":1,\"165\":1,\"184\":1,\"189\":1,\"220\":1,\"225\":1,\"250\":1,\"255\":1,\"280\":1,\"285\":1,\"326\":1,\"331\":2,\"372\":1,\"377\":1,\"444\":1,\"496\":1,\"498\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"512\":1,\"595\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"651\":1,\"674\":2,\"717\":1,\"722\":2,\"730\":1,\"858\":1,\"881\":2,\"909\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"940\":1,\"945\":2,\"953\":1,\"1081\":1,\"1104\":2,\"1114\":1,\"1201\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1258\":1,\"1281\":2,\"1289\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1307\":1,\"1394\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1451\":1,\"1474\":2,\"1494\":1,\"1586\":2,\"1593\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1654\":1,\"1677\":2,\"1685\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1703\":1,\"1831\":1,\"1854\":2,\"1862\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1890\":1,\"1982\":2,\"1989\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"2050\":1,\"2073\":2,\"2081\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2109\":1,\"2201\":2,\"2208\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2269\":1,\"2292\":2,\"2300\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1}}],[\"reminder\",{\"1\":{\"931\":1}}],[\"removing\",{\"1\":{\"193\":2}}],[\"remove\",{\"1\":{\"137\":2,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"192\":2,\"193\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"removed\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"remote\",{\"0\":{\"403\":1,\"404\":1,\"405\":1,\"554\":1,\"555\":1,\"556\":1,\"773\":1,\"774\":1,\"775\":1,\"996\":1,\"997\":1,\"998\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"2155\":1,\"2156\":1,\"2157\":1},\"1\":{\"0\":1,\"77\":1,\"302\":1,\"352\":1,\"397\":1,\"403\":2,\"404\":2,\"405\":2,\"406\":1,\"458\":1,\"467\":1,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"526\":1,\"548\":1,\"554\":2,\"555\":2,\"556\":2,\"557\":1,\"620\":1,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"665\":1,\"693\":1,\"744\":1,\"767\":1,\"773\":2,\"774\":2,\"775\":2,\"776\":1,\"827\":1,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"872\":1,\"900\":1,\"967\":1,\"990\":1,\"996\":2,\"997\":2,\"998\":2,\"999\":1,\"1050\":1,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1095\":1,\"1128\":1,\"1151\":1,\"1157\":2,\"1158\":2,\"1159\":2,\"1160\":1,\"1227\":1,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1272\":1,\"1321\":1,\"1344\":1,\"1350\":2,\"1351\":2,\"1352\":2,\"1353\":1,\"1420\":1,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1465\":1,\"1508\":1,\"1534\":1,\"1540\":2,\"1541\":2,\"1542\":2,\"1543\":1,\"1619\":1,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1668\":1,\"1717\":1,\"1740\":1,\"1746\":2,\"1747\":2,\"1748\":2,\"1749\":1,\"1800\":1,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1845\":1,\"1904\":1,\"1930\":1,\"1936\":2,\"1937\":2,\"1938\":2,\"1939\":1,\"2015\":1,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2064\":1,\"2123\":1,\"2149\":1,\"2155\":2,\"2156\":2,\"2157\":2,\"2158\":1,\"2234\":1,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2283\":1}}],[\"remediations\",{\"1\":{\"100\":1}}],[\"registered\",{\"1\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"register\",{\"1\":{\"88\":1}}],[\"returned\",{\"1\":{\"488\":1,\"642\":1,\"849\":1,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1}}],[\"retire\",{\"1\":{\"436\":1,\"587\":1,\"808\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"retired\",{\"0\":{\"436\":1,\"587\":1,\"808\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1},\"1\":{\"436\":2,\"587\":2,\"808\":2,\"1031\":2,\"1192\":2,\"1385\":2,\"1575\":2,\"1781\":2,\"1971\":2,\"2190\":2}}],[\"retry\",{\"0\":{\"410\":1,\"411\":1,\"433\":1,\"434\":1,\"561\":1,\"562\":1,\"584\":1,\"585\":1,\"779\":1,\"780\":1,\"805\":1,\"806\":1,\"1002\":1,\"1003\":1,\"1028\":1,\"1029\":1,\"1163\":1,\"1164\":1,\"1189\":1,\"1190\":1,\"1356\":1,\"1357\":1,\"1382\":1,\"1383\":1,\"1546\":1,\"1547\":1,\"1572\":1,\"1573\":1,\"1752\":1,\"1753\":1,\"1778\":1,\"1779\":1,\"1942\":1,\"1943\":1,\"1968\":1,\"1969\":1,\"2161\":1,\"2162\":1,\"2187\":1,\"2188\":1},\"1\":{\"410\":1,\"411\":1,\"433\":1,\"434\":1,\"561\":1,\"562\":1,\"584\":1,\"585\":1,\"779\":1,\"780\":1,\"805\":1,\"806\":1,\"1002\":1,\"1003\":1,\"1028\":1,\"1029\":1,\"1163\":1,\"1164\":1,\"1189\":1,\"1190\":1,\"1356\":1,\"1357\":1,\"1382\":1,\"1383\":1,\"1546\":1,\"1547\":1,\"1572\":1,\"1573\":1,\"1752\":1,\"1753\":1,\"1778\":1,\"1779\":1,\"1942\":1,\"1943\":1,\"1968\":1,\"1969\":1,\"2161\":1,\"2162\":1,\"2187\":1,\"2188\":1}}],[\"retries\",{\"1\":{\"192\":1,\"193\":1,\"410\":2,\"411\":1,\"433\":2,\"434\":1,\"561\":2,\"562\":1,\"584\":2,\"585\":1,\"779\":2,\"780\":1,\"805\":2,\"806\":1,\"1002\":2,\"1003\":1,\"1028\":2,\"1029\":1,\"1163\":2,\"1164\":1,\"1189\":2,\"1190\":1,\"1356\":2,\"1357\":1,\"1382\":2,\"1383\":1,\"1546\":2,\"1547\":1,\"1572\":2,\"1573\":1,\"1752\":2,\"1753\":1,\"1778\":2,\"1779\":1,\"1942\":2,\"1943\":1,\"1968\":2,\"1969\":1,\"2161\":2,\"2162\":1,\"2187\":2,\"2188\":1}}],[\"retrospective\",{\"1\":{\"81\":1}}],[\"reto\",{\"1\":{\"18\":1}}],[\"redirect\",{\"1\":{\"78\":1,\"86\":1}}],[\"reply\",{\"1\":{\"422\":2,\"502\":1,\"503\":1,\"573\":2,\"599\":1,\"600\":1,\"791\":2,\"913\":1,\"914\":1,\"1014\":2,\"1175\":2,\"1205\":1,\"1206\":1,\"1293\":1,\"1294\":1,\"1368\":2,\"1398\":1,\"1399\":1,\"1558\":2,\"1597\":1,\"1598\":1,\"1689\":1,\"1690\":1,\"1764\":2,\"1866\":1,\"1867\":1,\"1954\":2,\"1993\":1,\"1994\":1,\"2085\":1,\"2086\":1,\"2173\":2,\"2212\":1,\"2213\":1,\"2304\":1,\"2305\":1}}],[\"replytoaddresses\",{\"0\":{\"422\":1,\"573\":1,\"791\":1,\"1014\":1,\"1175\":1,\"1368\":1,\"1558\":1,\"1764\":1,\"1954\":1,\"2173\":1},\"1\":{\"422\":1,\"573\":1,\"791\":1,\"1014\":1,\"1175\":1,\"1368\":1,\"1558\":1,\"1764\":1,\"1954\":1,\"2173\":1}}],[\"replies\",{\"1\":{\"402\":1,\"405\":1,\"473\":1,\"553\":1,\"556\":1,\"626\":1,\"772\":1,\"775\":1,\"833\":1,\"995\":1,\"998\":1,\"1056\":1,\"1156\":1,\"1159\":1,\"1233\":1,\"1349\":1,\"1352\":1,\"1426\":1,\"1539\":1,\"1542\":1,\"1625\":1,\"1745\":1,\"1748\":1,\"1806\":1,\"1935\":1,\"1938\":1,\"2021\":1,\"2154\":1,\"2157\":1,\"2240\":1}}],[\"replacing\",{\"1\":{\"193\":2}}],[\"replace\",{\"1\":{\"137\":3,\"138\":3,\"160\":3,\"161\":3,\"168\":1,\"169\":1,\"184\":3,\"185\":3,\"192\":1,\"193\":1,\"220\":3,\"221\":3,\"226\":1,\"228\":1,\"229\":1,\"250\":3,\"251\":3,\"256\":1,\"258\":1,\"259\":1,\"280\":3,\"281\":3,\"286\":1,\"288\":1,\"289\":1,\"326\":3,\"327\":3,\"332\":1,\"334\":1,\"335\":1,\"372\":3,\"373\":3,\"378\":1,\"380\":1,\"381\":1,\"717\":3,\"718\":3,\"723\":1,\"725\":1,\"726\":1,\"940\":3,\"941\":3,\"946\":1,\"948\":1,\"949\":1}}],[\"reproduction\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"reproduce\",{\"1\":{\"99\":1,\"100\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"representation\",{\"1\":{\"68\":1}}],[\"repo\",{\"1\":{\"63\":1}}],[\"repository\",{\"1\":{\"55\":1,\"63\":2,\"89\":1,\"90\":1,\"92\":1,\"99\":1,\"300\":1,\"303\":2,\"350\":1,\"353\":2,\"691\":1,\"694\":2,\"898\":1,\"901\":2}}],[\"repositories\",{\"1\":{\"0\":1,\"302\":2,\"352\":2,\"693\":2,\"900\":2}}],[\"reports\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"reported\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"reporting\",{\"1\":{\"90\":1,\"97\":1,\"98\":1,\"101\":1}}],[\"report\",{\"0\":{\"99\":1},\"1\":{\"8\":1,\"29\":1,\"35\":1,\"100\":1,\"101\":1,\"210\":2,\"240\":2,\"270\":2,\"305\":4,\"316\":2,\"355\":4,\"362\":2,\"696\":4,\"707\":2,\"903\":4,\"929\":1}}],[\"recipient\",{\"1\":{\"427\":2,\"428\":2,\"578\":2,\"579\":2,\"796\":2,\"797\":2,\"1019\":2,\"1020\":2,\"1180\":2,\"1181\":2,\"1373\":2,\"1374\":2,\"1563\":2,\"1564\":2,\"1769\":2,\"1770\":2,\"1959\":2,\"1960\":2,\"2178\":2,\"2179\":2}}],[\"recreating\",{\"1\":{\"167\":1,\"191\":1,\"227\":1,\"257\":1,\"287\":1,\"333\":1,\"379\":1,\"724\":1,\"947\":1}}],[\"receipt\",{\"1\":{\"100\":1}}],[\"received\",{\"1\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"receive\",{\"1\":{\"58\":1,\"70\":2,\"71\":1,\"90\":1,\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"recommand\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"recommendation\",{\"1\":{\"383\":1,\"385\":1,\"387\":1,\"389\":1,\"390\":1,\"392\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":1,\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"406\":1,\"409\":1,\"413\":1,\"414\":1,\"415\":1,\"420\":1,\"425\":1,\"426\":1,\"429\":1,\"430\":1,\"432\":1,\"435\":1,\"436\":1,\"438\":1,\"440\":1,\"445\":1,\"446\":1,\"448\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"467\":1,\"468\":1,\"469\":1,\"470\":1,\"471\":1,\"472\":1,\"474\":1,\"476\":1,\"478\":1,\"480\":1,\"482\":1,\"483\":1,\"486\":1,\"487\":1,\"490\":1,\"492\":1,\"494\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"513\":1,\"514\":1,\"516\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"534\":1,\"536\":1,\"538\":1,\"540\":1,\"541\":1,\"543\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"557\":1,\"560\":1,\"564\":1,\"565\":1,\"566\":1,\"571\":1,\"576\":1,\"577\":1,\"580\":1,\"581\":1,\"583\":1,\"586\":1,\"587\":1,\"589\":1,\"591\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"620\":1,\"621\":1,\"622\":1,\"623\":1,\"624\":1,\"625\":1,\"627\":1,\"629\":1,\"631\":1,\"633\":1,\"635\":1,\"636\":1,\"639\":1,\"640\":1,\"641\":1,\"643\":1,\"644\":1,\"646\":1,\"648\":1,\"652\":1,\"653\":1,\"655\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"731\":1,\"732\":1,\"734\":1,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"752\":1,\"754\":1,\"756\":1,\"758\":1,\"759\":1,\"761\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"789\":1,\"794\":1,\"795\":1,\"798\":1,\"799\":1,\"804\":1,\"807\":1,\"808\":1,\"811\":1,\"813\":1,\"827\":1,\"828\":1,\"829\":1,\"830\":1,\"831\":1,\"832\":1,\"834\":1,\"836\":1,\"838\":1,\"840\":1,\"842\":1,\"843\":1,\"846\":1,\"847\":1,\"848\":1,\"851\":1,\"853\":1,\"855\":1,\"859\":1,\"860\":1,\"862\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"954\":1,\"955\":1,\"957\":1,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"975\":1,\"977\":1,\"979\":1,\"981\":1,\"982\":1,\"984\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1012\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1022\":1,\"1027\":1,\"1030\":1,\"1031\":1,\"1034\":1,\"1036\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1055\":1,\"1057\":1,\"1059\":1,\"1061\":1,\"1063\":1,\"1065\":1,\"1066\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1074\":1,\"1076\":1,\"1078\":1,\"1082\":1,\"1083\":1,\"1085\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1115\":1,\"1116\":1,\"1118\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1136\":1,\"1138\":1,\"1140\":1,\"1142\":1,\"1143\":1,\"1145\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1173\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1183\":1,\"1188\":1,\"1191\":1,\"1192\":1,\"1195\":1,\"1197\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1232\":1,\"1234\":1,\"1236\":1,\"1238\":1,\"1240\":1,\"1242\":1,\"1243\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1251\":1,\"1253\":1,\"1255\":1,\"1259\":1,\"1260\":1,\"1262\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1308\":1,\"1309\":1,\"1311\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1329\":1,\"1331\":1,\"1333\":1,\"1335\":1,\"1336\":1,\"1338\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1366\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1376\":1,\"1381\":1,\"1384\":1,\"1385\":1,\"1388\":1,\"1390\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1425\":1,\"1427\":1,\"1429\":1,\"1431\":1,\"1433\":1,\"1435\":1,\"1436\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1444\":1,\"1446\":1,\"1448\":1,\"1452\":1,\"1453\":1,\"1455\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1495\":1,\"1496\":1,\"1498\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1516\":1,\"1518\":1,\"1520\":1,\"1522\":1,\"1523\":1,\"1525\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1556\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1566\":1,\"1571\":1,\"1574\":1,\"1575\":1,\"1579\":1,\"1582\":1,\"1584\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1622\":1,\"1623\":1,\"1624\":1,\"1626\":1,\"1628\":1,\"1630\":1,\"1632\":1,\"1634\":1,\"1635\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1646\":1,\"1649\":1,\"1651\":1,\"1655\":1,\"1656\":1,\"1658\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1704\":1,\"1705\":1,\"1707\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1725\":1,\"1727\":1,\"1729\":1,\"1731\":1,\"1732\":1,\"1734\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1762\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1772\":1,\"1777\":1,\"1780\":1,\"1781\":1,\"1784\":1,\"1786\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1805\":1,\"1807\":1,\"1809\":1,\"1811\":1,\"1813\":1,\"1815\":1,\"1816\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1824\":1,\"1826\":1,\"1828\":1,\"1832\":1,\"1833\":1,\"1835\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1891\":1,\"1892\":1,\"1894\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1912\":1,\"1914\":1,\"1916\":1,\"1918\":1,\"1919\":1,\"1921\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1952\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1962\":1,\"1967\":1,\"1970\":1,\"1971\":1,\"1975\":1,\"1978\":1,\"1980\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2018\":1,\"2019\":1,\"2020\":1,\"2022\":1,\"2024\":1,\"2026\":1,\"2028\":1,\"2030\":1,\"2031\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2042\":1,\"2045\":1,\"2047\":1,\"2051\":1,\"2052\":1,\"2054\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2110\":1,\"2111\":1,\"2113\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2131\":1,\"2133\":1,\"2135\":1,\"2137\":1,\"2138\":1,\"2140\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2171\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2181\":1,\"2186\":1,\"2189\":1,\"2190\":1,\"2194\":1,\"2197\":1,\"2199\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2237\":1,\"2238\":1,\"2239\":1,\"2241\":1,\"2243\":1,\"2245\":1,\"2247\":1,\"2249\":1,\"2250\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2261\":1,\"2264\":1,\"2266\":1,\"2270\":1,\"2271\":1,\"2273\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"recommended\",{\"1\":{\"64\":1,\"95\":1,\"137\":3,\"138\":3,\"160\":3,\"161\":3,\"184\":3,\"185\":3,\"220\":3,\"221\":3,\"250\":3,\"251\":3,\"280\":3,\"281\":3,\"326\":3,\"327\":3,\"372\":3,\"373\":3,\"717\":3,\"718\":3,\"940\":3,\"941\":3}}],[\"recommend\",{\"1\":{\"57\":1,\"119\":2,\"122\":1,\"144\":2,\"147\":1,\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"194\":2,\"197\":1,\"198\":2,\"201\":1,\"228\":1,\"229\":1,\"230\":2,\"233\":1,\"258\":1,\"259\":1,\"260\":2,\"263\":1,\"288\":1,\"289\":1,\"305\":1,\"306\":2,\"309\":1,\"334\":1,\"335\":1,\"336\":2,\"339\":1,\"355\":1,\"380\":1,\"381\":1,\"696\":1,\"697\":2,\"700\":1,\"725\":1,\"726\":1,\"903\":1,\"904\":2,\"907\":1,\"948\":1,\"949\":1}}],[\"recognizing\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"recognize\",{\"1\":{\"100\":1}}],[\"recognition\",{\"1\":{\"100\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"recorded\",{\"0\":{\"40\":1,\"86\":1}}],[\"record\",{\"1\":{\"0\":1,\"39\":1,\"42\":1,\"63\":2,\"81\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"reason\",{\"1\":{\"99\":1}}],[\"reasons\",{\"1\":{\"55\":1}}],[\"readable\",{\"1\":{\"931\":1}}],[\"reading\",{\"1\":{\"305\":1,\"355\":1,\"401\":1,\"404\":1,\"471\":1,\"488\":1,\"552\":1,\"555\":1,\"624\":1,\"642\":1,\"696\":1,\"771\":1,\"774\":1,\"831\":1,\"849\":1,\"903\":1,\"994\":1,\"997\":1,\"1054\":1,\"1072\":1,\"1155\":1,\"1158\":1,\"1231\":1,\"1249\":1,\"1348\":1,\"1351\":1,\"1424\":1,\"1442\":1,\"1538\":1,\"1541\":1,\"1623\":1,\"1644\":1,\"1744\":1,\"1747\":1,\"1804\":1,\"1822\":1,\"1934\":1,\"1937\":1,\"2019\":1,\"2040\":1,\"2153\":1,\"2156\":1,\"2238\":1,\"2259\":1}}],[\"reader\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"ready\",{\"1\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"read\",{\"0\":{\"401\":1,\"404\":1,\"471\":1,\"552\":1,\"555\":1,\"624\":1,\"771\":1,\"774\":1,\"831\":1,\"994\":1,\"997\":1,\"1054\":1,\"1155\":1,\"1158\":1,\"1231\":1,\"1348\":1,\"1351\":1,\"1424\":1,\"1538\":1,\"1541\":1,\"1623\":1,\"1744\":1,\"1747\":1,\"1804\":1,\"1934\":1,\"1937\":1,\"2019\":1,\"2153\":1,\"2156\":1,\"2238\":1},\"1\":{\"50\":1,\"54\":2,\"60\":1,\"125\":1,\"127\":2,\"137\":2,\"148\":1,\"150\":2,\"160\":2,\"172\":1,\"174\":2,\"184\":2,\"204\":1,\"206\":2,\"220\":2,\"234\":1,\"236\":2,\"250\":2,\"264\":1,\"266\":2,\"280\":2,\"310\":1,\"312\":2,\"326\":2,\"356\":1,\"358\":2,\"372\":2,\"401\":1,\"404\":1,\"408\":1,\"471\":1,\"485\":1,\"552\":1,\"555\":1,\"559\":1,\"610\":4,\"616\":1,\"618\":5,\"624\":1,\"638\":1,\"701\":1,\"703\":2,\"717\":2,\"771\":1,\"774\":1,\"778\":1,\"817\":4,\"823\":1,\"825\":5,\"831\":1,\"845\":1,\"924\":1,\"926\":2,\"940\":2,\"994\":1,\"997\":1,\"1001\":1,\"1040\":4,\"1046\":1,\"1048\":5,\"1054\":1,\"1068\":1,\"1155\":1,\"1158\":1,\"1162\":1,\"1217\":4,\"1223\":1,\"1225\":5,\"1231\":1,\"1245\":1,\"1348\":1,\"1351\":1,\"1355\":1,\"1410\":4,\"1416\":1,\"1418\":5,\"1424\":1,\"1438\":1,\"1482\":2,\"1538\":1,\"1541\":1,\"1545\":1,\"1609\":4,\"1615\":1,\"1617\":5,\"1623\":1,\"1640\":1,\"1744\":1,\"1747\":1,\"1751\":1,\"1790\":4,\"1796\":1,\"1798\":5,\"1804\":1,\"1818\":1,\"1878\":2,\"1934\":1,\"1937\":1,\"1941\":1,\"2005\":4,\"2011\":1,\"2013\":5,\"2019\":1,\"2036\":1,\"2097\":2,\"2153\":1,\"2156\":1,\"2160\":1,\"2224\":4,\"2230\":1,\"2232\":5,\"2238\":1,\"2255\":1}}],[\"reach\",{\"1\":{\"27\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"realms\",{\"1\":{\"457\":1,\"525\":1,\"664\":1,\"678\":1,\"743\":1,\"871\":1,\"885\":1,\"966\":1,\"1094\":1,\"1108\":1,\"1127\":1,\"1271\":1,\"1285\":1,\"1320\":1,\"1464\":1,\"1478\":1,\"1507\":1,\"1589\":1,\"1667\":1,\"1681\":1,\"1716\":1,\"1844\":1,\"1858\":1,\"1903\":1,\"1985\":1,\"2063\":1,\"2077\":1,\"2122\":1,\"2204\":1,\"2282\":1,\"2296\":1}}],[\"realm\",{\"0\":{\"457\":1,\"525\":1,\"664\":1,\"743\":1,\"871\":1,\"966\":1,\"1094\":1,\"1127\":1,\"1271\":1,\"1320\":1,\"1464\":1,\"1507\":1,\"1667\":1,\"1716\":1,\"1844\":1,\"1903\":1,\"2063\":1,\"2122\":1,\"2282\":1},\"1\":{\"445\":1,\"448\":1,\"457\":3,\"513\":1,\"516\":1,\"525\":3,\"652\":1,\"655\":1,\"664\":3,\"675\":1,\"676\":1,\"678\":1,\"731\":1,\"734\":1,\"743\":3,\"859\":1,\"862\":1,\"871\":3,\"882\":1,\"883\":1,\"885\":1,\"954\":1,\"957\":1,\"966\":3,\"1082\":1,\"1085\":1,\"1094\":3,\"1105\":1,\"1106\":1,\"1108\":1,\"1115\":1,\"1118\":1,\"1127\":3,\"1259\":1,\"1262\":1,\"1271\":3,\"1282\":1,\"1283\":1,\"1285\":1,\"1308\":1,\"1311\":1,\"1320\":3,\"1452\":1,\"1455\":1,\"1464\":3,\"1475\":1,\"1476\":1,\"1478\":1,\"1495\":1,\"1498\":1,\"1507\":3,\"1587\":1,\"1589\":1,\"1655\":1,\"1658\":1,\"1667\":3,\"1678\":1,\"1679\":1,\"1681\":1,\"1704\":1,\"1707\":1,\"1716\":3,\"1832\":1,\"1835\":1,\"1844\":3,\"1855\":1,\"1856\":1,\"1858\":1,\"1891\":1,\"1894\":1,\"1903\":3,\"1983\":1,\"1985\":1,\"2051\":1,\"2054\":1,\"2063\":3,\"2074\":1,\"2075\":1,\"2077\":1,\"2110\":1,\"2113\":1,\"2122\":3,\"2202\":1,\"2204\":1,\"2270\":1,\"2273\":1,\"2282\":3,\"2293\":1,\"2294\":1,\"2296\":1}}],[\"realistic\",{\"1\":{\"67\":1}}],[\"real\",{\"1\":{\"20\":1,\"26\":1,\"81\":3,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"re\",{\"1\":{\"27\":3,\"303\":3,\"304\":1,\"305\":1,\"353\":3,\"354\":1,\"355\":1,\"694\":3,\"695\":1,\"696\":1,\"901\":3,\"902\":1,\"903\":1}}],[\"relevant\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"releases\",{\"1\":{\"209\":2,\"210\":2,\"211\":1,\"239\":2,\"240\":2,\"241\":1,\"269\":2,\"270\":3,\"271\":1,\"305\":3,\"315\":2,\"316\":3,\"317\":1,\"355\":3,\"361\":2,\"362\":3,\"363\":1,\"696\":3,\"706\":2,\"707\":4,\"708\":1,\"903\":3,\"931\":1}}],[\"released\",{\"1\":{\"193\":1,\"929\":2}}],[\"release\",{\"0\":{\"2318\":1},\"1\":{\"35\":2,\"100\":1,\"105\":2,\"107\":2,\"108\":1,\"109\":2,\"110\":1,\"111\":2,\"112\":1,\"113\":2,\"114\":1,\"115\":2,\"116\":1,\"117\":2,\"118\":1,\"123\":2,\"124\":1,\"132\":2,\"143\":1,\"155\":2,\"166\":1,\"170\":2,\"171\":1,\"179\":2,\"190\":1,\"202\":2,\"203\":1,\"215\":2,\"226\":1,\"245\":2,\"256\":1,\"275\":2,\"286\":1,\"294\":1,\"295\":1,\"299\":1,\"302\":1,\"321\":2,\"332\":1,\"344\":1,\"345\":1,\"349\":1,\"352\":1,\"367\":2,\"378\":1,\"685\":1,\"686\":1,\"690\":1,\"693\":1,\"712\":2,\"723\":1,\"892\":1,\"893\":1,\"897\":1,\"900\":1,\"935\":2,\"946\":1}}],[\"relies\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"reliably\",{\"1\":{\"62\":1}}],[\"reliability\",{\"1\":{\"20\":1,\"26\":1}}],[\"relying\",{\"1\":{\"89\":1}}],[\"relationships\",{\"1\":{\"62\":1}}],[\"related\",{\"1\":{\"10\":1,\"99\":1}}],[\"resolution\",{\"1\":{\"100\":1}}],[\"resolves\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"resolved\",{\"1\":{\"100\":1}}],[\"resolve\",{\"1\":{\"100\":2,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"719\":1,\"847\":1,\"942\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"resource\",{\"0\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1},\"1\":{\"53\":2,\"59\":1,\"63\":2,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"401\":1,\"404\":1,\"471\":1,\"490\":2,\"552\":1,\"555\":1,\"617\":1,\"624\":1,\"644\":2,\"718\":1,\"771\":1,\"774\":1,\"824\":1,\"831\":1,\"851\":2,\"941\":1,\"994\":1,\"997\":1,\"1047\":1,\"1054\":1,\"1074\":2,\"1155\":1,\"1158\":1,\"1224\":1,\"1231\":1,\"1251\":2,\"1348\":1,\"1351\":1,\"1417\":1,\"1424\":1,\"1444\":2,\"1538\":1,\"1541\":1,\"1579\":2,\"1616\":1,\"1623\":1,\"1646\":2,\"1744\":1,\"1747\":1,\"1797\":1,\"1804\":1,\"1824\":2,\"1934\":1,\"1937\":1,\"1975\":2,\"2012\":1,\"2019\":1,\"2042\":2,\"2153\":1,\"2156\":1,\"2194\":2,\"2231\":1,\"2238\":1,\"2261\":2}}],[\"resources\",{\"1\":{\"20\":1,\"37\":1,\"49\":2,\"53\":1,\"54\":4,\"59\":5,\"61\":2,\"63\":8,\"66\":1,\"73\":2,\"89\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"407\":1,\"408\":1,\"412\":1,\"485\":1,\"488\":1,\"558\":1,\"559\":1,\"563\":1,\"617\":1,\"638\":1,\"642\":1,\"718\":1,\"777\":1,\"778\":1,\"781\":1,\"824\":1,\"845\":1,\"849\":1,\"941\":1,\"1000\":1,\"1001\":1,\"1004\":1,\"1047\":1,\"1068\":1,\"1072\":1,\"1161\":1,\"1162\":1,\"1165\":1,\"1224\":1,\"1245\":1,\"1249\":1,\"1354\":1,\"1355\":1,\"1358\":1,\"1417\":1,\"1438\":1,\"1442\":1,\"1544\":1,\"1545\":1,\"1548\":1,\"1616\":1,\"1640\":1,\"1644\":1,\"1750\":1,\"1751\":1,\"1754\":1,\"1797\":1,\"1818\":1,\"1822\":1,\"1940\":1,\"1941\":1,\"1944\":1,\"2012\":1,\"2036\":1,\"2040\":1,\"2159\":1,\"2160\":1,\"2163\":1,\"2231\":1,\"2255\":1,\"2259\":1}}],[\"results\",{\"1\":{\"90\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"resulting\",{\"1\":{\"10\":1,\"84\":1}}],[\"restart\",{\"1\":{\"168\":2,\"169\":1,\"192\":2,\"193\":1,\"228\":2,\"229\":1,\"258\":2,\"259\":1,\"288\":2,\"289\":1,\"334\":2,\"335\":1,\"380\":2,\"381\":1,\"725\":2,\"726\":1,\"948\":2,\"949\":1}}],[\"restful\",{\"1\":{\"59\":1}}],[\"rest\",{\"1\":{\"58\":1,\"192\":1,\"610\":1,\"616\":1,\"674\":2,\"817\":1,\"823\":1,\"881\":2,\"1040\":1,\"1046\":1,\"1104\":2,\"1217\":1,\"1223\":1,\"1281\":2,\"1410\":1,\"1416\":1,\"1474\":2,\"1609\":1,\"1615\":1,\"1677\":2,\"1790\":1,\"1796\":1,\"1854\":2,\"2005\":1,\"2011\":1,\"2073\":2,\"2224\":1,\"2230\":1,\"2292\":2}}],[\"restricted\",{\"1\":{\"25\":1}}],[\"responsibly\",{\"1\":{\"101\":1}}],[\"responsible\",{\"0\":{\"98\":1},\"1\":{\"52\":1,\"97\":1,\"98\":1,\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"703\":1,\"926\":1}}],[\"response\",{\"0\":{\"407\":1,\"558\":1,\"777\":1,\"1000\":1,\"1161\":1,\"1354\":1,\"1544\":1,\"1750\":1,\"1940\":1,\"2159\":1},\"1\":{\"71\":1,\"407\":2,\"558\":2,\"777\":2,\"1000\":2,\"1161\":2,\"1354\":2,\"1544\":2,\"1750\":2,\"1940\":2,\"2159\":2}}],[\"respective\",{\"1\":{\"10\":1,\"134\":1,\"157\":1,\"181\":1,\"207\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"researchers\",{\"1\":{\"89\":2,\"98\":1}}],[\"researcher\",{\"1\":{\"62\":1,\"88\":1}}],[\"researchstudy\",{\"1\":{\"61\":1}}],[\"research\",{\"1\":{\"0\":2,\"10\":1,\"11\":2,\"13\":4,\"20\":2,\"21\":2,\"24\":1,\"26\":1,\"27\":3,\"39\":2,\"42\":1,\"47\":1,\"49\":1,\"55\":3,\"62\":8,\"66\":1,\"80\":4,\"81\":4,\"84\":1,\"88\":2,\"89\":4,\"91\":3,\"92\":1}}],[\"r4\",{\"1\":{\"0\":1,\"20\":1,\"21\":1,\"24\":1,\"52\":1,\"66\":1,\"89\":1,\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"08\",{\"1\":{\"929\":1}}],[\"06\",{\"1\":{\"29\":1}}],[\"00474993fa261b0225f93c5a66aa6fcc\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"00\",{\"1\":{\"29\":6,\"103\":2}}],[\"01zz1802a\",{\"1\":{\"11\":1}}],[\"01zz1802e\",{\"1\":{\"11\":1}}],[\"01zz2307c\",{\"1\":{\"10\":1}}],[\"01zz2307b\",{\"1\":{\"10\":1}}],[\"01zz2307a\",{\"1\":{\"10\":1}}],[\"0\",{\"0\":{\"105\":2,\"107\":1,\"109\":1,\"111\":1,\"117\":1,\"122\":1,\"123\":1,\"129\":2,\"143\":1,\"147\":1,\"152\":1,\"166\":1,\"176\":1,\"190\":1,\"191\":1,\"197\":1,\"201\":1,\"212\":1,\"226\":1,\"227\":1,\"233\":1,\"256\":1,\"257\":1,\"263\":1,\"286\":1,\"309\":1,\"318\":1,\"332\":1,\"333\":1,\"339\":1,\"364\":1,\"378\":1,\"700\":1,\"723\":1,\"724\":1,\"907\":1,\"946\":1},\"1\":{\"0\":1,\"20\":1,\"21\":1,\"35\":13,\"36\":1,\"52\":1,\"62\":1,\"63\":3,\"66\":1,\"80\":1,\"81\":1,\"85\":1,\"89\":1,\"105\":7,\"107\":4,\"109\":4,\"111\":4,\"113\":4,\"115\":4,\"117\":5,\"121\":1,\"122\":2,\"123\":4,\"129\":2,\"132\":2,\"137\":4,\"138\":4,\"142\":3,\"143\":4,\"146\":1,\"147\":2,\"152\":2,\"155\":2,\"160\":2,\"161\":2,\"165\":2,\"166\":4,\"167\":5,\"168\":8,\"169\":9,\"170\":4,\"176\":2,\"179\":2,\"184\":2,\"185\":2,\"189\":2,\"190\":4,\"191\":4,\"192\":6,\"193\":20,\"196\":1,\"197\":2,\"200\":1,\"201\":2,\"202\":3,\"212\":1,\"215\":2,\"220\":2,\"221\":2,\"225\":2,\"226\":8,\"227\":9,\"228\":6,\"229\":8,\"232\":1,\"233\":2,\"242\":1,\"245\":2,\"255\":1,\"256\":8,\"257\":6,\"258\":2,\"259\":1,\"262\":1,\"263\":2,\"272\":1,\"275\":2,\"285\":1,\"286\":8,\"287\":5,\"308\":1,\"309\":2,\"318\":1,\"321\":2,\"326\":2,\"327\":2,\"331\":2,\"332\":8,\"333\":7,\"334\":6,\"335\":8,\"338\":1,\"339\":2,\"364\":1,\"367\":2,\"372\":2,\"373\":2,\"377\":2,\"378\":8,\"379\":6,\"380\":4,\"381\":7,\"421\":1,\"442\":6,\"464\":2,\"510\":6,\"532\":2,\"572\":1,\"610\":1,\"614\":1,\"618\":2,\"649\":6,\"671\":2,\"674\":1,\"678\":1,\"699\":1,\"700\":2,\"709\":1,\"712\":2,\"722\":1,\"723\":8,\"724\":6,\"725\":2,\"726\":1,\"728\":6,\"750\":2,\"790\":1,\"804\":1,\"809\":1,\"817\":1,\"821\":1,\"825\":2,\"856\":6,\"878\":2,\"881\":1,\"885\":1,\"906\":1,\"907\":2,\"929\":20,\"931\":8,\"932\":1,\"935\":2,\"945\":1,\"946\":8,\"947\":5,\"951\":6,\"973\":2,\"1013\":1,\"1027\":1,\"1032\":1,\"1040\":1,\"1044\":1,\"1048\":2,\"1079\":6,\"1101\":2,\"1104\":1,\"1108\":1,\"1112\":6,\"1134\":2,\"1174\":1,\"1188\":1,\"1193\":1,\"1217\":1,\"1221\":1,\"1225\":2,\"1256\":6,\"1278\":2,\"1281\":1,\"1305\":6,\"1327\":2,\"1367\":1,\"1381\":1,\"1386\":1,\"1410\":1,\"1414\":1,\"1418\":2,\"1449\":6,\"1471\":2,\"1474\":1,\"1482\":1,\"1486\":1,\"1490\":2,\"1492\":6,\"1514\":2,\"1557\":1,\"1571\":1,\"1576\":1,\"1586\":1,\"1589\":1,\"1609\":1,\"1613\":1,\"1617\":2,\"1652\":6,\"1674\":2,\"1677\":1,\"1681\":1,\"1701\":6,\"1723\":2,\"1763\":1,\"1777\":1,\"1782\":1,\"1790\":1,\"1794\":1,\"1798\":2,\"1829\":6,\"1851\":2,\"1854\":1,\"1858\":1,\"1878\":1,\"1882\":1,\"1886\":2,\"1888\":6,\"1910\":2,\"1953\":1,\"1967\":1,\"1972\":1,\"1982\":1,\"2005\":1,\"2009\":1,\"2013\":2,\"2048\":6,\"2070\":2,\"2073\":1,\"2097\":1,\"2101\":1,\"2105\":2,\"2107\":6,\"2129\":2,\"2172\":1,\"2186\":1,\"2191\":1,\"2201\":1,\"2224\":1,\"2228\":1,\"2232\":2,\"2267\":6,\"2289\":2,\"2292\":1}}],[\"2202\",{\"1\":{\"138\":3,\"161\":3,\"185\":3,\"221\":3,\"251\":3,\"281\":3,\"327\":3,\"373\":3,\"718\":3,\"941\":3}}],[\"2101\",{\"1\":{\"137\":3,\"160\":3,\"184\":3,\"220\":3,\"250\":3,\"280\":3,\"326\":3,\"372\":3,\"717\":3,\"940\":3}}],[\"2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c\",{\"1\":{\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"24\",{\"1\":{\"69\":1,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"28\",{\"1\":{\"39\":1,\"498\":1,\"595\":1,\"909\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"283\",{\"1\":{\"39\":1}}],[\"25\",{\"1\":{\"88\":1}}],[\"256\",{\"1\":{\"39\":1}}],[\"252\",{\"1\":{\"39\":1}}],[\"296\",{\"1\":{\"39\":1}}],[\"294\",{\"1\":{\"39\":1}}],[\"278\",{\"1\":{\"39\":3}}],[\"27\",{\"1\":{\"36\":1}}],[\"2000\",{\"1\":{\"400\":1,\"470\":1,\"551\":1,\"623\":1,\"770\":1,\"830\":1,\"993\":1,\"1053\":1,\"1154\":1,\"1230\":1,\"1347\":1,\"1423\":1,\"1537\":1,\"1622\":1,\"1743\":1,\"1803\":1,\"1933\":1,\"2018\":1,\"2152\":1,\"2237\":1}}],[\"20\",{\"1\":{\"131\":2,\"154\":2,\"178\":2,\"214\":2,\"244\":2,\"274\":2,\"320\":2,\"366\":2,\"488\":1,\"642\":1,\"711\":2,\"849\":1,\"934\":2,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1}}],[\"2018\",{\"0\":{\"11\":1}}],[\"2020\",{\"0\":{\"42\":1},\"1\":{\"91\":1}}],[\"2024\",{\"1\":{\"39\":1,\"929\":1}}],[\"2021\",{\"1\":{\"39\":4}}],[\"2022\",{\"0\":{\"11\":1,\"41\":1},\"1\":{\"39\":2,\"85\":1,\"91\":1}}],[\"2026\",{\"0\":{\"10\":1}}],[\"2023\",{\"0\":{\"10\":1,\"79\":1},\"1\":{\"1\":1,\"39\":2,\"85\":1}}],[\"2bjson\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"2b\",{\"1\":{\"10\":1}}],[\"2\",{\"0\":{\"109\":1,\"115\":1,\"176\":1,\"202\":1,\"227\":1,\"272\":1,\"379\":1,\"932\":1},\"1\":{\"0\":1,\"20\":1,\"21\":1,\"52\":1,\"62\":2,\"63\":1,\"66\":1,\"80\":1,\"81\":1,\"89\":1,\"109\":1,\"115\":1,\"123\":1,\"127\":1,\"150\":1,\"174\":1,\"184\":2,\"185\":2,\"189\":1,\"191\":1,\"192\":4,\"193\":8,\"202\":1,\"206\":1,\"227\":3,\"228\":2,\"229\":1,\"236\":1,\"257\":2,\"266\":1,\"280\":2,\"281\":2,\"287\":3,\"288\":4,\"289\":7,\"312\":1,\"333\":2,\"358\":1,\"379\":3,\"380\":2,\"381\":1,\"384\":2,\"475\":2,\"535\":2,\"610\":1,\"613\":1,\"614\":1,\"618\":2,\"628\":2,\"674\":1,\"703\":1,\"724\":2,\"753\":2,\"817\":1,\"820\":1,\"821\":1,\"825\":2,\"835\":2,\"881\":1,\"885\":1,\"926\":1,\"929\":2,\"940\":2,\"941\":2,\"945\":1,\"947\":3,\"948\":4,\"949\":7,\"976\":2,\"1040\":1,\"1043\":1,\"1044\":1,\"1048\":2,\"1058\":2,\"1104\":1,\"1137\":2,\"1217\":1,\"1220\":1,\"1221\":1,\"1225\":2,\"1235\":2,\"1281\":1,\"1330\":2,\"1410\":1,\"1413\":1,\"1414\":1,\"1418\":2,\"1428\":2,\"1474\":1,\"1478\":1,\"1482\":1,\"1485\":1,\"1486\":1,\"1490\":2,\"1517\":2,\"1586\":1,\"1609\":1,\"1612\":1,\"1613\":1,\"1617\":2,\"1627\":2,\"1677\":1,\"1726\":2,\"1790\":1,\"1793\":1,\"1794\":1,\"1798\":2,\"1808\":2,\"1854\":1,\"1878\":1,\"1881\":1,\"1882\":1,\"1886\":2,\"1913\":2,\"1982\":1,\"2005\":1,\"2008\":1,\"2009\":1,\"2013\":2,\"2023\":2,\"2073\":1,\"2097\":1,\"2100\":1,\"2101\":1,\"2105\":2,\"2132\":2,\"2201\":1,\"2204\":1,\"2224\":1,\"2227\":1,\"2228\":1,\"2232\":2,\"2242\":2,\"2292\":1,\"2296\":1}}],[\"browsing\",{\"1\":{\"169\":1,\"193\":1,\"229\":1,\"259\":1,\"289\":1,\"335\":1,\"381\":1,\"726\":1,\"949\":1}}],[\"browsers\",{\"1\":{\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"browser\",{\"1\":{\"63\":1,\"83\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"126\":1,\"149\":1,\"171\":1,\"173\":1,\"192\":1,\"203\":1,\"205\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"610\":1,\"704\":1,\"817\":1,\"927\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"bridge\",{\"1\":{\"60\":1}}],[\"branches\",{\"1\":{\"294\":2,\"295\":1,\"344\":2,\"345\":1,\"685\":2,\"686\":1,\"892\":2,\"893\":1}}],[\"branch\",{\"0\":{\"295\":1,\"345\":1,\"686\":1,\"893\":1},\"1\":{\"7\":1,\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"branching\",{\"0\":{\"294\":1,\"344\":1,\"685\":1,\"892\":1},\"1\":{\"7\":1,\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"boarding\",{\"0\":{\"140\":1,\"163\":1,\"187\":1,\"223\":1,\"253\":1,\"283\":1,\"329\":1,\"375\":1,\"720\":1,\"943\":1},\"1\":{\"140\":1,\"163\":1,\"187\":1,\"223\":1,\"253\":1,\"283\":1,\"329\":1,\"375\":1,\"720\":1,\"943\":1}}],[\"boxes\",{\"1\":{\"67\":1}}],[\"box\",{\"1\":{\"59\":1}}],[\"both\",{\"1\":{\"58\":1,\"73\":1,\"99\":1,\"132\":1,\"139\":1,\"155\":1,\"162\":1,\"179\":1,\"186\":1,\"215\":1,\"222\":1,\"245\":1,\"252\":1,\"275\":1,\"282\":1,\"321\":1,\"328\":1,\"367\":1,\"374\":1,\"712\":1,\"719\":1,\"935\":1,\"942\":1}}],[\"boundaries\",{\"1\":{\"0\":1,\"21\":1,\"62\":1,\"89\":1}}],[\"bpe\",{\"0\":{\"54\":1,\"138\":1,\"161\":1,\"169\":1,\"185\":1,\"193\":1,\"221\":1,\"229\":1,\"251\":1,\"259\":1,\"281\":1,\"289\":1,\"327\":1,\"335\":1,\"373\":1,\"381\":1,\"382\":1,\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"387\":1,\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":2,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"538\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":2,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"592\":1,\"718\":1,\"726\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"756\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":2,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"814\":1,\"941\":1,\"949\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"979\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":2,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1037\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":2,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1198\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":2,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1391\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":2,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1590\":1,\"1606\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":2,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1787\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":2,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1986\":1,\"2002\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":2,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2205\":1,\"2221\":1},\"1\":{\"52\":2,\"54\":7,\"60\":1,\"63\":5,\"66\":1,\"73\":1,\"77\":2,\"126\":1,\"131\":1,\"133\":1,\"134\":4,\"136\":1,\"138\":25,\"139\":5,\"143\":3,\"149\":1,\"154\":1,\"156\":1,\"157\":4,\"159\":1,\"161\":25,\"162\":5,\"165\":1,\"166\":3,\"169\":11,\"173\":1,\"178\":1,\"180\":1,\"181\":4,\"183\":1,\"185\":25,\"186\":5,\"189\":1,\"190\":3,\"193\":12,\"205\":1,\"214\":1,\"216\":1,\"217\":4,\"219\":1,\"221\":25,\"222\":5,\"225\":1,\"226\":5,\"229\":11,\"235\":1,\"244\":1,\"246\":1,\"247\":4,\"249\":1,\"251\":24,\"252\":5,\"255\":1,\"256\":5,\"259\":11,\"265\":1,\"274\":1,\"276\":1,\"277\":4,\"279\":1,\"281\":24,\"282\":5,\"285\":1,\"286\":5,\"289\":11,\"311\":1,\"320\":1,\"322\":1,\"323\":4,\"325\":1,\"327\":24,\"328\":5,\"331\":2,\"332\":5,\"335\":11,\"357\":1,\"366\":1,\"368\":1,\"369\":4,\"371\":1,\"373\":24,\"374\":5,\"377\":1,\"378\":5,\"381\":11,\"383\":1,\"384\":1,\"385\":3,\"386\":2,\"387\":3,\"388\":2,\"389\":3,\"390\":3,\"391\":3,\"392\":3,\"393\":3,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":3,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":2,\"414\":4,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":4,\"420\":3,\"421\":1,\"422\":1,\"423\":1,\"424\":2,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":2,\"430\":2,\"431\":1,\"432\":2,\"433\":1,\"434\":1,\"435\":3,\"436\":2,\"439\":1,\"463\":2,\"493\":1,\"496\":1,\"531\":2,\"534\":1,\"535\":1,\"536\":3,\"537\":2,\"538\":3,\"539\":2,\"540\":3,\"541\":3,\"542\":3,\"543\":3,\"544\":3,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":3,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":2,\"565\":4,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":4,\"571\":3,\"572\":1,\"573\":1,\"574\":1,\"575\":2,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":2,\"581\":2,\"582\":1,\"583\":2,\"584\":1,\"585\":1,\"586\":3,\"587\":2,\"590\":1,\"647\":1,\"670\":2,\"702\":1,\"711\":1,\"713\":1,\"714\":4,\"716\":1,\"718\":24,\"719\":5,\"722\":2,\"723\":5,\"726\":11,\"749\":2,\"752\":1,\"753\":1,\"754\":3,\"755\":2,\"756\":3,\"757\":2,\"758\":3,\"759\":3,\"760\":3,\"761\":3,\"762\":3,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":3,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":2,\"783\":4,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":4,\"789\":3,\"790\":1,\"791\":1,\"792\":1,\"793\":2,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":2,\"799\":2,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":2,\"805\":1,\"806\":1,\"807\":3,\"808\":2,\"809\":1,\"812\":1,\"854\":1,\"877\":2,\"925\":1,\"929\":1,\"931\":6,\"934\":1,\"936\":1,\"937\":4,\"939\":1,\"941\":24,\"942\":5,\"945\":2,\"946\":5,\"949\":11,\"972\":2,\"975\":1,\"976\":1,\"977\":3,\"978\":2,\"979\":3,\"980\":2,\"981\":3,\"982\":3,\"983\":3,\"984\":3,\"985\":3,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":3,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":2,\"1006\":4,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":4,\"1012\":3,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":2,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":2,\"1022\":2,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":2,\"1028\":1,\"1029\":1,\"1030\":3,\"1031\":2,\"1032\":1,\"1035\":1,\"1077\":1,\"1100\":2,\"1133\":2,\"1136\":1,\"1137\":1,\"1138\":3,\"1139\":2,\"1140\":3,\"1141\":2,\"1142\":3,\"1143\":3,\"1144\":3,\"1145\":3,\"1146\":3,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":3,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":2,\"1167\":4,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":4,\"1173\":3,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":2,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":2,\"1183\":2,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":2,\"1189\":1,\"1190\":1,\"1191\":3,\"1192\":2,\"1193\":1,\"1196\":1,\"1254\":1,\"1277\":2,\"1326\":2,\"1329\":1,\"1330\":1,\"1331\":3,\"1332\":2,\"1333\":3,\"1334\":2,\"1335\":3,\"1336\":3,\"1337\":3,\"1338\":3,\"1339\":3,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":3,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":2,\"1360\":4,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":4,\"1366\":3,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":2,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":2,\"1376\":2,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":2,\"1382\":1,\"1383\":1,\"1384\":3,\"1385\":2,\"1386\":1,\"1389\":1,\"1447\":1,\"1470\":2,\"1482\":5,\"1489\":1,\"1490\":3,\"1513\":2,\"1516\":1,\"1517\":1,\"1518\":3,\"1519\":2,\"1520\":3,\"1521\":2,\"1522\":3,\"1523\":3,\"1524\":3,\"1525\":3,\"1526\":3,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":3,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":2,\"1550\":4,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":4,\"1556\":3,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":2,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":2,\"1566\":2,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":2,\"1572\":1,\"1573\":1,\"1574\":3,\"1575\":2,\"1576\":1,\"1577\":3,\"1578\":1,\"1579\":1,\"1580\":1,\"1583\":1,\"1586\":4,\"1587\":2,\"1588\":1,\"1589\":2,\"1593\":1,\"1594\":1,\"1599\":1,\"1650\":1,\"1673\":2,\"1722\":2,\"1725\":1,\"1726\":1,\"1727\":3,\"1728\":2,\"1729\":3,\"1730\":2,\"1731\":3,\"1732\":3,\"1733\":3,\"1734\":3,\"1735\":3,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":3,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":2,\"1756\":4,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":4,\"1762\":3,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":2,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":2,\"1772\":2,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":2,\"1778\":1,\"1779\":1,\"1780\":3,\"1781\":2,\"1782\":1,\"1785\":1,\"1827\":1,\"1850\":2,\"1878\":5,\"1885\":1,\"1886\":3,\"1909\":2,\"1912\":1,\"1913\":1,\"1914\":3,\"1915\":2,\"1916\":3,\"1917\":2,\"1918\":3,\"1919\":3,\"1920\":3,\"1921\":3,\"1922\":3,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":3,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":2,\"1946\":4,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":4,\"1952\":3,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":2,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":2,\"1962\":2,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":2,\"1968\":1,\"1969\":1,\"1970\":3,\"1971\":2,\"1972\":1,\"1973\":3,\"1974\":1,\"1975\":1,\"1976\":1,\"1979\":1,\"1982\":4,\"1983\":2,\"1984\":1,\"1985\":2,\"1989\":1,\"1990\":1,\"1995\":1,\"2046\":1,\"2069\":2,\"2097\":5,\"2104\":1,\"2105\":3,\"2128\":2,\"2131\":1,\"2132\":1,\"2133\":3,\"2134\":2,\"2135\":3,\"2136\":2,\"2137\":3,\"2138\":3,\"2139\":3,\"2140\":3,\"2141\":3,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":3,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":2,\"2165\":4,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":4,\"2171\":3,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":2,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":2,\"2181\":2,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":2,\"2187\":1,\"2188\":1,\"2189\":3,\"2190\":2,\"2191\":1,\"2192\":3,\"2193\":1,\"2194\":1,\"2195\":1,\"2198\":1,\"2201\":4,\"2202\":2,\"2203\":1,\"2204\":2,\"2208\":1,\"2209\":1,\"2214\":1,\"2265\":1,\"2288\":2}}],[\"bpmn\",{\"0\":{\"60\":1,\"61\":1,\"67\":1},\"1\":{\"0\":2,\"20\":1,\"21\":1,\"41\":1,\"52\":1,\"54\":1,\"57\":2,\"60\":2,\"61\":5,\"62\":1,\"63\":2,\"66\":1,\"67\":3,\"80\":1,\"81\":1,\"89\":1,\"394\":1,\"395\":1,\"396\":2,\"545\":1,\"546\":1,\"547\":2,\"763\":1,\"764\":1,\"765\":2,\"766\":2,\"986\":1,\"987\":1,\"988\":2,\"989\":2,\"1147\":1,\"1148\":1,\"1149\":2,\"1150\":2,\"1340\":1,\"1341\":1,\"1342\":2,\"1343\":2,\"1529\":1,\"1530\":1,\"1531\":2,\"1532\":2,\"1736\":1,\"1737\":1,\"1738\":2,\"1739\":2,\"1925\":1,\"1926\":1,\"1927\":2,\"1928\":2,\"2144\":1,\"2145\":1,\"2146\":2,\"2147\":2}}],[\"block\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"610\":2,\"643\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"817\":2,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1040\":2,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1217\":2,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1410\":2,\"1445\":1,\"1482\":2,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1581\":1,\"1609\":2,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1790\":2,\"1825\":1,\"1878\":2,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1977\":1,\"2005\":2,\"2044\":1,\"2097\":2,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2196\":1,\"2224\":2,\"2263\":1}}],[\"bloom\",{\"1\":{\"63\":1}}],[\"blob\",{\"1\":{\"37\":1}}],[\"blue\",{\"1\":{\"52\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"blaze\",{\"1\":{\"29\":2,\"32\":1,\"36\":1}}],[\"b\",{\"1\":{\"32\":2,\"39\":1,\"67\":1,\"133\":1,\"136\":1,\"137\":2,\"138\":1,\"156\":1,\"159\":1,\"160\":2,\"161\":1,\"180\":1,\"183\":1,\"184\":2,\"185\":1,\"216\":1,\"219\":1,\"220\":2,\"221\":1,\"246\":1,\"249\":1,\"250\":2,\"251\":1,\"276\":1,\"279\":1,\"280\":2,\"281\":1,\"322\":1,\"325\":1,\"326\":2,\"327\":1,\"368\":1,\"371\":1,\"372\":2,\"373\":1,\"713\":1,\"716\":1,\"717\":2,\"718\":1,\"936\":1,\"939\":1,\"940\":2,\"941\":1}}],[\"big\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"bilateral\",{\"1\":{\"66\":1}}],[\"birth\",{\"1\":{\"63\":1}}],[\"bit\",{\"1\":{\"63\":1}}],[\"binary\",{\"1\":{\"61\":1,\"73\":1}}],[\"bialke\",{\"1\":{\"39\":2}}],[\"bietet\",{\"1\":{\"29\":1,\"31\":1}}],[\"bis\",{\"1\":{\"29\":2}}],[\"bio\",{\"1\":{\"81\":1,\"84\":1}}],[\"biobanking\",{\"1\":{\"15\":1}}],[\"biomedical\",{\"1\":{\"0\":1,\"14\":1,\"20\":1,\"21\":1,\"27\":1,\"39\":1,\"80\":1}}],[\"balance\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"bar\",{\"1\":{\"137\":4,\"138\":2,\"160\":4,\"161\":2,\"184\":4,\"185\":2,\"220\":4,\"221\":2,\"250\":4,\"251\":2,\"280\":4,\"281\":2,\"326\":4,\"327\":2,\"372\":4,\"373\":2,\"408\":1,\"437\":1,\"485\":1,\"491\":1,\"559\":1,\"588\":1,\"638\":1,\"645\":1,\"717\":4,\"718\":2,\"778\":1,\"810\":1,\"845\":1,\"852\":1,\"940\":4,\"941\":2,\"1001\":1,\"1033\":1,\"1068\":1,\"1075\":1,\"1162\":1,\"1194\":1,\"1245\":1,\"1252\":1,\"1355\":1,\"1387\":1,\"1438\":1,\"1445\":1,\"1545\":1,\"1577\":1,\"1581\":1,\"1640\":1,\"1648\":1,\"1751\":1,\"1783\":1,\"1818\":1,\"1825\":1,\"1941\":1,\"1973\":1,\"1977\":1,\"2036\":1,\"2044\":1,\"2160\":1,\"2192\":1,\"2196\":1,\"2255\":1,\"2263\":1}}],[\"bahls\",{\"1\":{\"39\":1}}],[\"backup\",{\"1\":{\"143\":1,\"166\":1,\"168\":3,\"169\":3,\"190\":1,\"192\":3,\"193\":3,\"226\":1,\"228\":3,\"229\":3,\"256\":1,\"258\":3,\"259\":3,\"286\":1,\"288\":3,\"289\":3,\"332\":1,\"334\":3,\"335\":3,\"378\":1,\"380\":3,\"381\":3,\"723\":1,\"725\":3,\"726\":3,\"946\":1,\"948\":3,\"949\":3}}],[\"background\",{\"1\":{\"66\":1}}],[\"back\",{\"0\":{\"446\":1,\"447\":1,\"514\":1,\"515\":1,\"653\":1,\"654\":1,\"732\":1,\"733\":1,\"860\":1,\"861\":1,\"955\":1,\"956\":1,\"1083\":1,\"1084\":1,\"1116\":1,\"1117\":1,\"1260\":1,\"1261\":1,\"1309\":1,\"1310\":1,\"1453\":1,\"1454\":1,\"1496\":1,\"1497\":1,\"1656\":1,\"1657\":1,\"1705\":1,\"1706\":1,\"1833\":1,\"1834\":1,\"1892\":1,\"1893\":1,\"2052\":1,\"2053\":1,\"2111\":1,\"2112\":1,\"2271\":1,\"2272\":1},\"1\":{\"28\":1,\"90\":1,\"446\":3,\"447\":3,\"514\":3,\"515\":3,\"653\":3,\"654\":3,\"674\":1,\"675\":4,\"678\":1,\"732\":3,\"733\":3,\"860\":3,\"861\":3,\"881\":1,\"882\":4,\"885\":1,\"955\":3,\"956\":3,\"1083\":3,\"1084\":3,\"1104\":1,\"1105\":4,\"1108\":1,\"1116\":3,\"1117\":3,\"1260\":3,\"1261\":3,\"1281\":1,\"1282\":4,\"1285\":1,\"1309\":3,\"1310\":3,\"1453\":3,\"1454\":3,\"1474\":1,\"1475\":4,\"1478\":1,\"1496\":3,\"1497\":3,\"1586\":1,\"1587\":4,\"1589\":1,\"1656\":3,\"1657\":3,\"1677\":1,\"1678\":4,\"1681\":1,\"1705\":3,\"1706\":3,\"1833\":3,\"1834\":3,\"1854\":1,\"1855\":4,\"1858\":1,\"1892\":3,\"1893\":3,\"1982\":1,\"1983\":4,\"1985\":1,\"2052\":3,\"2053\":3,\"2073\":1,\"2074\":4,\"2077\":1,\"2111\":3,\"2112\":3,\"2201\":1,\"2202\":4,\"2204\":1,\"2271\":3,\"2272\":3,\"2292\":1,\"2293\":4,\"2296\":1}}],[\"base\",{\"0\":{\"408\":1,\"457\":1,\"485\":1,\"525\":1,\"559\":1,\"638\":1,\"664\":1,\"743\":1,\"778\":1,\"845\":1,\"871\":1,\"966\":1,\"1001\":1,\"1068\":1,\"1094\":1,\"1127\":1,\"1162\":1,\"1245\":1,\"1271\":1,\"1320\":1,\"1355\":1,\"1438\":1,\"1464\":1,\"1507\":1,\"1545\":1,\"1577\":1,\"1640\":1,\"1667\":1,\"1716\":1,\"1751\":1,\"1818\":1,\"1844\":1,\"1903\":1,\"1941\":1,\"1973\":1,\"2036\":1,\"2063\":1,\"2122\":1,\"2160\":1,\"2192\":1,\"2255\":1,\"2282\":1},\"1\":{\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"184\":2,\"185\":1,\"220\":2,\"221\":1,\"250\":2,\"251\":1,\"280\":2,\"281\":1,\"326\":2,\"327\":1,\"372\":2,\"373\":1,\"408\":2,\"445\":1,\"448\":1,\"457\":2,\"485\":2,\"513\":1,\"516\":1,\"525\":2,\"559\":2,\"638\":2,\"652\":1,\"655\":1,\"664\":2,\"675\":2,\"676\":1,\"678\":1,\"717\":2,\"718\":1,\"731\":1,\"734\":1,\"743\":2,\"778\":2,\"845\":2,\"859\":1,\"862\":1,\"871\":2,\"882\":2,\"883\":1,\"885\":1,\"940\":2,\"941\":1,\"954\":1,\"957\":1,\"966\":2,\"1001\":2,\"1068\":2,\"1082\":1,\"1085\":1,\"1094\":2,\"1105\":2,\"1106\":1,\"1108\":1,\"1115\":1,\"1118\":1,\"1127\":2,\"1162\":2,\"1245\":2,\"1259\":1,\"1262\":1,\"1271\":2,\"1282\":2,\"1283\":1,\"1285\":1,\"1308\":1,\"1311\":1,\"1320\":2,\"1355\":2,\"1438\":2,\"1452\":1,\"1455\":1,\"1464\":2,\"1475\":2,\"1476\":1,\"1478\":1,\"1495\":1,\"1498\":1,\"1507\":2,\"1545\":2,\"1577\":2,\"1587\":2,\"1589\":1,\"1640\":2,\"1655\":1,\"1658\":1,\"1667\":2,\"1678\":2,\"1679\":1,\"1681\":1,\"1704\":1,\"1707\":1,\"1716\":2,\"1751\":2,\"1818\":2,\"1832\":1,\"1835\":1,\"1844\":2,\"1855\":2,\"1856\":1,\"1858\":1,\"1891\":1,\"1894\":1,\"1903\":2,\"1941\":2,\"1973\":2,\"1983\":2,\"1985\":1,\"2036\":2,\"2051\":1,\"2054\":1,\"2063\":2,\"2074\":2,\"2075\":1,\"2077\":1,\"2110\":1,\"2113\":1,\"2122\":2,\"2160\":2,\"2192\":2,\"2202\":2,\"2204\":1,\"2255\":2,\"2270\":1,\"2273\":1,\"2282\":2,\"2293\":2,\"2294\":1,\"2296\":1}}],[\"based\",{\"1\":{\"0\":1,\"39\":1,\"52\":1,\"59\":1,\"63\":2,\"81\":1,\"89\":1,\"92\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"basically\",{\"1\":{\"60\":1,\"66\":1}}],[\"basic\",{\"1\":{\"57\":1,\"58\":1,\"77\":1,\"88\":1}}],[\"basics\",{\"0\":{\"57\":1,\"73\":1},\"1\":{\"44\":1,\"53\":1}}],[\"basis\",{\"1\":{\"11\":1}}],[\"bearer\",{\"0\":{\"448\":1,\"516\":1,\"655\":1,\"676\":1,\"734\":1,\"862\":1,\"883\":1,\"957\":1,\"1085\":1,\"1106\":1,\"1118\":1,\"1262\":1,\"1283\":1,\"1311\":1,\"1455\":1,\"1476\":1,\"1498\":1,\"1658\":1,\"1679\":1,\"1707\":1,\"1835\":1,\"1856\":1,\"1894\":1,\"2054\":1,\"2075\":1,\"2113\":1,\"2273\":1,\"2294\":1},\"1\":{\"448\":2,\"516\":2,\"655\":2,\"674\":1,\"676\":2,\"678\":1,\"734\":2,\"862\":2,\"881\":1,\"883\":2,\"885\":1,\"957\":2,\"1085\":2,\"1104\":1,\"1106\":2,\"1108\":1,\"1118\":2,\"1262\":2,\"1281\":1,\"1283\":2,\"1285\":1,\"1311\":2,\"1455\":2,\"1474\":1,\"1476\":2,\"1478\":1,\"1498\":2,\"1589\":1,\"1658\":2,\"1677\":1,\"1679\":2,\"1681\":1,\"1707\":2,\"1835\":2,\"1854\":1,\"1856\":2,\"1858\":1,\"1894\":2,\"1985\":1,\"2054\":2,\"2073\":1,\"2075\":2,\"2077\":1,\"2113\":2,\"2204\":1,\"2273\":2,\"2292\":1,\"2294\":2,\"2296\":1}}],[\"beantragen\",{\"1\":{\"31\":1}}],[\"benefit\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"benefits\",{\"0\":{\"22\":1,\"291\":1,\"341\":1,\"682\":1,\"889\":1},\"1\":{\"61\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"beginning\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1}}],[\"begrüßung\",{\"1\":{\"29\":1}}],[\"beizutreten\",{\"1\":{\"103\":1}}],[\"being\",{\"1\":{\"63\":1,\"73\":1,\"305\":1,\"355\":1,\"423\":1,\"424\":1,\"574\":1,\"575\":1,\"696\":1,\"792\":1,\"793\":1,\"903\":1,\"1015\":1,\"1016\":1,\"1176\":1,\"1177\":1,\"1369\":1,\"1370\":1,\"1559\":1,\"1560\":1,\"1765\":1,\"1766\":1,\"1955\":1,\"1956\":1,\"2174\":1,\"2175\":1}}],[\"become\",{\"1\":{\"81\":1}}],[\"because\",{\"1\":{\"60\":1,\"61\":1}}],[\"before\",{\"1\":{\"54\":1,\"57\":1,\"168\":1,\"169\":1,\"192\":1,\"193\":1,\"226\":1,\"228\":1,\"229\":1,\"256\":1,\"258\":1,\"259\":1,\"286\":1,\"288\":1,\"289\":1,\"293\":1,\"301\":1,\"302\":1,\"305\":1,\"332\":1,\"334\":1,\"335\":1,\"343\":1,\"351\":1,\"352\":1,\"355\":1,\"378\":1,\"380\":1,\"381\":1,\"684\":1,\"692\":1,\"693\":1,\"696\":1,\"723\":1,\"725\":1,\"726\":1,\"891\":1,\"899\":1,\"900\":1,\"903\":1,\"946\":1,\"948\":1,\"949\":1}}],[\"befinden\",{\"1\":{\"31\":1}}],[\"been\",{\"1\":{\"52\":1,\"53\":1,\"62\":1,\"89\":1,\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"believe\",{\"1\":{\"99\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"beliebiger\",{\"1\":{\"32\":1}}],[\"belonging\",{\"1\":{\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"belongs\",{\"1\":{\"14\":1,\"137\":2,\"160\":2,\"184\":2,\"220\":2,\"250\":2,\"280\":2,\"326\":2,\"372\":2,\"717\":2,\"940\":2}}],[\"below\",{\"1\":{\"64\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"208\":1,\"220\":1,\"221\":1,\"238\":1,\"250\":1,\"251\":1,\"268\":1,\"280\":1,\"281\":1,\"314\":1,\"326\":1,\"327\":1,\"360\":1,\"372\":1,\"373\":1,\"610\":1,\"705\":1,\"717\":1,\"718\":1,\"817\":1,\"929\":1,\"940\":1,\"941\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"bereits\",{\"1\":{\"30\":1}}],[\"bedarf\",{\"1\":{\"30\":1}}],[\"best\",{\"1\":{\"97\":1}}],[\"bestandteil\",{\"1\":{\"30\":1}}],[\"besuchen\",{\"1\":{\"29\":1}}],[\"between\",{\"1\":{\"13\":1,\"58\":2,\"59\":1,\"60\":2,\"61\":2,\"62\":3,\"68\":1,\"73\":1,\"226\":1,\"256\":1,\"286\":1,\"301\":1,\"332\":1,\"351\":1,\"378\":1,\"411\":1,\"434\":1,\"470\":1,\"506\":1,\"562\":1,\"585\":1,\"603\":1,\"623\":1,\"692\":1,\"723\":1,\"780\":1,\"806\":1,\"830\":1,\"899\":1,\"918\":1,\"946\":1,\"1003\":1,\"1029\":1,\"1053\":1,\"1164\":1,\"1190\":1,\"1210\":1,\"1230\":1,\"1298\":1,\"1357\":1,\"1383\":1,\"1403\":1,\"1423\":1,\"1547\":1,\"1573\":1,\"1602\":1,\"1622\":1,\"1694\":1,\"1753\":1,\"1779\":1,\"1803\":1,\"1871\":1,\"1943\":1,\"1969\":1,\"1998\":1,\"2018\":1,\"2090\":1,\"2162\":1,\"2188\":1,\"2217\":1,\"2237\":1,\"2309\":1}}],[\"better\",{\"1\":{\"10\":1,\"91\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"be\",{\"1\":{\"11\":1,\"23\":1,\"24\":2,\"49\":1,\"52\":2,\"54\":3,\"55\":2,\"58\":2,\"59\":6,\"60\":2,\"61\":1,\"62\":2,\"63\":2,\"64\":2,\"67\":1,\"68\":1,\"73\":1,\"74\":1,\"80\":1,\"81\":3,\"84\":2,\"88\":1,\"92\":2,\"99\":1,\"126\":3,\"129\":1,\"134\":2,\"136\":2,\"137\":2,\"143\":2,\"149\":3,\"152\":1,\"157\":2,\"159\":2,\"166\":2,\"173\":3,\"176\":1,\"181\":2,\"183\":2,\"190\":2,\"205\":3,\"212\":1,\"217\":2,\"219\":2,\"226\":2,\"235\":3,\"242\":1,\"247\":2,\"249\":2,\"256\":2,\"265\":3,\"272\":1,\"277\":2,\"279\":2,\"286\":2,\"293\":1,\"301\":2,\"305\":2,\"311\":3,\"318\":1,\"323\":2,\"325\":2,\"332\":2,\"343\":1,\"351\":2,\"355\":2,\"357\":3,\"364\":1,\"369\":2,\"371\":2,\"378\":2,\"394\":1,\"395\":1,\"396\":2,\"410\":1,\"413\":1,\"414\":1,\"418\":1,\"419\":1,\"423\":1,\"424\":1,\"425\":1,\"429\":1,\"432\":2,\"433\":1,\"436\":1,\"445\":1,\"446\":2,\"448\":1,\"449\":1,\"450\":1,\"500\":1,\"501\":1,\"505\":1,\"506\":1,\"513\":1,\"514\":2,\"516\":1,\"517\":1,\"518\":1,\"545\":1,\"546\":1,\"547\":2,\"561\":1,\"564\":1,\"565\":1,\"569\":1,\"570\":1,\"574\":1,\"575\":1,\"576\":1,\"580\":1,\"583\":2,\"584\":1,\"587\":1,\"597\":1,\"598\":1,\"602\":1,\"603\":1,\"610\":6,\"611\":2,\"613\":3,\"614\":1,\"615\":1,\"617\":1,\"641\":1,\"643\":1,\"652\":1,\"653\":2,\"655\":1,\"656\":1,\"657\":1,\"674\":3,\"675\":2,\"677\":2,\"684\":1,\"692\":2,\"696\":2,\"702\":3,\"709\":1,\"714\":2,\"716\":2,\"723\":2,\"731\":1,\"732\":2,\"734\":1,\"735\":1,\"736\":1,\"763\":1,\"764\":1,\"765\":2,\"766\":2,\"779\":1,\"782\":1,\"783\":1,\"787\":1,\"788\":1,\"792\":1,\"793\":1,\"794\":1,\"798\":1,\"804\":2,\"805\":1,\"808\":1,\"817\":6,\"818\":2,\"820\":3,\"821\":1,\"822\":1,\"824\":1,\"848\":1,\"859\":1,\"860\":2,\"862\":1,\"863\":1,\"864\":1,\"881\":3,\"882\":2,\"884\":2,\"891\":1,\"899\":2,\"903\":2,\"911\":1,\"912\":1,\"917\":1,\"918\":1,\"925\":3,\"930\":1,\"932\":1,\"937\":2,\"939\":2,\"946\":2,\"954\":1,\"955\":2,\"957\":1,\"958\":1,\"959\":1,\"986\":1,\"987\":1,\"988\":2,\"989\":2,\"1002\":1,\"1005\":1,\"1006\":1,\"1010\":1,\"1011\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1021\":1,\"1027\":2,\"1028\":1,\"1031\":1,\"1040\":6,\"1041\":2,\"1043\":3,\"1044\":1,\"1045\":1,\"1047\":1,\"1071\":1,\"1082\":1,\"1083\":2,\"1085\":1,\"1086\":1,\"1087\":1,\"1104\":3,\"1105\":2,\"1107\":2,\"1115\":1,\"1116\":2,\"1118\":1,\"1119\":1,\"1120\":1,\"1147\":1,\"1148\":1,\"1149\":2,\"1150\":2,\"1163\":1,\"1166\":1,\"1167\":1,\"1171\":1,\"1172\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1182\":1,\"1188\":2,\"1189\":1,\"1192\":1,\"1203\":1,\"1204\":1,\"1209\":1,\"1210\":1,\"1217\":6,\"1218\":2,\"1220\":3,\"1221\":1,\"1222\":1,\"1224\":1,\"1248\":1,\"1259\":1,\"1260\":2,\"1262\":1,\"1263\":1,\"1264\":1,\"1281\":3,\"1282\":2,\"1284\":2,\"1291\":1,\"1292\":1,\"1297\":1,\"1298\":1,\"1308\":1,\"1309\":2,\"1311\":1,\"1312\":1,\"1313\":1,\"1340\":1,\"1341\":1,\"1342\":2,\"1343\":2,\"1356\":1,\"1359\":1,\"1360\":1,\"1364\":1,\"1365\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1375\":1,\"1381\":2,\"1382\":1,\"1385\":1,\"1396\":1,\"1397\":1,\"1402\":1,\"1403\":1,\"1410\":6,\"1411\":2,\"1413\":3,\"1414\":1,\"1415\":1,\"1417\":1,\"1441\":1,\"1452\":1,\"1453\":2,\"1455\":1,\"1456\":1,\"1457\":1,\"1474\":3,\"1475\":2,\"1477\":2,\"1482\":7,\"1483\":2,\"1485\":3,\"1486\":1,\"1487\":1,\"1495\":1,\"1496\":2,\"1498\":1,\"1499\":1,\"1500\":1,\"1527\":2,\"1528\":2,\"1529\":1,\"1530\":1,\"1531\":2,\"1532\":2,\"1533\":2,\"1546\":1,\"1549\":1,\"1550\":1,\"1554\":1,\"1555\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1565\":1,\"1571\":2,\"1572\":1,\"1575\":1,\"1586\":3,\"1587\":2,\"1588\":2,\"1595\":1,\"1596\":1,\"1601\":1,\"1602\":1,\"1609\":7,\"1610\":2,\"1612\":3,\"1613\":1,\"1614\":1,\"1616\":1,\"1637\":2,\"1638\":2,\"1639\":2,\"1643\":1,\"1655\":1,\"1656\":2,\"1658\":1,\"1659\":1,\"1660\":1,\"1677\":3,\"1678\":2,\"1680\":2,\"1687\":1,\"1688\":1,\"1693\":1,\"1694\":1,\"1704\":1,\"1705\":2,\"1707\":1,\"1708\":1,\"1709\":1,\"1736\":1,\"1737\":1,\"1738\":2,\"1739\":2,\"1752\":1,\"1755\":1,\"1756\":1,\"1760\":1,\"1761\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1771\":1,\"1777\":2,\"1778\":1,\"1781\":1,\"1790\":6,\"1791\":2,\"1793\":3,\"1794\":1,\"1795\":1,\"1797\":1,\"1821\":1,\"1832\":1,\"1833\":2,\"1835\":1,\"1836\":1,\"1837\":1,\"1854\":3,\"1855\":2,\"1857\":2,\"1864\":1,\"1865\":1,\"1870\":1,\"1871\":1,\"1878\":7,\"1879\":2,\"1881\":3,\"1882\":1,\"1883\":1,\"1891\":1,\"1892\":2,\"1894\":1,\"1895\":1,\"1896\":1,\"1923\":2,\"1924\":2,\"1925\":1,\"1926\":1,\"1927\":2,\"1928\":2,\"1929\":2,\"1942\":1,\"1945\":1,\"1946\":1,\"1950\":1,\"1951\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1961\":1,\"1967\":2,\"1968\":1,\"1971\":1,\"1982\":3,\"1983\":2,\"1984\":2,\"1991\":1,\"1992\":1,\"1997\":1,\"1998\":1,\"2005\":7,\"2006\":2,\"2008\":3,\"2009\":1,\"2010\":1,\"2012\":1,\"2033\":2,\"2034\":2,\"2035\":2,\"2039\":1,\"2051\":1,\"2052\":2,\"2054\":1,\"2055\":1,\"2056\":1,\"2073\":3,\"2074\":2,\"2076\":2,\"2083\":1,\"2084\":1,\"2089\":1,\"2090\":1,\"2097\":7,\"2098\":2,\"2100\":3,\"2101\":1,\"2102\":1,\"2110\":1,\"2111\":2,\"2113\":1,\"2114\":1,\"2115\":1,\"2142\":2,\"2143\":2,\"2144\":1,\"2145\":1,\"2146\":2,\"2147\":2,\"2148\":2,\"2161\":1,\"2164\":1,\"2165\":1,\"2169\":1,\"2170\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2180\":1,\"2186\":2,\"2187\":1,\"2190\":1,\"2201\":3,\"2202\":2,\"2203\":2,\"2210\":1,\"2211\":1,\"2216\":1,\"2217\":1,\"2224\":7,\"2225\":2,\"2227\":3,\"2228\":1,\"2229\":1,\"2231\":1,\"2252\":2,\"2253\":2,\"2254\":2,\"2258\":1,\"2270\":1,\"2271\":2,\"2273\":1,\"2274\":1,\"2275\":1,\"2292\":3,\"2293\":2,\"2295\":2,\"2302\":1,\"2303\":1,\"2308\":1,\"2309\":1}}],[\"bmbf\",{\"1\":{\"10\":1,\"80\":1}}],[\"busy\",{\"1\":{\"803\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1}}],[\"business\",{\"0\":{\"54\":1,\"77\":1},\"1\":{\"0\":1,\"23\":1,\"39\":1,\"52\":3,\"60\":3,\"61\":2,\"63\":3,\"74\":1,\"77\":1,\"81\":1,\"929\":1}}],[\"buildable\",{\"1\":{\"296\":1,\"346\":1,\"687\":1,\"894\":1}}],[\"build\",{\"1\":{\"291\":1,\"299\":1,\"303\":1,\"341\":1,\"349\":1,\"353\":1,\"682\":1,\"690\":1,\"694\":1,\"889\":1,\"897\":1,\"901\":1}}],[\"buildinforeaderimpl\",{\"1\":{\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"726\":2,\"949\":2}}],[\"building\",{\"1\":{\"82\":1,\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"built\",{\"1\":{\"126\":2,\"149\":2,\"173\":2,\"205\":2,\"235\":2,\"265\":2,\"311\":2,\"357\":2,\"702\":2,\"925\":2}}],[\"but\",{\"1\":{\"61\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"436\":1,\"587\":1,\"674\":1,\"717\":1,\"718\":1,\"808\":1,\"881\":1,\"940\":1,\"941\":1,\"1031\":1,\"1104\":1,\"1192\":1,\"1281\":1,\"1385\":1,\"1474\":1,\"1575\":1,\"1586\":1,\"1677\":1,\"1781\":1,\"1854\":1,\"1971\":1,\"1982\":1,\"2073\":1,\"2190\":1,\"2201\":1,\"2292\":1}}],[\"bundle\",{\"0\":{\"486\":1,\"639\":1,\"846\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1},\"1\":{\"37\":2,\"61\":1,\"486\":3,\"639\":3,\"846\":3,\"1069\":3,\"1246\":3,\"1439\":3,\"1641\":3,\"1819\":3,\"2037\":3,\"2256\":3}}],[\"bundles\",{\"1\":{\"32\":2,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"bugs\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"bug\",{\"1\":{\"8\":1,\"305\":6,\"355\":6,\"696\":6,\"903\":6}}],[\"by=\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"by\",{\"0\":{\"72\":1},\"1\":{\"0\":2,\"1\":1,\"20\":1,\"21\":1,\"23\":1,\"52\":1,\"54\":1,\"59\":1,\"60\":1,\"61\":1,\"62\":2,\"63\":4,\"64\":1,\"73\":1,\"74\":2,\"80\":2,\"81\":2,\"88\":1,\"89\":1,\"95\":2,\"126\":1,\"133\":1,\"134\":2,\"137\":2,\"138\":1,\"139\":3,\"143\":1,\"149\":1,\"156\":1,\"157\":2,\"160\":2,\"161\":1,\"162\":3,\"166\":1,\"169\":1,\"173\":1,\"180\":1,\"181\":2,\"184\":2,\"185\":1,\"186\":3,\"190\":1,\"193\":3,\"205\":1,\"216\":1,\"217\":2,\"220\":2,\"221\":1,\"222\":3,\"226\":1,\"229\":1,\"235\":1,\"246\":1,\"247\":2,\"250\":2,\"251\":1,\"252\":3,\"256\":1,\"259\":1,\"265\":1,\"276\":1,\"277\":2,\"280\":2,\"281\":1,\"282\":3,\"286\":1,\"289\":1,\"291\":1,\"305\":2,\"311\":1,\"322\":1,\"323\":2,\"326\":2,\"327\":1,\"328\":3,\"332\":1,\"335\":1,\"341\":1,\"355\":2,\"357\":1,\"368\":1,\"369\":2,\"372\":2,\"373\":1,\"374\":3,\"378\":1,\"381\":1,\"385\":1,\"409\":1,\"447\":1,\"476\":1,\"487\":1,\"488\":1,\"515\":1,\"536\":1,\"560\":1,\"618\":1,\"629\":1,\"640\":1,\"642\":1,\"654\":1,\"674\":2,\"675\":1,\"682\":1,\"696\":2,\"702\":1,\"713\":1,\"714\":2,\"717\":2,\"718\":1,\"719\":3,\"723\":1,\"726\":1,\"733\":1,\"754\":1,\"825\":1,\"836\":1,\"847\":1,\"849\":1,\"861\":1,\"881\":2,\"882\":1,\"889\":1,\"903\":2,\"925\":1,\"931\":2,\"936\":1,\"937\":2,\"940\":2,\"941\":1,\"942\":3,\"946\":1,\"949\":1,\"956\":1,\"977\":1,\"1048\":1,\"1059\":1,\"1070\":1,\"1072\":1,\"1084\":1,\"1104\":2,\"1105\":1,\"1117\":1,\"1138\":1,\"1225\":1,\"1236\":1,\"1247\":1,\"1249\":1,\"1261\":1,\"1281\":2,\"1282\":1,\"1310\":1,\"1331\":1,\"1418\":1,\"1429\":1,\"1440\":1,\"1442\":1,\"1454\":1,\"1474\":2,\"1475\":1,\"1490\":1,\"1497\":1,\"1518\":1,\"1586\":2,\"1587\":1,\"1617\":1,\"1628\":1,\"1642\":1,\"1644\":1,\"1657\":1,\"1677\":2,\"1678\":1,\"1706\":1,\"1727\":1,\"1798\":1,\"1809\":1,\"1820\":1,\"1822\":1,\"1834\":1,\"1854\":2,\"1855\":1,\"1886\":1,\"1893\":1,\"1914\":1,\"1982\":2,\"1983\":1,\"2013\":1,\"2024\":1,\"2038\":1,\"2040\":1,\"2053\":1,\"2073\":2,\"2074\":1,\"2105\":1,\"2112\":1,\"2133\":1,\"2201\":2,\"2202\":1,\"2232\":1,\"2243\":1,\"2257\":1,\"2259\":1,\"2272\":1,\"2292\":2,\"2293\":1}}],[\"ttp\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"tit\",{\"1\":{\"435\":1,\"586\":1,\"807\":1,\"1030\":1,\"1191\":1,\"1384\":1,\"1574\":1,\"1780\":1,\"1970\":1,\"2189\":1}}],[\"timeout\",{\"0\":{\"400\":1,\"401\":1,\"403\":1,\"404\":1,\"470\":1,\"471\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"551\":1,\"552\":1,\"554\":1,\"555\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"623\":1,\"624\":1,\"770\":1,\"771\":1,\"773\":1,\"774\":1,\"830\":1,\"831\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"993\":1,\"994\":1,\"996\":1,\"997\":1,\"1053\":1,\"1054\":1,\"1154\":1,\"1155\":1,\"1157\":1,\"1158\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1230\":1,\"1231\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1347\":1,\"1348\":1,\"1350\":1,\"1351\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1423\":1,\"1424\":1,\"1537\":1,\"1538\":1,\"1540\":1,\"1541\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1622\":1,\"1623\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1743\":1,\"1744\":1,\"1746\":1,\"1747\":1,\"1803\":1,\"1804\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1933\":1,\"1934\":1,\"1936\":1,\"1937\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2018\":1,\"2019\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2152\":1,\"2153\":1,\"2155\":1,\"2156\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2237\":1,\"2238\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1},\"1\":{\"192\":1,\"193\":1,\"400\":3,\"401\":3,\"403\":3,\"404\":3,\"454\":1,\"455\":1,\"470\":3,\"471\":3,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"522\":1,\"523\":1,\"551\":3,\"552\":3,\"554\":3,\"555\":3,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"623\":3,\"624\":3,\"661\":1,\"662\":1,\"740\":1,\"741\":1,\"770\":3,\"771\":3,\"773\":3,\"774\":3,\"830\":3,\"831\":3,\"868\":1,\"869\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"963\":1,\"964\":1,\"993\":3,\"994\":3,\"996\":3,\"997\":3,\"1053\":3,\"1054\":3,\"1091\":1,\"1092\":1,\"1124\":1,\"1125\":1,\"1154\":3,\"1155\":3,\"1157\":3,\"1158\":3,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1230\":3,\"1231\":3,\"1268\":1,\"1269\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1317\":1,\"1318\":1,\"1347\":3,\"1348\":3,\"1350\":3,\"1351\":3,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1423\":3,\"1424\":3,\"1461\":1,\"1462\":1,\"1504\":1,\"1505\":1,\"1537\":3,\"1538\":3,\"1540\":3,\"1541\":3,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1622\":3,\"1623\":3,\"1664\":1,\"1665\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1713\":1,\"1714\":1,\"1743\":3,\"1744\":3,\"1746\":3,\"1747\":3,\"1803\":3,\"1804\":3,\"1841\":1,\"1842\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1900\":1,\"1901\":1,\"1933\":3,\"1934\":3,\"1936\":3,\"1937\":3,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2018\":3,\"2019\":3,\"2060\":1,\"2061\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2119\":1,\"2120\":1,\"2152\":3,\"2153\":3,\"2155\":3,\"2156\":3,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2237\":3,\"2238\":3,\"2279\":1,\"2280\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1}}],[\"timer\",{\"1\":{\"69\":2}}],[\"time\",{\"1\":{\"61\":1,\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"384\":1,\"475\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"535\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"628\":1,\"723\":1,\"753\":1,\"835\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"946\":1,\"976\":1,\"1058\":1,\"1137\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1235\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1330\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1428\":1,\"1517\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1627\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1726\":1,\"1808\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1913\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2023\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2132\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2242\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1}}],[\"timely\",{\"1\":{\"58\":1,\"100\":1}}],[\"type=websocket\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"types\",{\"1\":{\"24\":1,\"615\":1,\"822\":1,\"1045\":1,\"1222\":1,\"1415\":1,\"1487\":1,\"1614\":1,\"1795\":1,\"1883\":1,\"2010\":1,\"2102\":1,\"2229\":1}}],[\"typo\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"typically\",{\"1\":{\"301\":1,\"351\":1,\"499\":1,\"596\":1,\"692\":1,\"899\":1,\"910\":1,\"1202\":1,\"1290\":1,\"1395\":1,\"1594\":1,\"1686\":1,\"1863\":1,\"1990\":1,\"2082\":1,\"2209\":1,\"2301\":1}}],[\"tcs\",{\"1\":{\"74\":1,\"76\":1,\"77\":1,\"133\":2,\"156\":2,\"180\":2,\"216\":2,\"246\":2,\"276\":2,\"322\":2,\"368\":2,\"713\":2,\"936\":2}}],[\"tcp\",{\"1\":{\"64\":1}}],[\"tmf\",{\"1\":{\"74\":1,\"76\":1,\"77\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"322\":1,\"368\":1,\"713\":1,\"936\":1}}],[\"tm6c\",{\"1\":{\"29\":1}}],[\"tlsv13\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"tls\",{\"1\":{\"64\":1,\"73\":1,\"133\":4,\"134\":2,\"138\":1,\"156\":4,\"157\":2,\"161\":1,\"180\":4,\"181\":2,\"185\":1,\"216\":4,\"217\":2,\"221\":1,\"246\":4,\"247\":2,\"251\":1,\"276\":4,\"277\":2,\"281\":1,\"322\":4,\"323\":2,\"327\":1,\"368\":4,\"369\":2,\"373\":1,\"413\":1,\"414\":1,\"420\":1,\"429\":1,\"430\":1,\"431\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"505\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"564\":1,\"565\":1,\"571\":1,\"580\":1,\"581\":1,\"582\":1,\"602\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"713\":4,\"714\":2,\"718\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"782\":1,\"783\":1,\"789\":1,\"798\":1,\"799\":1,\"800\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"917\":1,\"936\":4,\"937\":2,\"941\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"1005\":1,\"1006\":1,\"1012\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1166\":1,\"1167\":1,\"1173\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1209\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1297\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1359\":1,\"1360\":1,\"1366\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1402\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1549\":1,\"1550\":1,\"1556\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1601\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1693\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1755\":1,\"1756\":1,\"1762\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1870\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1945\":1,\"1946\":1,\"1952\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1997\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2089\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2164\":1,\"2165\":1,\"2171\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2216\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2308\":1}}],[\"two\",{\"1\":{\"61\":2,\"63\":1,\"67\":1,\"133\":1,\"137\":1,\"156\":1,\"160\":1,\"180\":1,\"184\":1,\"216\":1,\"220\":1,\"246\":1,\"250\":1,\"276\":1,\"280\":1,\"294\":1,\"322\":1,\"326\":1,\"344\":1,\"368\":1,\"372\":1,\"411\":1,\"434\":1,\"562\":1,\"585\":1,\"618\":2,\"685\":1,\"713\":1,\"717\":1,\"780\":1,\"806\":1,\"825\":2,\"892\":1,\"936\":1,\"940\":1,\"1003\":1,\"1029\":1,\"1048\":2,\"1164\":1,\"1190\":1,\"1225\":2,\"1357\":1,\"1383\":1,\"1418\":2,\"1487\":1,\"1490\":1,\"1547\":1,\"1573\":1,\"1614\":1,\"1617\":2,\"1753\":1,\"1779\":1,\"1798\":2,\"1883\":1,\"1886\":1,\"1943\":1,\"1969\":1,\"2010\":1,\"2013\":2,\"2102\":1,\"2105\":1,\"2162\":1,\"2188\":1,\"2229\":1,\"2232\":2}}],[\"tutorials\",{\"0\":{\"85\":1}}],[\"tutorial\",{\"1\":{\"41\":1,\"80\":4,\"81\":3,\"82\":1,\"83\":1,\"85\":1,\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1}}],[\"tar\",{\"1\":{\"137\":4,\"138\":4,\"160\":4,\"161\":4,\"184\":4,\"185\":4,\"220\":4,\"221\":4,\"250\":4,\"251\":4,\"280\":4,\"281\":4,\"326\":4,\"327\":4,\"372\":4,\"373\":4,\"717\":4,\"718\":4,\"940\":4,\"941\":4}}],[\"target\",{\"0\":{\"82\":1},\"1\":{\"82\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"498\":1,\"595\":1,\"714\":1,\"909\":1,\"937\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1}}],[\"tasked\",{\"1\":{\"82\":1}}],[\"tasks\",{\"1\":{\"63\":1,\"73\":1}}],[\"taskresource\",{\"1\":{\"61\":2}}],[\"taskresources\",{\"1\":{\"61\":1}}],[\"task\",{\"0\":{\"410\":1,\"411\":1,\"412\":1,\"561\":1,\"562\":1,\"563\":1,\"779\":1,\"780\":1,\"781\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"2161\":1,\"2162\":1,\"2163\":1},\"1\":{\"53\":3,\"54\":2,\"61\":1,\"63\":3,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"410\":1,\"411\":1,\"412\":2,\"561\":1,\"562\":1,\"563\":2,\"718\":1,\"779\":1,\"780\":1,\"781\":2,\"809\":1,\"941\":1,\"1002\":1,\"1003\":1,\"1004\":2,\"1032\":1,\"1163\":1,\"1164\":1,\"1165\":2,\"1193\":1,\"1356\":1,\"1357\":1,\"1358\":2,\"1386\":1,\"1546\":1,\"1547\":1,\"1548\":2,\"1576\":1,\"1752\":1,\"1753\":1,\"1754\":2,\"1782\":1,\"1942\":1,\"1943\":1,\"1944\":2,\"1972\":1,\"2161\":1,\"2162\":1,\"2163\":2,\"2191\":1}}],[\"talks\",{\"0\":{\"38\":1,\"40\":1,\"86\":1}}],[\"take\",{\"0\":{\"2\":1,\"51\":1},\"1\":{\"4\":1,\"95\":1,\"97\":1,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"230\":1,\"233\":1,\"260\":1,\"263\":1,\"306\":1,\"309\":1,\"336\":1,\"339\":1,\"697\":1,\"700\":1,\"904\":1,\"907\":1}}],[\"t\",{\"1\":{\"27\":1,\"39\":5,\"61\":1,\"137\":1,\"139\":1,\"162\":1,\"186\":1,\"192\":1,\"222\":1,\"252\":1,\"282\":1,\"303\":1,\"328\":1,\"353\":1,\"374\":1,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"694\":1,\"719\":1,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"901\":1,\"942\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"template\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"temporarily\",{\"1\":{\"302\":1,\"352\":1,\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"693\":1,\"752\":1,\"834\":1,\"900\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1}}],[\"tee\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"terminating\",{\"1\":{\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1}}],[\"terminate\",{\"1\":{\"63\":1,\"64\":1}}],[\"terminology\",{\"1\":{\"58\":1,\"59\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"termins\",{\"1\":{\"31\":1}}],[\"termin\",{\"1\":{\"30\":1}}],[\"tests\",{\"1\":{\"69\":1,\"290\":1,\"340\":1,\"681\":1,\"888\":1}}],[\"testsystem\",{\"1\":{\"32\":1}}],[\"testing\",{\"1\":{\"68\":1,\"99\":1,\"305\":3,\"355\":3,\"459\":2,\"460\":2,\"461\":2,\"462\":2,\"463\":1,\"527\":2,\"528\":2,\"529\":2,\"530\":2,\"531\":1,\"666\":2,\"667\":2,\"668\":2,\"669\":2,\"670\":1,\"696\":3,\"745\":2,\"746\":2,\"747\":2,\"748\":2,\"749\":1,\"873\":2,\"874\":2,\"875\":2,\"876\":2,\"877\":1,\"903\":3,\"968\":2,\"969\":2,\"970\":2,\"971\":2,\"972\":1,\"1096\":2,\"1097\":2,\"1098\":2,\"1099\":2,\"1100\":1,\"1129\":2,\"1130\":2,\"1131\":2,\"1132\":2,\"1133\":1,\"1273\":2,\"1274\":2,\"1275\":2,\"1276\":2,\"1277\":1,\"1322\":2,\"1323\":2,\"1324\":2,\"1325\":2,\"1326\":1,\"1466\":2,\"1467\":2,\"1468\":2,\"1469\":2,\"1470\":1,\"1509\":2,\"1510\":2,\"1511\":2,\"1512\":2,\"1513\":1,\"1669\":2,\"1670\":2,\"1671\":2,\"1672\":2,\"1673\":1,\"1718\":2,\"1719\":2,\"1720\":2,\"1721\":2,\"1722\":1,\"1846\":2,\"1847\":2,\"1848\":2,\"1849\":2,\"1850\":1,\"1905\":2,\"1906\":2,\"1907\":2,\"1908\":2,\"1909\":1,\"2065\":2,\"2066\":2,\"2067\":2,\"2068\":2,\"2069\":1,\"2124\":2,\"2125\":2,\"2126\":2,\"2127\":2,\"2128\":1,\"2284\":2,\"2285\":2,\"2286\":2,\"2287\":2,\"2288\":1}}],[\"testinfrastruktur\",{\"1\":{\"29\":1}}],[\"testdaten\",{\"1\":{\"32\":1}}],[\"test\",{\"1\":{\"29\":1,\"31\":7,\"35\":1,\"37\":1,\"66\":1,\"71\":1,\"81\":1,\"126\":1,\"127\":1,\"149\":1,\"150\":1,\"169\":1,\"173\":1,\"174\":1,\"192\":1,\"193\":2,\"206\":1,\"207\":2,\"226\":1,\"229\":1,\"236\":1,\"237\":2,\"256\":1,\"259\":1,\"266\":1,\"267\":2,\"286\":1,\"289\":1,\"298\":2,\"312\":1,\"313\":2,\"332\":1,\"335\":1,\"348\":2,\"358\":1,\"359\":2,\"378\":1,\"381\":1,\"424\":1,\"437\":1,\"457\":1,\"491\":1,\"525\":1,\"575\":1,\"588\":1,\"618\":2,\"645\":1,\"664\":1,\"678\":1,\"689\":2,\"703\":1,\"704\":2,\"723\":1,\"726\":1,\"743\":1,\"793\":1,\"810\":1,\"825\":2,\"852\":1,\"871\":1,\"885\":1,\"896\":2,\"926\":1,\"927\":2,\"929\":1,\"946\":1,\"949\":1,\"966\":1,\"1016\":1,\"1033\":1,\"1048\":2,\"1075\":1,\"1094\":1,\"1108\":1,\"1127\":1,\"1177\":1,\"1194\":1,\"1225\":2,\"1252\":1,\"1271\":1,\"1285\":1,\"1320\":1,\"1370\":1,\"1387\":1,\"1418\":2,\"1445\":1,\"1464\":1,\"1478\":1,\"1490\":2,\"1507\":1,\"1560\":1,\"1580\":2,\"1581\":1,\"1589\":1,\"1617\":2,\"1647\":2,\"1648\":1,\"1667\":1,\"1681\":1,\"1716\":1,\"1766\":1,\"1783\":1,\"1798\":2,\"1825\":1,\"1844\":1,\"1858\":1,\"1886\":2,\"1903\":1,\"1956\":1,\"1976\":2,\"1977\":1,\"1985\":1,\"2013\":2,\"2043\":2,\"2044\":1,\"2063\":1,\"2077\":1,\"2105\":2,\"2122\":1,\"2175\":1,\"2195\":2,\"2196\":1,\"2204\":1,\"2232\":2,\"2262\":2,\"2263\":1,\"2282\":1,\"2296\":1}}],[\"testen\",{\"1\":{\"29\":1,\"30\":1}}],[\"team\",{\"0\":{\"18\":1},\"1\":{\"18\":1,\"27\":1,\"77\":1,\"97\":1,\"100\":1,\"301\":1,\"303\":1,\"351\":1,\"353\":1,\"692\":1,\"694\":1,\"899\":1,\"901\":1}}],[\"technol\",{\"1\":{\"39\":9}}],[\"technologies\",{\"1\":{\"13\":1}}],[\"techniques\",{\"1\":{\"58\":1}}],[\"technische\",{\"1\":{\"29\":1,\"103\":1}}],[\"technical\",{\"0\":{\"90\":1},\"1\":{\"11\":2,\"62\":1,\"80\":1,\"81\":1,\"92\":1}}],[\"true\",{\"1\":{\"383\":1,\"394\":1,\"395\":1,\"396\":1,\"402\":1,\"405\":1,\"423\":1,\"424\":1,\"431\":1,\"445\":1,\"446\":2,\"448\":1,\"473\":1,\"474\":1,\"490\":1,\"513\":1,\"514\":2,\"516\":1,\"534\":1,\"545\":1,\"546\":1,\"547\":1,\"553\":1,\"556\":1,\"574\":1,\"575\":1,\"582\":1,\"626\":1,\"627\":1,\"644\":1,\"652\":1,\"653\":2,\"655\":1,\"675\":2,\"676\":1,\"678\":3,\"731\":1,\"732\":2,\"734\":1,\"752\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"772\":1,\"775\":1,\"792\":1,\"793\":1,\"800\":1,\"833\":1,\"834\":1,\"851\":1,\"859\":1,\"860\":2,\"862\":1,\"882\":2,\"883\":1,\"885\":3,\"954\":1,\"955\":2,\"957\":1,\"975\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"995\":1,\"998\":1,\"1015\":1,\"1016\":1,\"1023\":1,\"1056\":1,\"1057\":1,\"1074\":1,\"1082\":1,\"1083\":2,\"1085\":1,\"1105\":2,\"1106\":1,\"1108\":3,\"1115\":1,\"1116\":2,\"1118\":1,\"1136\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1156\":1,\"1159\":1,\"1176\":1,\"1177\":1,\"1184\":1,\"1233\":1,\"1234\":1,\"1251\":1,\"1259\":1,\"1260\":2,\"1262\":1,\"1282\":2,\"1283\":1,\"1285\":3,\"1308\":1,\"1309\":2,\"1311\":1,\"1329\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1349\":1,\"1352\":1,\"1369\":1,\"1370\":1,\"1377\":1,\"1426\":1,\"1427\":1,\"1444\":1,\"1452\":1,\"1453\":2,\"1455\":1,\"1475\":2,\"1476\":1,\"1478\":3,\"1495\":1,\"1496\":2,\"1498\":1,\"1516\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1539\":1,\"1542\":1,\"1559\":1,\"1560\":1,\"1567\":1,\"1579\":1,\"1587\":2,\"1589\":3,\"1625\":1,\"1626\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1646\":1,\"1655\":1,\"1656\":2,\"1658\":1,\"1678\":2,\"1679\":1,\"1681\":3,\"1704\":1,\"1705\":2,\"1707\":1,\"1725\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1745\":1,\"1748\":1,\"1765\":1,\"1766\":1,\"1773\":1,\"1806\":1,\"1807\":1,\"1824\":1,\"1832\":1,\"1833\":2,\"1835\":1,\"1855\":2,\"1856\":1,\"1858\":3,\"1891\":1,\"1892\":2,\"1894\":1,\"1912\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1935\":1,\"1938\":1,\"1955\":1,\"1956\":1,\"1963\":1,\"1975\":1,\"1983\":2,\"1985\":3,\"2021\":1,\"2022\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2042\":1,\"2051\":1,\"2052\":2,\"2054\":1,\"2074\":2,\"2075\":1,\"2077\":3,\"2110\":1,\"2111\":2,\"2113\":1,\"2131\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2154\":1,\"2157\":1,\"2174\":1,\"2175\":1,\"2182\":1,\"2194\":1,\"2202\":2,\"2204\":3,\"2240\":1,\"2241\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2261\":1,\"2270\":1,\"2271\":2,\"2273\":1,\"2293\":2,\"2294\":1,\"2296\":3}}],[\"trust\",{\"0\":{\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"625\":1,\"663\":1,\"665\":1,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1624\":1,\"1666\":1,\"1668\":1,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"2020\":1,\"2062\":1,\"2064\":1,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2239\":1,\"2281\":1,\"2283\":1},\"1\":{\"49\":1,\"58\":1,\"74\":1,\"76\":1,\"77\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"226\":1,\"246\":1,\"256\":1,\"276\":1,\"286\":1,\"301\":1,\"322\":1,\"332\":1,\"351\":1,\"368\":1,\"378\":1,\"406\":2,\"429\":2,\"456\":2,\"458\":2,\"472\":2,\"524\":2,\"526\":2,\"557\":2,\"580\":2,\"625\":2,\"663\":2,\"665\":2,\"677\":1,\"678\":1,\"692\":1,\"713\":1,\"723\":1,\"742\":2,\"744\":2,\"776\":2,\"798\":2,\"832\":2,\"870\":2,\"872\":2,\"884\":1,\"885\":1,\"899\":1,\"936\":1,\"946\":1,\"965\":2,\"967\":2,\"999\":2,\"1021\":2,\"1055\":2,\"1093\":2,\"1095\":2,\"1107\":1,\"1108\":1,\"1126\":2,\"1128\":2,\"1160\":2,\"1182\":2,\"1232\":2,\"1270\":2,\"1272\":2,\"1284\":1,\"1285\":1,\"1319\":2,\"1321\":2,\"1353\":2,\"1375\":2,\"1425\":2,\"1463\":2,\"1465\":2,\"1477\":1,\"1478\":1,\"1506\":2,\"1508\":2,\"1543\":2,\"1565\":2,\"1588\":1,\"1589\":1,\"1624\":2,\"1666\":2,\"1668\":2,\"1680\":1,\"1681\":1,\"1715\":2,\"1717\":2,\"1749\":2,\"1771\":2,\"1805\":2,\"1843\":2,\"1845\":2,\"1857\":1,\"1858\":1,\"1902\":2,\"1904\":2,\"1939\":2,\"1961\":2,\"1984\":1,\"1985\":1,\"2020\":2,\"2062\":2,\"2064\":2,\"2076\":1,\"2077\":1,\"2121\":2,\"2123\":2,\"2158\":2,\"2180\":2,\"2203\":1,\"2204\":1,\"2239\":2,\"2281\":2,\"2283\":2,\"2295\":1,\"2296\":1}}],[\"trusted\",{\"1\":{\"11\":1,\"301\":2,\"351\":2,\"406\":1,\"429\":1,\"456\":1,\"458\":1,\"472\":1,\"524\":1,\"526\":1,\"557\":1,\"580\":1,\"625\":1,\"663\":1,\"665\":1,\"677\":2,\"692\":2,\"742\":1,\"744\":1,\"776\":1,\"798\":1,\"832\":1,\"870\":1,\"872\":1,\"884\":2,\"899\":2,\"965\":1,\"967\":1,\"999\":1,\"1021\":1,\"1055\":1,\"1093\":1,\"1095\":1,\"1107\":2,\"1126\":1,\"1128\":1,\"1160\":1,\"1182\":1,\"1232\":1,\"1270\":1,\"1272\":1,\"1284\":2,\"1319\":1,\"1321\":1,\"1353\":1,\"1375\":1,\"1425\":1,\"1463\":1,\"1465\":1,\"1477\":2,\"1506\":1,\"1508\":1,\"1543\":1,\"1565\":1,\"1588\":2,\"1624\":1,\"1666\":1,\"1668\":1,\"1680\":2,\"1715\":1,\"1717\":1,\"1749\":1,\"1771\":1,\"1805\":1,\"1843\":1,\"1845\":1,\"1857\":2,\"1902\":1,\"1904\":1,\"1939\":1,\"1961\":1,\"1984\":2,\"2020\":1,\"2062\":1,\"2064\":1,\"2076\":2,\"2121\":1,\"2123\":1,\"2158\":1,\"2180\":1,\"2203\":2,\"2239\":1,\"2281\":1,\"2283\":1,\"2295\":2}}],[\"triangle\",{\"1\":{\"90\":2}}],[\"trigger\",{\"1\":{\"63\":1}}],[\"track\",{\"1\":{\"301\":1,\"303\":1,\"351\":1,\"353\":1,\"692\":1,\"694\":1,\"899\":1,\"901\":1}}],[\"traffic\",{\"1\":{\"64\":1}}],[\"transport\",{\"1\":{\"73\":1,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"transmit\",{\"1\":{\"58\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"transformation\",{\"1\":{\"14\":1}}],[\"transferred\",{\"1\":{\"55\":2,\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"transfers\",{\"1\":{\"55\":1}}],[\"transfer\",{\"0\":{\"92\":1},\"1\":{\"1\":1,\"29\":1,\"35\":1,\"39\":1,\"55\":1,\"90\":1,\"92\":2,\"270\":2,\"316\":2,\"362\":2,\"707\":2,\"929\":1}}],[\"transit\",{\"1\":{\"10\":2}}],[\"thoroughly\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"thorough\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"those\",{\"1\":{\"80\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"thumprint\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"thumbprints\",{\"1\":{\"137\":1,\"610\":2,\"612\":2,\"817\":2,\"819\":2,\"1040\":2,\"1042\":2,\"1217\":2,\"1219\":2,\"1410\":2,\"1412\":2,\"1482\":2,\"1484\":2,\"1609\":2,\"1611\":2,\"1790\":2,\"1792\":2,\"1878\":2,\"1880\":2,\"2005\":2,\"2007\":2,\"2097\":2,\"2099\":2,\"2224\":2,\"2226\":2}}],[\"thumbprint\",{\"0\":{\"612\":1,\"641\":1,\"819\":1,\"848\":1,\"1042\":1,\"1071\":1,\"1219\":1,\"1248\":1,\"1412\":1,\"1441\":1,\"1484\":1,\"1611\":1,\"1643\":1,\"1792\":1,\"1821\":1,\"1880\":1,\"2007\":1,\"2039\":1,\"2099\":1,\"2226\":1,\"2258\":1},\"1\":{\"137\":4,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":2,\"611\":1,\"612\":1,\"618\":1,\"641\":3,\"717\":1,\"817\":2,\"818\":1,\"819\":1,\"825\":1,\"848\":3,\"940\":1,\"1040\":2,\"1041\":1,\"1042\":1,\"1048\":1,\"1071\":3,\"1217\":2,\"1218\":1,\"1219\":1,\"1225\":1,\"1248\":3,\"1410\":2,\"1411\":1,\"1412\":1,\"1418\":1,\"1441\":3,\"1482\":1,\"1483\":1,\"1484\":1,\"1490\":1,\"1609\":2,\"1610\":1,\"1611\":1,\"1617\":1,\"1643\":3,\"1790\":2,\"1791\":1,\"1792\":1,\"1798\":1,\"1821\":3,\"1878\":1,\"1879\":1,\"1880\":1,\"1886\":1,\"2005\":2,\"2006\":1,\"2007\":1,\"2013\":1,\"2039\":3,\"2097\":1,\"2098\":1,\"2099\":1,\"2105\":1,\"2224\":2,\"2225\":1,\"2226\":1,\"2232\":1,\"2258\":3}}],[\"thus\",{\"1\":{\"62\":1}}],[\"than\",{\"1\":{\"99\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"thank\",{\"1\":{\"18\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"305\":1,\"313\":1,\"329\":1,\"355\":1,\"359\":1,\"375\":1,\"696\":1,\"704\":1,\"720\":1,\"903\":1,\"927\":1,\"943\":1}}],[\"that\",{\"1\":{\"8\":1,\"10\":1,\"23\":1,\"25\":1,\"49\":3,\"53\":3,\"55\":1,\"58\":1,\"59\":1,\"60\":2,\"61\":2,\"62\":1,\"66\":2,\"68\":1,\"70\":1,\"73\":2,\"81\":1,\"84\":1,\"95\":1,\"97\":1,\"126\":1,\"134\":1,\"137\":3,\"138\":5,\"149\":1,\"157\":1,\"160\":3,\"161\":5,\"173\":1,\"181\":1,\"184\":3,\"185\":5,\"205\":1,\"217\":1,\"220\":3,\"221\":5,\"226\":1,\"235\":1,\"247\":1,\"250\":3,\"251\":4,\"256\":1,\"265\":1,\"277\":1,\"280\":3,\"281\":4,\"286\":1,\"294\":2,\"300\":1,\"303\":2,\"304\":1,\"311\":1,\"323\":1,\"326\":3,\"327\":4,\"332\":1,\"344\":2,\"350\":1,\"353\":2,\"354\":1,\"357\":1,\"369\":1,\"372\":3,\"373\":4,\"378\":1,\"409\":1,\"432\":2,\"436\":2,\"439\":1,\"487\":1,\"493\":1,\"560\":1,\"583\":2,\"587\":2,\"590\":1,\"617\":1,\"618\":1,\"640\":1,\"647\":1,\"685\":2,\"691\":1,\"694\":2,\"695\":1,\"702\":1,\"714\":1,\"717\":3,\"718\":4,\"723\":1,\"804\":2,\"808\":2,\"812\":1,\"824\":1,\"825\":1,\"847\":1,\"854\":1,\"892\":2,\"898\":1,\"901\":2,\"902\":1,\"915\":1,\"925\":1,\"937\":1,\"940\":3,\"941\":4,\"946\":1,\"1027\":2,\"1031\":2,\"1035\":1,\"1047\":1,\"1048\":1,\"1070\":1,\"1077\":1,\"1188\":2,\"1192\":2,\"1196\":1,\"1207\":1,\"1224\":1,\"1225\":1,\"1247\":1,\"1254\":1,\"1295\":1,\"1381\":2,\"1385\":2,\"1389\":1,\"1400\":1,\"1417\":1,\"1418\":1,\"1440\":1,\"1447\":1,\"1490\":1,\"1571\":2,\"1575\":2,\"1583\":1,\"1599\":1,\"1616\":1,\"1617\":1,\"1642\":1,\"1650\":1,\"1691\":1,\"1777\":2,\"1781\":2,\"1785\":1,\"1797\":1,\"1798\":1,\"1820\":1,\"1827\":1,\"1868\":1,\"1886\":1,\"1967\":2,\"1971\":2,\"1979\":1,\"1995\":1,\"2012\":1,\"2013\":1,\"2038\":1,\"2046\":1,\"2087\":1,\"2105\":1,\"2186\":2,\"2190\":2,\"2198\":1,\"2214\":1,\"2231\":1,\"2232\":1,\"2257\":1,\"2265\":1,\"2306\":1}}],[\"think\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"thirdly\",{\"1\":{\"49\":1}}],[\"third\",{\"1\":{\"11\":1,\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"this\",{\"1\":{\"0\":1,\"23\":1,\"24\":1,\"28\":1,\"53\":1,\"54\":2,\"55\":1,\"58\":1,\"59\":2,\"60\":2,\"61\":1,\"64\":1,\"66\":2,\"67\":1,\"69\":1,\"70\":1,\"71\":1,\"73\":1,\"78\":1,\"80\":3,\"81\":2,\"82\":1,\"86\":1,\"89\":3,\"90\":2,\"97\":1,\"98\":1,\"99\":1,\"101\":2,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"125\":1,\"126\":1,\"129\":1,\"136\":2,\"148\":1,\"149\":1,\"152\":1,\"159\":2,\"170\":1,\"172\":1,\"173\":1,\"176\":1,\"183\":2,\"202\":1,\"205\":1,\"219\":2,\"226\":1,\"235\":1,\"249\":2,\"256\":1,\"265\":1,\"279\":2,\"286\":1,\"294\":1,\"296\":1,\"297\":1,\"298\":1,\"299\":2,\"301\":4,\"303\":1,\"305\":2,\"311\":1,\"325\":2,\"332\":1,\"344\":1,\"346\":1,\"347\":1,\"348\":1,\"349\":2,\"351\":4,\"353\":1,\"355\":2,\"357\":1,\"371\":2,\"378\":1,\"383\":1,\"394\":1,\"395\":1,\"396\":1,\"470\":1,\"474\":1,\"485\":1,\"534\":1,\"545\":1,\"546\":1,\"547\":1,\"610\":1,\"612\":1,\"618\":2,\"623\":1,\"627\":1,\"638\":1,\"677\":1,\"685\":1,\"687\":1,\"688\":1,\"689\":1,\"690\":2,\"692\":4,\"694\":1,\"696\":2,\"702\":1,\"716\":2,\"723\":1,\"752\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"817\":1,\"819\":1,\"825\":2,\"830\":1,\"834\":1,\"845\":1,\"884\":1,\"892\":1,\"894\":1,\"895\":1,\"896\":1,\"897\":2,\"899\":4,\"901\":1,\"903\":2,\"925\":1,\"939\":2,\"946\":1,\"975\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1040\":1,\"1042\":1,\"1048\":2,\"1053\":1,\"1057\":1,\"1068\":1,\"1107\":1,\"1136\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1217\":1,\"1219\":1,\"1225\":2,\"1230\":1,\"1234\":1,\"1245\":1,\"1284\":1,\"1329\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1410\":1,\"1412\":1,\"1418\":2,\"1423\":1,\"1427\":1,\"1438\":1,\"1477\":1,\"1482\":1,\"1484\":1,\"1490\":2,\"1516\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1588\":1,\"1609\":1,\"1611\":1,\"1617\":2,\"1622\":1,\"1626\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1680\":1,\"1725\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1790\":1,\"1792\":1,\"1798\":2,\"1803\":1,\"1807\":1,\"1818\":1,\"1857\":1,\"1878\":1,\"1880\":1,\"1886\":2,\"1912\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1984\":1,\"2005\":1,\"2007\":1,\"2013\":2,\"2018\":1,\"2022\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2076\":1,\"2097\":1,\"2099\":1,\"2105\":2,\"2131\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2203\":1,\"2224\":1,\"2226\":1,\"2232\":2,\"2237\":1,\"2241\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2295\":1}}],[\"threads\",{\"0\":{\"809\":1,\"1032\":1,\"1193\":1,\"1386\":1,\"1576\":1,\"1782\":1,\"1972\":1,\"2191\":1},\"1\":{\"802\":1,\"803\":1,\"809\":2,\"1025\":1,\"1026\":1,\"1032\":2,\"1186\":1,\"1187\":1,\"1193\":2,\"1379\":1,\"1380\":1,\"1386\":2,\"1569\":1,\"1570\":1,\"1576\":2,\"1775\":1,\"1776\":1,\"1782\":2,\"1965\":1,\"1966\":1,\"1972\":2,\"2184\":1,\"2185\":1,\"2191\":2}}],[\"three\",{\"1\":{\"11\":1,\"52\":1,\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"thrilled\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"through\",{\"1\":{\"11\":1,\"20\":1,\"27\":1}}],[\"there\",{\"1\":{\"61\":3,\"73\":1,\"89\":1,\"95\":1,\"139\":1,\"143\":1,\"162\":1,\"166\":1,\"186\":1,\"190\":1,\"222\":1,\"226\":2,\"252\":1,\"256\":2,\"282\":1,\"286\":2,\"303\":2,\"304\":1,\"328\":1,\"332\":2,\"353\":2,\"354\":1,\"374\":1,\"378\":2,\"617\":1,\"694\":2,\"695\":1,\"719\":1,\"723\":2,\"824\":1,\"901\":2,\"902\":1,\"942\":1,\"946\":2,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"therefore\",{\"1\":{\"58\":2,\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"they\",{\"1\":{\"59\":1,\"133\":1,\"156\":1,\"180\":1,\"216\":1,\"246\":1,\"276\":1,\"300\":1,\"301\":2,\"322\":1,\"350\":1,\"351\":2,\"368\":1,\"691\":1,\"692\":2,\"713\":1,\"898\":1,\"899\":2,\"936\":1}}],[\"then\",{\"1\":{\"55\":1,\"128\":2,\"133\":1,\"140\":1,\"151\":2,\"156\":1,\"163\":1,\"175\":2,\"180\":1,\"187\":1,\"207\":2,\"216\":1,\"223\":1,\"237\":1,\"246\":1,\"253\":1,\"267\":1,\"276\":1,\"283\":1,\"313\":1,\"322\":1,\"329\":1,\"359\":1,\"368\":1,\"375\":1,\"390\":1,\"483\":1,\"541\":1,\"636\":1,\"704\":1,\"713\":1,\"720\":1,\"759\":1,\"843\":1,\"927\":1,\"936\":1,\"943\":1,\"982\":1,\"1066\":1,\"1143\":1,\"1243\":1,\"1336\":1,\"1436\":1,\"1523\":1,\"1635\":1,\"1732\":1,\"1816\":1,\"1919\":1,\"2031\":1,\"2138\":1,\"2250\":1}}],[\"their\",{\"1\":{\"49\":2,\"62\":1,\"84\":1,\"290\":1,\"301\":3,\"340\":1,\"351\":3,\"681\":1,\"692\":3,\"888\":1,\"899\":3}}],[\"theme\",{\"0\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1},\"1\":{\"1580\":2,\"1647\":2,\"1976\":2,\"2043\":2,\"2195\":2,\"2262\":2}}],[\"them\",{\"1\":{\"49\":1,\"61\":1,\"84\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"226\":1,\"252\":1,\"256\":1,\"282\":1,\"286\":1,\"302\":1,\"305\":1,\"328\":1,\"332\":1,\"352\":1,\"355\":1,\"374\":1,\"378\":1,\"693\":1,\"696\":1,\"719\":1,\"723\":1,\"900\":1,\"903\":1,\"942\":1,\"946\":1}}],[\"these\",{\"1\":{\"25\":1,\"49\":1,\"54\":1,\"57\":1,\"58\":1,\"59\":1,\"60\":1,\"61\":2,\"67\":1,\"90\":1,\"167\":1,\"191\":1,\"227\":1,\"301\":1,\"351\":1,\"396\":1,\"547\":1,\"692\":1,\"765\":1,\"766\":1,\"899\":1,\"988\":1,\"989\":1,\"1149\":1,\"1150\":1,\"1342\":1,\"1343\":1,\"1531\":1,\"1532\":1,\"1738\":1,\"1739\":1,\"1927\":1,\"1928\":1,\"2146\":1,\"2147\":1}}],[\"the\",{\"0\":{\"11\":2,\"27\":1,\"89\":1,\"92\":1,\"296\":1,\"346\":1,\"687\":1,\"894\":1},\"1\":{\"0\":9,\"1\":4,\"7\":4,\"8\":2,\"10\":28,\"11\":11,\"12\":1,\"13\":3,\"14\":5,\"15\":3,\"18\":1,\"21\":4,\"24\":1,\"25\":2,\"27\":4,\"28\":1,\"39\":4,\"41\":1,\"42\":1,\"49\":7,\"50\":1,\"52\":11,\"53\":5,\"54\":17,\"55\":12,\"56\":1,\"57\":6,\"58\":15,\"59\":6,\"60\":5,\"61\":21,\"62\":17,\"63\":21,\"64\":1,\"66\":9,\"67\":4,\"68\":4,\"69\":5,\"70\":2,\"71\":4,\"73\":11,\"74\":5,\"76\":5,\"77\":7,\"80\":10,\"81\":18,\"82\":1,\"83\":2,\"84\":9,\"88\":6,\"89\":5,\"90\":5,\"91\":8,\"92\":8,\"95\":17,\"97\":1,\"98\":2,\"99\":11,\"100\":4,\"102\":3,\"105\":3,\"106\":1,\"107\":3,\"108\":1,\"109\":3,\"110\":1,\"111\":3,\"112\":1,\"113\":3,\"114\":1,\"115\":3,\"116\":1,\"117\":3,\"118\":1,\"119\":9,\"122\":8,\"123\":3,\"124\":1,\"125\":3,\"126\":9,\"127\":1,\"128\":5,\"129\":7,\"132\":3,\"133\":2,\"134\":8,\"136\":3,\"137\":51,\"138\":36,\"139\":7,\"140\":1,\"143\":7,\"144\":9,\"147\":8,\"148\":3,\"149\":9,\"150\":1,\"151\":5,\"152\":7,\"155\":3,\"156\":2,\"157\":8,\"159\":3,\"160\":49,\"161\":37,\"162\":7,\"163\":1,\"166\":7,\"167\":3,\"168\":5,\"169\":12,\"170\":3,\"171\":1,\"172\":3,\"173\":9,\"174\":1,\"175\":5,\"176\":7,\"179\":3,\"180\":2,\"181\":8,\"183\":3,\"184\":49,\"185\":37,\"186\":7,\"187\":1,\"190\":7,\"191\":3,\"192\":11,\"193\":23,\"194\":9,\"197\":8,\"198\":9,\"201\":8,\"202\":3,\"203\":1,\"204\":1,\"205\":8,\"206\":3,\"207\":10,\"212\":4,\"215\":3,\"216\":2,\"217\":8,\"219\":3,\"220\":49,\"221\":37,\"222\":7,\"223\":1,\"226\":24,\"227\":3,\"228\":5,\"229\":12,\"230\":9,\"233\":8,\"234\":1,\"235\":8,\"236\":3,\"237\":7,\"242\":4,\"245\":3,\"246\":2,\"247\":8,\"249\":3,\"250\":49,\"251\":34,\"252\":7,\"253\":1,\"256\":24,\"257\":3,\"258\":5,\"259\":12,\"260\":9,\"263\":8,\"264\":1,\"265\":8,\"266\":3,\"267\":7,\"272\":4,\"275\":3,\"276\":2,\"277\":8,\"279\":3,\"280\":49,\"281\":34,\"282\":7,\"283\":1,\"286\":24,\"287\":3,\"288\":5,\"289\":12,\"290\":3,\"291\":2,\"293\":6,\"294\":3,\"295\":1,\"296\":1,\"299\":4,\"300\":3,\"301\":7,\"302\":3,\"303\":1,\"304\":1,\"305\":9,\"306\":11,\"309\":8,\"310\":1,\"311\":8,\"312\":3,\"313\":7,\"318\":4,\"321\":3,\"322\":2,\"323\":8,\"325\":3,\"326\":49,\"327\":34,\"328\":7,\"329\":1,\"332\":24,\"333\":3,\"334\":5,\"335\":12,\"336\":11,\"339\":8,\"340\":3,\"341\":2,\"343\":6,\"344\":3,\"345\":1,\"346\":1,\"349\":4,\"350\":3,\"351\":7,\"352\":3,\"353\":1,\"354\":1,\"355\":9,\"356\":1,\"357\":8,\"358\":3,\"359\":7,\"364\":4,\"367\":3,\"368\":2,\"369\":8,\"371\":3,\"372\":49,\"373\":34,\"374\":7,\"375\":1,\"378\":24,\"379\":3,\"380\":5,\"381\":12,\"383\":1,\"385\":3,\"386\":3,\"387\":7,\"388\":4,\"389\":3,\"390\":3,\"391\":4,\"392\":3,\"393\":3,\"396\":1,\"398\":1,\"399\":1,\"400\":2,\"401\":2,\"402\":1,\"403\":1,\"404\":1,\"407\":1,\"408\":2,\"409\":5,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":1,\"419\":4,\"420\":1,\"424\":1,\"426\":1,\"429\":2,\"430\":1,\"432\":2,\"433\":1,\"434\":1,\"435\":4,\"436\":1,\"447\":1,\"451\":1,\"452\":2,\"453\":2,\"456\":1,\"468\":1,\"469\":1,\"470\":1,\"471\":1,\"474\":1,\"476\":3,\"477\":3,\"478\":7,\"479\":4,\"480\":3,\"481\":4,\"482\":3,\"483\":3,\"484\":3,\"485\":1,\"486\":6,\"487\":5,\"488\":2,\"498\":2,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"504\":1,\"505\":3,\"506\":5,\"507\":1,\"508\":1,\"515\":1,\"519\":1,\"520\":2,\"521\":2,\"524\":1,\"534\":1,\"536\":3,\"537\":3,\"538\":7,\"539\":4,\"540\":3,\"541\":3,\"542\":4,\"543\":3,\"544\":3,\"547\":1,\"549\":1,\"550\":1,\"551\":2,\"552\":2,\"553\":1,\"554\":1,\"555\":1,\"558\":1,\"559\":2,\"560\":5,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":1,\"570\":4,\"571\":1,\"575\":1,\"577\":1,\"580\":2,\"581\":1,\"583\":2,\"584\":1,\"585\":1,\"586\":4,\"587\":1,\"595\":2,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"601\":1,\"602\":3,\"603\":5,\"604\":1,\"605\":1,\"606\":1,\"610\":17,\"611\":1,\"612\":4,\"613\":7,\"614\":1,\"616\":2,\"617\":9,\"618\":3,\"621\":1,\"622\":1,\"623\":1,\"624\":1,\"627\":1,\"629\":3,\"630\":3,\"631\":7,\"632\":4,\"633\":3,\"634\":4,\"635\":3,\"636\":3,\"637\":3,\"638\":1,\"639\":6,\"640\":5,\"641\":3,\"642\":2,\"654\":1,\"658\":1,\"659\":2,\"660\":2,\"663\":1,\"674\":6,\"675\":4,\"676\":2,\"677\":4,\"681\":3,\"682\":2,\"684\":6,\"685\":3,\"686\":1,\"687\":1,\"690\":4,\"691\":3,\"692\":7,\"693\":3,\"694\":1,\"695\":1,\"696\":9,\"697\":11,\"700\":8,\"701\":1,\"702\":8,\"703\":3,\"704\":7,\"709\":4,\"712\":3,\"713\":2,\"714\":8,\"716\":3,\"717\":49,\"718\":34,\"719\":7,\"720\":1,\"723\":24,\"724\":3,\"725\":5,\"726\":12,\"733\":1,\"737\":1,\"738\":2,\"739\":2,\"742\":1,\"752\":1,\"754\":3,\"755\":3,\"756\":7,\"757\":4,\"758\":3,\"759\":3,\"760\":4,\"761\":3,\"762\":3,\"765\":1,\"766\":1,\"768\":1,\"769\":1,\"770\":2,\"771\":2,\"772\":1,\"773\":1,\"774\":1,\"777\":1,\"778\":2,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":1,\"788\":4,\"789\":1,\"793\":1,\"795\":1,\"798\":2,\"799\":1,\"802\":1,\"803\":1,\"804\":2,\"805\":1,\"806\":1,\"807\":4,\"808\":1,\"817\":17,\"818\":1,\"819\":4,\"820\":7,\"821\":1,\"823\":2,\"824\":9,\"825\":3,\"828\":1,\"829\":1,\"830\":1,\"831\":1,\"834\":1,\"836\":3,\"837\":3,\"838\":7,\"839\":4,\"840\":3,\"841\":4,\"842\":3,\"843\":3,\"844\":3,\"845\":1,\"846\":6,\"847\":5,\"848\":3,\"849\":2,\"861\":1,\"865\":1,\"866\":2,\"867\":2,\"870\":1,\"881\":6,\"882\":4,\"883\":2,\"884\":4,\"888\":3,\"889\":2,\"891\":6,\"892\":3,\"893\":1,\"894\":1,\"897\":4,\"898\":3,\"899\":7,\"900\":3,\"901\":1,\"902\":1,\"903\":9,\"904\":11,\"907\":8,\"909\":2,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"916\":1,\"917\":3,\"918\":5,\"919\":1,\"920\":1,\"921\":1,\"924\":1,\"925\":8,\"926\":3,\"927\":7,\"928\":1,\"929\":5,\"931\":5,\"932\":4,\"935\":3,\"936\":2,\"937\":8,\"939\":3,\"940\":49,\"941\":34,\"942\":7,\"943\":1,\"946\":24,\"947\":3,\"948\":5,\"949\":12,\"956\":1,\"960\":1,\"961\":2,\"962\":2,\"965\":1,\"975\":1,\"977\":3,\"978\":3,\"979\":7,\"980\":4,\"981\":3,\"982\":3,\"983\":4,\"984\":3,\"985\":3,\"988\":1,\"989\":1,\"991\":1,\"992\":1,\"993\":2,\"994\":2,\"995\":1,\"996\":1,\"997\":1,\"1000\":1,\"1001\":2,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1011\":4,\"1012\":1,\"1016\":1,\"1018\":1,\"1021\":2,\"1022\":1,\"1025\":1,\"1026\":1,\"1027\":2,\"1028\":1,\"1029\":1,\"1030\":4,\"1031\":1,\"1040\":17,\"1041\":1,\"1042\":4,\"1043\":7,\"1044\":1,\"1046\":2,\"1047\":9,\"1048\":3,\"1051\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1057\":1,\"1059\":3,\"1060\":3,\"1061\":7,\"1062\":4,\"1063\":3,\"1064\":4,\"1065\":3,\"1066\":3,\"1067\":3,\"1068\":1,\"1069\":6,\"1070\":5,\"1071\":3,\"1072\":2,\"1084\":1,\"1088\":1,\"1089\":2,\"1090\":2,\"1093\":1,\"1104\":6,\"1105\":4,\"1106\":2,\"1107\":4,\"1117\":1,\"1121\":1,\"1122\":2,\"1123\":2,\"1126\":1,\"1136\":1,\"1138\":3,\"1139\":3,\"1140\":7,\"1141\":4,\"1142\":3,\"1143\":3,\"1144\":4,\"1145\":3,\"1146\":3,\"1149\":1,\"1150\":1,\"1152\":1,\"1153\":1,\"1154\":2,\"1155\":2,\"1156\":1,\"1157\":1,\"1158\":1,\"1161\":1,\"1162\":2,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1172\":4,\"1173\":1,\"1177\":1,\"1179\":1,\"1182\":2,\"1183\":1,\"1186\":1,\"1187\":1,\"1188\":2,\"1189\":1,\"1190\":1,\"1191\":4,\"1192\":1,\"1201\":2,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1208\":1,\"1209\":3,\"1210\":5,\"1211\":1,\"1212\":1,\"1213\":1,\"1217\":17,\"1218\":1,\"1219\":4,\"1220\":7,\"1221\":1,\"1223\":2,\"1224\":9,\"1225\":3,\"1228\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1234\":1,\"1236\":3,\"1237\":3,\"1238\":7,\"1239\":4,\"1240\":3,\"1241\":4,\"1242\":3,\"1243\":3,\"1244\":3,\"1245\":1,\"1246\":6,\"1247\":5,\"1248\":3,\"1249\":2,\"1261\":1,\"1265\":1,\"1266\":2,\"1267\":2,\"1270\":1,\"1281\":6,\"1282\":4,\"1283\":2,\"1284\":4,\"1289\":2,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1296\":1,\"1297\":3,\"1298\":5,\"1299\":1,\"1300\":1,\"1301\":1,\"1310\":1,\"1314\":1,\"1315\":2,\"1316\":2,\"1319\":1,\"1329\":1,\"1331\":3,\"1332\":3,\"1333\":7,\"1334\":4,\"1335\":3,\"1336\":3,\"1337\":4,\"1338\":3,\"1339\":3,\"1342\":1,\"1343\":1,\"1345\":1,\"1346\":1,\"1347\":2,\"1348\":2,\"1349\":1,\"1350\":1,\"1351\":1,\"1354\":1,\"1355\":2,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1365\":4,\"1366\":1,\"1370\":1,\"1372\":1,\"1375\":2,\"1376\":1,\"1379\":1,\"1380\":1,\"1381\":2,\"1382\":1,\"1383\":1,\"1384\":4,\"1385\":1,\"1394\":2,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1401\":1,\"1402\":3,\"1403\":5,\"1404\":1,\"1405\":1,\"1406\":1,\"1410\":17,\"1411\":1,\"1412\":4,\"1413\":7,\"1414\":1,\"1416\":2,\"1417\":9,\"1418\":3,\"1421\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1427\":1,\"1429\":3,\"1430\":3,\"1431\":7,\"1432\":4,\"1433\":3,\"1434\":4,\"1435\":3,\"1436\":3,\"1437\":3,\"1438\":1,\"1439\":6,\"1440\":5,\"1441\":3,\"1442\":2,\"1454\":1,\"1458\":1,\"1459\":2,\"1460\":2,\"1463\":1,\"1474\":6,\"1475\":4,\"1476\":2,\"1477\":4,\"1482\":15,\"1483\":1,\"1484\":4,\"1485\":7,\"1486\":1,\"1488\":2,\"1489\":1,\"1490\":3,\"1497\":1,\"1501\":1,\"1502\":2,\"1503\":2,\"1506\":1,\"1516\":1,\"1518\":3,\"1519\":3,\"1520\":6,\"1521\":4,\"1522\":2,\"1523\":2,\"1524\":4,\"1525\":2,\"1526\":2,\"1527\":2,\"1528\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1535\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1555\":4,\"1556\":1,\"1560\":1,\"1562\":1,\"1565\":2,\"1566\":1,\"1569\":1,\"1570\":1,\"1571\":2,\"1572\":1,\"1573\":1,\"1574\":4,\"1575\":1,\"1577\":2,\"1580\":1,\"1586\":5,\"1587\":4,\"1588\":4,\"1593\":2,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1600\":1,\"1601\":3,\"1602\":5,\"1603\":1,\"1604\":1,\"1605\":1,\"1609\":19,\"1610\":1,\"1611\":4,\"1612\":7,\"1613\":1,\"1615\":2,\"1616\":9,\"1617\":3,\"1620\":1,\"1621\":1,\"1626\":1,\"1628\":3,\"1629\":3,\"1630\":6,\"1631\":4,\"1632\":2,\"1633\":4,\"1634\":2,\"1635\":2,\"1636\":2,\"1637\":2,\"1638\":1,\"1639\":1,\"1641\":5,\"1642\":4,\"1643\":3,\"1644\":1,\"1647\":1,\"1657\":1,\"1661\":1,\"1662\":2,\"1663\":2,\"1666\":1,\"1677\":6,\"1678\":4,\"1679\":2,\"1680\":4,\"1685\":2,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1692\":1,\"1693\":3,\"1694\":5,\"1695\":1,\"1696\":1,\"1697\":1,\"1706\":1,\"1710\":1,\"1711\":2,\"1712\":2,\"1715\":1,\"1725\":1,\"1727\":3,\"1728\":3,\"1729\":7,\"1730\":4,\"1731\":3,\"1732\":3,\"1733\":4,\"1734\":3,\"1735\":3,\"1738\":1,\"1739\":1,\"1741\":1,\"1742\":1,\"1743\":2,\"1744\":2,\"1745\":1,\"1746\":1,\"1747\":1,\"1750\":1,\"1751\":2,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1761\":4,\"1762\":1,\"1766\":1,\"1768\":1,\"1771\":2,\"1772\":1,\"1775\":1,\"1776\":1,\"1777\":2,\"1778\":1,\"1779\":1,\"1780\":4,\"1781\":1,\"1790\":17,\"1791\":1,\"1792\":4,\"1793\":7,\"1794\":1,\"1796\":2,\"1797\":9,\"1798\":3,\"1801\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1807\":1,\"1809\":3,\"1810\":3,\"1811\":7,\"1812\":4,\"1813\":3,\"1814\":4,\"1815\":3,\"1816\":3,\"1817\":3,\"1818\":1,\"1819\":6,\"1820\":5,\"1821\":3,\"1822\":2,\"1834\":1,\"1838\":1,\"1839\":2,\"1840\":2,\"1843\":1,\"1854\":6,\"1855\":4,\"1856\":2,\"1857\":4,\"1862\":2,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1869\":1,\"1870\":3,\"1871\":5,\"1872\":1,\"1873\":1,\"1874\":1,\"1878\":15,\"1879\":1,\"1880\":4,\"1881\":7,\"1882\":1,\"1884\":2,\"1885\":1,\"1886\":3,\"1893\":1,\"1897\":1,\"1898\":2,\"1899\":2,\"1902\":1,\"1912\":1,\"1914\":3,\"1915\":3,\"1916\":6,\"1917\":4,\"1918\":2,\"1919\":2,\"1920\":4,\"1921\":2,\"1922\":2,\"1923\":2,\"1924\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1931\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1951\":4,\"1952\":1,\"1956\":1,\"1958\":1,\"1961\":2,\"1962\":1,\"1965\":1,\"1966\":1,\"1967\":2,\"1968\":1,\"1969\":1,\"1970\":4,\"1971\":1,\"1973\":2,\"1976\":1,\"1982\":5,\"1983\":4,\"1984\":4,\"1989\":2,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"1996\":1,\"1997\":3,\"1998\":5,\"1999\":1,\"2000\":1,\"2001\":1,\"2005\":19,\"2006\":1,\"2007\":4,\"2008\":7,\"2009\":1,\"2011\":2,\"2012\":9,\"2013\":3,\"2016\":1,\"2017\":1,\"2022\":1,\"2024\":3,\"2025\":3,\"2026\":6,\"2027\":4,\"2028\":2,\"2029\":4,\"2030\":2,\"2031\":2,\"2032\":2,\"2033\":2,\"2034\":1,\"2035\":1,\"2037\":5,\"2038\":4,\"2039\":3,\"2040\":1,\"2043\":1,\"2053\":1,\"2057\":1,\"2058\":2,\"2059\":2,\"2062\":1,\"2073\":6,\"2074\":4,\"2075\":2,\"2076\":4,\"2081\":2,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2088\":1,\"2089\":3,\"2090\":5,\"2091\":1,\"2092\":1,\"2093\":1,\"2097\":15,\"2098\":1,\"2099\":4,\"2100\":7,\"2101\":1,\"2103\":2,\"2104\":1,\"2105\":3,\"2112\":1,\"2116\":1,\"2117\":2,\"2118\":2,\"2121\":1,\"2131\":1,\"2133\":3,\"2134\":3,\"2135\":6,\"2136\":4,\"2137\":2,\"2138\":2,\"2139\":4,\"2140\":2,\"2141\":2,\"2142\":2,\"2143\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2150\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2154\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2170\":4,\"2171\":1,\"2175\":1,\"2177\":1,\"2180\":2,\"2181\":1,\"2184\":1,\"2185\":1,\"2186\":2,\"2187\":1,\"2188\":1,\"2189\":4,\"2190\":1,\"2192\":2,\"2195\":1,\"2201\":5,\"2202\":4,\"2203\":4,\"2208\":2,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2215\":1,\"2216\":3,\"2217\":5,\"2218\":1,\"2219\":1,\"2220\":1,\"2224\":19,\"2225\":1,\"2226\":4,\"2227\":7,\"2228\":1,\"2230\":2,\"2231\":9,\"2232\":3,\"2235\":1,\"2236\":1,\"2241\":1,\"2243\":3,\"2244\":3,\"2245\":6,\"2246\":4,\"2247\":2,\"2248\":4,\"2249\":2,\"2250\":2,\"2251\":2,\"2252\":2,\"2253\":1,\"2254\":1,\"2256\":5,\"2257\":4,\"2258\":3,\"2259\":1,\"2262\":1,\"2272\":1,\"2276\":1,\"2277\":2,\"2278\":2,\"2281\":1,\"2292\":6,\"2293\":4,\"2294\":2,\"2295\":4,\"2300\":2,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1,\"2307\":1,\"2308\":3,\"2309\":5,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"tokens\",{\"1\":{\"613\":1,\"614\":1,\"618\":2,\"675\":1,\"820\":1,\"821\":1,\"825\":2,\"882\":1,\"1043\":1,\"1044\":1,\"1048\":2,\"1105\":1,\"1220\":1,\"1221\":1,\"1225\":2,\"1282\":1,\"1413\":1,\"1414\":1,\"1418\":2,\"1475\":1,\"1485\":1,\"1486\":1,\"1490\":2,\"1587\":1,\"1612\":1,\"1613\":1,\"1617\":2,\"1678\":1,\"1793\":1,\"1794\":1,\"1798\":2,\"1855\":1,\"1881\":1,\"1882\":1,\"1886\":2,\"1983\":1,\"2008\":1,\"2009\":1,\"2013\":2,\"2074\":1,\"2100\":1,\"2101\":1,\"2105\":2,\"2202\":1,\"2227\":1,\"2228\":1,\"2232\":2,\"2293\":1}}],[\"token\",{\"0\":{\"448\":1,\"516\":1,\"614\":2,\"655\":1,\"676\":1,\"734\":1,\"821\":2,\"862\":1,\"883\":1,\"957\":1,\"1044\":2,\"1085\":1,\"1106\":1,\"1118\":1,\"1221\":2,\"1262\":1,\"1283\":1,\"1311\":1,\"1414\":2,\"1455\":1,\"1476\":1,\"1486\":2,\"1498\":1,\"1613\":2,\"1658\":1,\"1679\":1,\"1707\":1,\"1794\":2,\"1835\":1,\"1856\":1,\"1882\":2,\"1894\":1,\"2009\":2,\"2054\":1,\"2075\":1,\"2101\":2,\"2113\":1,\"2228\":2,\"2273\":1,\"2294\":1},\"1\":{\"448\":2,\"516\":2,\"611\":2,\"613\":1,\"614\":2,\"618\":2,\"655\":2,\"674\":1,\"676\":2,\"678\":1,\"734\":2,\"818\":2,\"820\":1,\"821\":2,\"825\":2,\"862\":2,\"881\":1,\"883\":2,\"885\":1,\"957\":2,\"1041\":2,\"1043\":1,\"1044\":2,\"1048\":2,\"1085\":2,\"1104\":1,\"1106\":2,\"1108\":1,\"1118\":2,\"1218\":2,\"1220\":1,\"1221\":2,\"1225\":2,\"1262\":2,\"1281\":1,\"1283\":2,\"1285\":1,\"1311\":2,\"1411\":2,\"1413\":1,\"1414\":2,\"1418\":2,\"1455\":2,\"1474\":1,\"1476\":2,\"1478\":1,\"1483\":2,\"1485\":1,\"1486\":2,\"1490\":2,\"1498\":2,\"1589\":1,\"1610\":2,\"1612\":1,\"1613\":2,\"1617\":2,\"1658\":2,\"1677\":1,\"1679\":2,\"1681\":1,\"1707\":2,\"1791\":2,\"1793\":1,\"1794\":2,\"1798\":2,\"1835\":2,\"1854\":1,\"1856\":2,\"1858\":1,\"1879\":2,\"1881\":1,\"1882\":2,\"1886\":2,\"1894\":2,\"1985\":1,\"2006\":2,\"2008\":1,\"2009\":2,\"2013\":2,\"2054\":2,\"2073\":1,\"2075\":2,\"2077\":1,\"2098\":2,\"2100\":1,\"2101\":2,\"2105\":2,\"2113\":2,\"2204\":1,\"2225\":2,\"2227\":1,\"2228\":2,\"2232\":2,\"2273\":2,\"2292\":1,\"2294\":2,\"2296\":1}}],[\"toaddressescc\",{\"0\":{\"428\":1,\"579\":1,\"797\":1,\"1020\":1,\"1181\":1,\"1374\":1,\"1564\":1,\"1770\":1,\"1960\":1,\"2179\":1},\"1\":{\"428\":1,\"579\":1,\"797\":1,\"1020\":1,\"1181\":1,\"1374\":1,\"1564\":1,\"1770\":1,\"1960\":1,\"2179\":1}}],[\"toaddresses\",{\"0\":{\"427\":1,\"578\":1,\"796\":1,\"1019\":1,\"1180\":1,\"1373\":1,\"1563\":1,\"1769\":1,\"1959\":1,\"2178\":1},\"1\":{\"427\":1,\"578\":1,\"796\":1,\"1019\":1,\"1180\":1,\"1373\":1,\"1563\":1,\"1769\":1,\"1959\":1,\"2178\":1}}],[\"too\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"tools\",{\"1\":{\"95\":1,\"102\":1,\"207\":1}}],[\"tool\",{\"1\":{\"31\":1,\"126\":2,\"128\":1,\"149\":2,\"151\":1,\"173\":2,\"175\":1,\"205\":1,\"207\":3,\"235\":1,\"237\":2,\"265\":1,\"267\":2,\"299\":1,\"311\":1,\"313\":2,\"349\":1,\"357\":1,\"359\":2,\"690\":1,\"702\":1,\"704\":2,\"897\":1,\"925\":1,\"927\":2}}],[\"todo\",{\"1\":{\"137\":5,\"138\":2,\"160\":3,\"161\":2,\"184\":3,\"185\":2,\"192\":1,\"220\":3,\"221\":2,\"250\":3,\"251\":1,\"280\":3,\"281\":1,\"326\":3,\"327\":1,\"372\":3,\"373\":1,\"717\":3,\"718\":1,\"940\":3,\"941\":1}}],[\"today\",{\"1\":{\"27\":1}}],[\"topic\",{\"0\":{\"81\":1},\"1\":{\"99\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"topics\",{\"1\":{\"10\":1}}],[\"towards\",{\"1\":{\"27\":1}}],[\"together\",{\"1\":{\"10\":1,\"11\":1,\"55\":1,\"58\":1,\"66\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"to\",{\"0\":{\"6\":1,\"28\":1,\"97\":1,\"99\":1},\"1\":{\"0\":7,\"1\":1,\"4\":1,\"5\":1,\"8\":3,\"10\":3,\"11\":2,\"14\":1,\"20\":3,\"21\":3,\"24\":4,\"25\":1,\"27\":7,\"28\":1,\"41\":1,\"49\":7,\"50\":1,\"52\":1,\"53\":1,\"54\":6,\"55\":4,\"57\":1,\"58\":3,\"59\":2,\"60\":1,\"61\":11,\"62\":9,\"63\":11,\"64\":1,\"66\":6,\"67\":1,\"69\":1,\"70\":3,\"71\":3,\"74\":2,\"76\":2,\"77\":2,\"78\":1,\"80\":2,\"81\":6,\"84\":3,\"86\":1,\"88\":2,\"89\":8,\"90\":4,\"91\":2,\"92\":2,\"95\":6,\"97\":1,\"98\":3,\"99\":4,\"100\":3,\"101\":2,\"105\":1,\"106\":3,\"107\":1,\"108\":3,\"109\":1,\"110\":3,\"111\":1,\"112\":3,\"113\":1,\"114\":3,\"115\":1,\"116\":3,\"117\":1,\"118\":3,\"119\":3,\"122\":3,\"123\":1,\"124\":3,\"126\":8,\"127\":1,\"128\":4,\"129\":1,\"134\":5,\"137\":17,\"138\":9,\"139\":3,\"140\":3,\"143\":6,\"144\":3,\"147\":3,\"149\":8,\"150\":1,\"151\":4,\"152\":1,\"157\":5,\"160\":15,\"161\":9,\"162\":3,\"163\":3,\"166\":6,\"167\":2,\"168\":1,\"169\":2,\"170\":1,\"171\":3,\"173\":8,\"174\":1,\"175\":4,\"176\":1,\"181\":5,\"184\":15,\"185\":9,\"186\":3,\"187\":3,\"190\":6,\"191\":2,\"192\":3,\"193\":4,\"194\":3,\"197\":3,\"198\":3,\"201\":3,\"202\":1,\"203\":3,\"205\":8,\"206\":1,\"207\":6,\"212\":1,\"217\":5,\"220\":15,\"221\":9,\"222\":3,\"223\":3,\"226\":10,\"227\":5,\"228\":1,\"229\":2,\"230\":3,\"233\":3,\"235\":6,\"236\":1,\"237\":5,\"242\":1,\"247\":5,\"250\":15,\"251\":9,\"252\":3,\"253\":3,\"256\":10,\"257\":4,\"258\":1,\"259\":2,\"260\":3,\"263\":3,\"265\":6,\"266\":1,\"267\":5,\"272\":1,\"277\":5,\"280\":15,\"281\":9,\"282\":3,\"283\":3,\"286\":10,\"287\":4,\"288\":1,\"289\":2,\"290\":1,\"293\":3,\"294\":2,\"295\":1,\"296\":1,\"298\":2,\"299\":1,\"300\":2,\"301\":3,\"302\":4,\"303\":9,\"304\":2,\"305\":16,\"306\":4,\"309\":3,\"311\":6,\"312\":1,\"313\":5,\"318\":1,\"323\":5,\"326\":15,\"327\":9,\"328\":3,\"329\":3,\"332\":10,\"333\":4,\"334\":1,\"335\":2,\"336\":4,\"339\":3,\"340\":1,\"343\":3,\"344\":2,\"345\":1,\"346\":1,\"348\":2,\"349\":1,\"350\":2,\"351\":3,\"352\":4,\"353\":9,\"354\":2,\"355\":16,\"357\":6,\"358\":1,\"359\":5,\"364\":1,\"369\":5,\"372\":15,\"373\":9,\"374\":3,\"375\":3,\"378\":10,\"379\":4,\"380\":1,\"381\":2,\"383\":4,\"385\":3,\"386\":2,\"387\":1,\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"394\":2,\"395\":2,\"396\":2,\"397\":2,\"398\":2,\"399\":2,\"402\":3,\"405\":3,\"406\":3,\"407\":1,\"408\":1,\"411\":1,\"412\":1,\"413\":3,\"414\":3,\"415\":2,\"418\":3,\"419\":2,\"420\":1,\"422\":2,\"423\":3,\"424\":3,\"425\":3,\"426\":2,\"429\":3,\"431\":2,\"434\":1,\"435\":1,\"438\":1,\"439\":1,\"445\":3,\"446\":5,\"447\":1,\"448\":3,\"451\":2,\"452\":2,\"453\":2,\"456\":3,\"458\":2,\"467\":2,\"468\":2,\"469\":2,\"472\":3,\"473\":3,\"474\":4,\"476\":3,\"477\":2,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"485\":1,\"490\":3,\"492\":1,\"493\":1,\"500\":2,\"501\":2,\"502\":1,\"503\":1,\"504\":2,\"505\":3,\"506\":1,\"507\":1,\"508\":1,\"513\":3,\"514\":5,\"515\":1,\"516\":3,\"519\":2,\"520\":2,\"521\":2,\"524\":3,\"526\":2,\"534\":4,\"536\":3,\"537\":2,\"538\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"545\":2,\"546\":2,\"547\":2,\"548\":2,\"549\":2,\"550\":2,\"553\":3,\"556\":3,\"557\":3,\"558\":1,\"559\":1,\"562\":1,\"563\":1,\"564\":3,\"565\":3,\"566\":2,\"569\":3,\"570\":2,\"571\":1,\"573\":2,\"574\":3,\"575\":3,\"576\":3,\"577\":2,\"580\":3,\"582\":2,\"585\":1,\"586\":1,\"589\":1,\"590\":1,\"597\":2,\"598\":2,\"599\":1,\"600\":1,\"601\":2,\"602\":3,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"610\":4,\"611\":1,\"612\":2,\"614\":1,\"615\":2,\"616\":1,\"617\":3,\"618\":1,\"620\":2,\"621\":2,\"622\":2,\"625\":3,\"626\":3,\"627\":4,\"629\":3,\"630\":2,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"638\":1,\"644\":3,\"646\":1,\"647\":1,\"652\":3,\"653\":5,\"654\":1,\"655\":3,\"658\":2,\"659\":2,\"660\":2,\"663\":3,\"665\":2,\"674\":4,\"675\":3,\"676\":2,\"677\":2,\"681\":1,\"684\":3,\"685\":2,\"686\":1,\"687\":1,\"689\":2,\"690\":1,\"691\":2,\"692\":3,\"693\":4,\"694\":9,\"695\":2,\"696\":16,\"697\":4,\"700\":3,\"702\":6,\"703\":1,\"704\":5,\"709\":1,\"714\":5,\"717\":15,\"718\":9,\"719\":3,\"720\":3,\"723\":10,\"724\":4,\"725\":1,\"726\":2,\"731\":3,\"732\":5,\"733\":1,\"734\":3,\"737\":2,\"738\":2,\"739\":2,\"742\":3,\"744\":2,\"752\":4,\"754\":3,\"755\":2,\"756\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"763\":2,\"764\":2,\"765\":2,\"766\":2,\"767\":2,\"768\":2,\"769\":2,\"772\":3,\"775\":3,\"776\":3,\"777\":1,\"778\":1,\"780\":1,\"781\":1,\"782\":3,\"783\":3,\"784\":2,\"787\":3,\"788\":2,\"789\":1,\"791\":2,\"792\":3,\"793\":3,\"794\":3,\"795\":2,\"798\":3,\"800\":2,\"803\":1,\"806\":1,\"807\":1,\"809\":1,\"811\":1,\"812\":1,\"817\":4,\"818\":1,\"819\":2,\"821\":1,\"822\":2,\"823\":1,\"824\":3,\"825\":1,\"827\":2,\"828\":2,\"829\":2,\"832\":3,\"833\":3,\"834\":4,\"836\":3,\"837\":2,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"845\":1,\"851\":3,\"853\":1,\"854\":1,\"859\":3,\"860\":5,\"861\":1,\"862\":3,\"865\":2,\"866\":2,\"867\":2,\"870\":3,\"872\":2,\"881\":4,\"882\":3,\"883\":2,\"884\":2,\"888\":1,\"891\":3,\"892\":2,\"893\":1,\"894\":1,\"896\":2,\"897\":1,\"898\":2,\"899\":3,\"900\":4,\"901\":9,\"902\":2,\"903\":16,\"904\":4,\"907\":3,\"911\":2,\"912\":2,\"913\":1,\"914\":1,\"915\":2,\"916\":2,\"917\":3,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"925\":6,\"926\":1,\"927\":5,\"928\":1,\"929\":1,\"931\":1,\"932\":1,\"937\":5,\"940\":15,\"941\":9,\"942\":3,\"943\":3,\"946\":10,\"947\":4,\"948\":1,\"949\":2,\"954\":3,\"955\":5,\"956\":1,\"957\":3,\"960\":2,\"961\":2,\"962\":2,\"965\":3,\"967\":2,\"975\":4,\"977\":3,\"978\":2,\"979\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"986\":2,\"987\":2,\"988\":2,\"989\":2,\"990\":2,\"991\":2,\"992\":2,\"995\":3,\"998\":3,\"999\":3,\"1000\":1,\"1001\":1,\"1003\":1,\"1004\":1,\"1005\":3,\"1006\":3,\"1007\":2,\"1010\":3,\"1011\":2,\"1012\":1,\"1014\":2,\"1015\":3,\"1016\":3,\"1017\":3,\"1018\":2,\"1021\":3,\"1023\":2,\"1026\":1,\"1029\":1,\"1030\":1,\"1032\":1,\"1034\":1,\"1035\":1,\"1040\":4,\"1041\":1,\"1042\":2,\"1044\":1,\"1045\":2,\"1046\":1,\"1047\":3,\"1048\":1,\"1050\":2,\"1051\":2,\"1052\":2,\"1055\":3,\"1056\":3,\"1057\":4,\"1059\":3,\"1060\":2,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1068\":1,\"1074\":3,\"1076\":1,\"1077\":1,\"1082\":3,\"1083\":5,\"1084\":1,\"1085\":3,\"1088\":2,\"1089\":2,\"1090\":2,\"1093\":3,\"1095\":2,\"1104\":4,\"1105\":3,\"1106\":2,\"1107\":2,\"1115\":3,\"1116\":5,\"1117\":1,\"1118\":3,\"1121\":2,\"1122\":2,\"1123\":2,\"1126\":3,\"1128\":2,\"1136\":4,\"1138\":3,\"1139\":2,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1147\":2,\"1148\":2,\"1149\":2,\"1150\":2,\"1151\":2,\"1152\":2,\"1153\":2,\"1156\":3,\"1159\":3,\"1160\":3,\"1161\":1,\"1162\":1,\"1164\":1,\"1165\":1,\"1166\":3,\"1167\":3,\"1168\":2,\"1171\":3,\"1172\":2,\"1173\":1,\"1175\":2,\"1176\":3,\"1177\":3,\"1178\":3,\"1179\":2,\"1182\":3,\"1184\":2,\"1187\":1,\"1190\":1,\"1191\":1,\"1193\":1,\"1195\":1,\"1196\":1,\"1203\":2,\"1204\":2,\"1205\":1,\"1206\":1,\"1207\":2,\"1208\":2,\"1209\":3,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1217\":4,\"1218\":1,\"1219\":2,\"1221\":1,\"1222\":2,\"1223\":1,\"1224\":3,\"1225\":1,\"1227\":2,\"1228\":2,\"1229\":2,\"1232\":3,\"1233\":3,\"1234\":4,\"1236\":3,\"1237\":2,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1245\":1,\"1251\":3,\"1253\":1,\"1254\":1,\"1259\":3,\"1260\":5,\"1261\":1,\"1262\":3,\"1265\":2,\"1266\":2,\"1267\":2,\"1270\":3,\"1272\":2,\"1281\":4,\"1282\":3,\"1283\":2,\"1284\":2,\"1291\":2,\"1292\":2,\"1293\":1,\"1294\":1,\"1295\":2,\"1296\":2,\"1297\":3,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1308\":3,\"1309\":5,\"1310\":1,\"1311\":3,\"1314\":2,\"1315\":2,\"1316\":2,\"1319\":3,\"1321\":2,\"1329\":4,\"1331\":3,\"1332\":2,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1340\":2,\"1341\":2,\"1342\":2,\"1343\":2,\"1344\":2,\"1345\":2,\"1346\":2,\"1349\":3,\"1352\":3,\"1353\":3,\"1354\":1,\"1355\":1,\"1357\":1,\"1358\":1,\"1359\":3,\"1360\":3,\"1361\":2,\"1364\":3,\"1365\":2,\"1366\":1,\"1368\":2,\"1369\":3,\"1370\":3,\"1371\":3,\"1372\":2,\"1375\":3,\"1377\":2,\"1380\":1,\"1383\":1,\"1384\":1,\"1386\":1,\"1388\":1,\"1389\":1,\"1396\":2,\"1397\":2,\"1398\":1,\"1399\":1,\"1400\":2,\"1401\":2,\"1402\":3,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1410\":4,\"1411\":1,\"1412\":2,\"1414\":1,\"1415\":2,\"1416\":1,\"1417\":3,\"1418\":1,\"1420\":2,\"1421\":2,\"1422\":2,\"1425\":3,\"1426\":3,\"1427\":4,\"1429\":3,\"1430\":2,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1438\":1,\"1444\":3,\"1446\":1,\"1447\":1,\"1452\":3,\"1453\":5,\"1454\":1,\"1455\":3,\"1458\":2,\"1459\":2,\"1460\":2,\"1463\":3,\"1465\":2,\"1474\":4,\"1475\":3,\"1476\":2,\"1477\":2,\"1482\":4,\"1483\":1,\"1484\":2,\"1486\":1,\"1487\":1,\"1488\":1,\"1490\":1,\"1495\":3,\"1496\":5,\"1497\":1,\"1498\":3,\"1501\":2,\"1502\":2,\"1503\":2,\"1506\":3,\"1508\":2,\"1516\":4,\"1518\":3,\"1519\":2,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1527\":2,\"1528\":2,\"1529\":2,\"1530\":2,\"1531\":2,\"1532\":2,\"1533\":2,\"1534\":2,\"1535\":2,\"1536\":2,\"1539\":3,\"1542\":3,\"1543\":3,\"1544\":1,\"1545\":1,\"1547\":1,\"1548\":1,\"1549\":3,\"1550\":3,\"1551\":2,\"1554\":3,\"1555\":2,\"1556\":1,\"1558\":2,\"1559\":3,\"1560\":3,\"1561\":3,\"1562\":2,\"1565\":3,\"1567\":2,\"1570\":1,\"1573\":1,\"1574\":1,\"1576\":1,\"1579\":3,\"1580\":2,\"1582\":1,\"1583\":1,\"1586\":4,\"1587\":3,\"1588\":2,\"1595\":2,\"1596\":2,\"1597\":1,\"1598\":1,\"1599\":2,\"1600\":2,\"1601\":3,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1609\":4,\"1610\":1,\"1611\":2,\"1613\":1,\"1614\":1,\"1615\":1,\"1616\":3,\"1617\":1,\"1619\":2,\"1620\":2,\"1621\":2,\"1624\":3,\"1625\":3,\"1626\":4,\"1628\":3,\"1629\":2,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1637\":2,\"1638\":2,\"1639\":2,\"1640\":1,\"1646\":3,\"1647\":2,\"1649\":1,\"1650\":1,\"1655\":3,\"1656\":5,\"1657\":1,\"1658\":3,\"1661\":2,\"1662\":2,\"1663\":2,\"1666\":3,\"1668\":2,\"1677\":4,\"1678\":3,\"1679\":2,\"1680\":2,\"1687\":2,\"1688\":2,\"1689\":1,\"1690\":1,\"1691\":2,\"1692\":2,\"1693\":3,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1704\":3,\"1705\":5,\"1706\":1,\"1707\":3,\"1710\":2,\"1711\":2,\"1712\":2,\"1715\":3,\"1717\":2,\"1725\":4,\"1727\":3,\"1728\":2,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1736\":2,\"1737\":2,\"1738\":2,\"1739\":2,\"1740\":2,\"1741\":2,\"1742\":2,\"1745\":3,\"1748\":3,\"1749\":3,\"1750\":1,\"1751\":1,\"1753\":1,\"1754\":1,\"1755\":3,\"1756\":3,\"1757\":2,\"1760\":3,\"1761\":2,\"1762\":1,\"1764\":2,\"1765\":3,\"1766\":3,\"1767\":3,\"1768\":2,\"1771\":3,\"1773\":2,\"1776\":1,\"1779\":1,\"1780\":1,\"1782\":1,\"1784\":1,\"1785\":1,\"1790\":4,\"1791\":1,\"1792\":2,\"1794\":1,\"1795\":2,\"1796\":1,\"1797\":3,\"1798\":1,\"1800\":2,\"1801\":2,\"1802\":2,\"1805\":3,\"1806\":3,\"1807\":4,\"1809\":3,\"1810\":2,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1818\":1,\"1824\":3,\"1826\":1,\"1827\":1,\"1832\":3,\"1833\":5,\"1834\":1,\"1835\":3,\"1838\":2,\"1839\":2,\"1840\":2,\"1843\":3,\"1845\":2,\"1854\":4,\"1855\":3,\"1856\":2,\"1857\":2,\"1864\":2,\"1865\":2,\"1866\":1,\"1867\":1,\"1868\":2,\"1869\":2,\"1870\":3,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1878\":4,\"1879\":1,\"1880\":2,\"1882\":1,\"1883\":1,\"1884\":1,\"1886\":1,\"1891\":3,\"1892\":5,\"1893\":1,\"1894\":3,\"1897\":2,\"1898\":2,\"1899\":2,\"1902\":3,\"1904\":2,\"1912\":4,\"1914\":3,\"1915\":2,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"1923\":2,\"1924\":2,\"1925\":2,\"1926\":2,\"1927\":2,\"1928\":2,\"1929\":2,\"1930\":2,\"1931\":2,\"1932\":2,\"1935\":3,\"1938\":3,\"1939\":3,\"1940\":1,\"1941\":1,\"1943\":1,\"1944\":1,\"1945\":3,\"1946\":3,\"1947\":2,\"1950\":3,\"1951\":2,\"1952\":1,\"1954\":2,\"1955\":3,\"1956\":3,\"1957\":3,\"1958\":2,\"1961\":3,\"1963\":2,\"1966\":1,\"1969\":1,\"1970\":1,\"1972\":1,\"1975\":3,\"1976\":2,\"1978\":1,\"1979\":1,\"1982\":4,\"1983\":3,\"1984\":2,\"1991\":2,\"1992\":2,\"1993\":1,\"1994\":1,\"1995\":2,\"1996\":2,\"1997\":3,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2005\":4,\"2006\":1,\"2007\":2,\"2009\":1,\"2010\":1,\"2011\":1,\"2012\":3,\"2013\":1,\"2015\":2,\"2016\":2,\"2017\":2,\"2020\":3,\"2021\":3,\"2022\":4,\"2024\":3,\"2025\":2,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2033\":2,\"2034\":2,\"2035\":2,\"2036\":1,\"2042\":3,\"2043\":2,\"2045\":1,\"2046\":1,\"2051\":3,\"2052\":5,\"2053\":1,\"2054\":3,\"2057\":2,\"2058\":2,\"2059\":2,\"2062\":3,\"2064\":2,\"2073\":4,\"2074\":3,\"2075\":2,\"2076\":2,\"2083\":2,\"2084\":2,\"2085\":1,\"2086\":1,\"2087\":2,\"2088\":2,\"2089\":3,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2097\":4,\"2098\":1,\"2099\":2,\"2101\":1,\"2102\":1,\"2103\":1,\"2105\":1,\"2110\":3,\"2111\":5,\"2112\":1,\"2113\":3,\"2116\":2,\"2117\":2,\"2118\":2,\"2121\":3,\"2123\":2,\"2131\":4,\"2133\":3,\"2134\":2,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2142\":2,\"2143\":2,\"2144\":2,\"2145\":2,\"2146\":2,\"2147\":2,\"2148\":2,\"2149\":2,\"2150\":2,\"2151\":2,\"2154\":3,\"2157\":3,\"2158\":3,\"2159\":1,\"2160\":1,\"2162\":1,\"2163\":1,\"2164\":3,\"2165\":3,\"2166\":2,\"2169\":3,\"2170\":2,\"2171\":1,\"2173\":2,\"2174\":3,\"2175\":3,\"2176\":3,\"2177\":2,\"2180\":3,\"2182\":2,\"2185\":1,\"2188\":1,\"2189\":1,\"2191\":1,\"2194\":3,\"2195\":2,\"2197\":1,\"2198\":1,\"2201\":4,\"2202\":3,\"2203\":2,\"2210\":2,\"2211\":2,\"2212\":1,\"2213\":1,\"2214\":2,\"2215\":2,\"2216\":3,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2224\":4,\"2225\":1,\"2226\":2,\"2228\":1,\"2229\":1,\"2230\":1,\"2231\":3,\"2232\":1,\"2234\":2,\"2235\":2,\"2236\":2,\"2239\":3,\"2240\":3,\"2241\":4,\"2243\":3,\"2244\":2,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1,\"2252\":2,\"2253\":2,\"2254\":2,\"2255\":1,\"2261\":3,\"2262\":2,\"2264\":1,\"2265\":1,\"2270\":3,\"2271\":5,\"2272\":1,\"2273\":3,\"2276\":2,\"2277\":2,\"2278\":2,\"2281\":3,\"2283\":2,\"2292\":4,\"2293\":3,\"2294\":2,\"2295\":2,\"2302\":2,\"2303\":2,\"2304\":1,\"2305\":1,\"2306\":2,\"2307\":2,\"2308\":3,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"szktxyq2rh5se+j\",{\"1\":{\"678\":1,\"885\":1,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"sleep\",{\"0\":{\"411\":1,\"434\":1,\"562\":1,\"585\":1,\"780\":1,\"806\":1,\"1003\":1,\"1029\":1,\"1164\":1,\"1190\":1,\"1357\":1,\"1383\":1,\"1547\":1,\"1573\":1,\"1753\":1,\"1779\":1,\"1943\":1,\"1969\":1,\"2162\":1,\"2188\":1},\"1\":{\"411\":1,\"434\":1,\"562\":1,\"585\":1,\"780\":1,\"806\":1,\"1003\":1,\"1029\":1,\"1164\":1,\"1190\":1,\"1357\":1,\"1383\":1,\"1547\":1,\"1573\":1,\"1753\":1,\"1779\":1,\"1943\":1,\"1969\":1,\"2162\":1,\"2188\":1}}],[\"smime\",{\"0\":{\"425\":1,\"426\":2,\"576\":1,\"577\":2,\"794\":1,\"795\":2,\"1017\":1,\"1018\":2,\"1178\":1,\"1179\":2,\"1371\":1,\"1372\":2,\"1561\":1,\"1562\":2,\"1767\":1,\"1768\":2,\"1957\":1,\"1958\":2,\"2176\":1,\"2177\":2},\"1\":{\"425\":2,\"426\":3,\"576\":2,\"577\":3,\"794\":2,\"795\":3,\"1017\":2,\"1018\":3,\"1178\":2,\"1179\":3,\"1371\":2,\"1372\":3,\"1561\":2,\"1562\":3,\"1767\":2,\"1768\":3,\"1957\":2,\"1958\":3,\"2176\":2,\"2177\":3}}],[\"smtps\",{\"1\":{\"431\":1,\"582\":1,\"800\":1,\"1023\":1,\"1184\":1,\"1377\":1,\"1567\":1,\"1773\":1,\"1963\":1,\"2182\":1}}],[\"smtp\",{\"1\":{\"413\":3,\"414\":3,\"415\":1,\"417\":2,\"420\":3,\"421\":1,\"423\":1,\"424\":1,\"429\":3,\"430\":3,\"431\":1,\"564\":3,\"565\":3,\"566\":1,\"568\":2,\"571\":3,\"572\":1,\"574\":1,\"575\":1,\"580\":3,\"581\":3,\"582\":1,\"782\":3,\"783\":3,\"784\":1,\"786\":2,\"789\":3,\"790\":1,\"792\":1,\"793\":1,\"798\":3,\"799\":3,\"800\":1,\"1005\":3,\"1006\":3,\"1007\":1,\"1009\":2,\"1012\":3,\"1013\":1,\"1015\":1,\"1016\":1,\"1021\":3,\"1022\":3,\"1023\":1,\"1166\":3,\"1167\":3,\"1168\":1,\"1170\":2,\"1173\":3,\"1174\":1,\"1176\":1,\"1177\":1,\"1182\":3,\"1183\":3,\"1184\":1,\"1359\":3,\"1360\":3,\"1361\":1,\"1363\":2,\"1366\":3,\"1367\":1,\"1369\":1,\"1370\":1,\"1375\":3,\"1376\":3,\"1377\":1,\"1549\":3,\"1550\":3,\"1551\":1,\"1553\":2,\"1556\":3,\"1557\":1,\"1559\":1,\"1560\":1,\"1565\":3,\"1566\":3,\"1567\":1,\"1755\":3,\"1756\":3,\"1757\":1,\"1759\":2,\"1762\":3,\"1763\":1,\"1765\":1,\"1766\":1,\"1771\":3,\"1772\":3,\"1773\":1,\"1945\":3,\"1946\":3,\"1947\":1,\"1949\":2,\"1952\":3,\"1953\":1,\"1955\":1,\"1956\":1,\"1961\":3,\"1962\":3,\"1963\":1,\"2164\":3,\"2165\":3,\"2166\":1,\"2168\":2,\"2171\":3,\"2172\":1,\"2174\":1,\"2175\":1,\"2180\":3,\"2181\":3,\"2182\":1}}],[\"smooth\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"small\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"skip\",{\"1\":{\"299\":2,\"349\":2,\"690\":2,\"897\":2}}],[\"skills\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"sample\",{\"1\":{\"122\":1,\"147\":1,\"197\":1,\"201\":1,\"233\":1,\"263\":1,\"309\":1,\"339\":1,\"700\":1,\"907\":1}}],[\"same\",{\"1\":{\"66\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"sslverifyclient\",{\"1\":{\"606\":1,\"921\":1,\"1213\":1,\"1301\":1,\"1406\":1,\"1605\":1,\"1697\":1,\"1874\":1,\"2001\":1,\"2093\":1,\"2220\":1,\"2312\":1}}],[\"sslcertificatekeyfile\",{\"1\":{\"508\":1,\"605\":1,\"920\":1,\"1212\":1,\"1300\":1,\"1405\":1,\"1604\":1,\"1696\":1,\"1873\":1,\"2000\":1,\"2092\":1,\"2219\":1,\"2311\":1}}],[\"sslcertificatefile\",{\"1\":{\"507\":1,\"604\":1,\"919\":1,\"1211\":1,\"1299\":1,\"1404\":1,\"1603\":1,\"1695\":1,\"1872\":1,\"1999\":1,\"2091\":1,\"2218\":1,\"2310\":1}}],[\"sslcertificatechainfile\",{\"1\":{\"506\":1,\"603\":1,\"918\":1,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"sslcadnrequestfile\",{\"1\":{\"505\":1,\"602\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1}}],[\"sslcacertificatefile\",{\"1\":{\"504\":1,\"601\":1,\"916\":1,\"1208\":1,\"1296\":1,\"1401\":1,\"1600\":1,\"1692\":1,\"1869\":1,\"1996\":1,\"2088\":1,\"2215\":1,\"2307\":1}}],[\"ssl\",{\"0\":{\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1},\"1\":{\"76\":1,\"136\":4,\"137\":7,\"159\":4,\"160\":7,\"183\":4,\"184\":7,\"219\":4,\"220\":7,\"249\":4,\"250\":7,\"279\":4,\"280\":7,\"325\":4,\"326\":7,\"371\":4,\"372\":7,\"504\":1,\"505\":2,\"506\":2,\"507\":1,\"508\":1,\"601\":1,\"602\":2,\"603\":2,\"604\":1,\"605\":1,\"606\":1,\"674\":1,\"716\":4,\"717\":7,\"881\":1,\"916\":1,\"917\":2,\"918\":2,\"919\":1,\"920\":1,\"921\":1,\"939\":4,\"940\":7,\"1104\":1,\"1208\":1,\"1209\":2,\"1210\":2,\"1211\":1,\"1212\":1,\"1213\":1,\"1281\":1,\"1296\":1,\"1297\":2,\"1298\":2,\"1299\":1,\"1300\":1,\"1301\":1,\"1401\":1,\"1402\":2,\"1403\":2,\"1404\":1,\"1405\":1,\"1406\":1,\"1474\":1,\"1586\":1,\"1600\":1,\"1601\":2,\"1602\":2,\"1603\":1,\"1604\":1,\"1605\":1,\"1677\":1,\"1692\":1,\"1693\":2,\"1694\":2,\"1695\":1,\"1696\":1,\"1697\":1,\"1854\":1,\"1869\":1,\"1870\":2,\"1871\":2,\"1872\":1,\"1873\":1,\"1874\":1,\"1982\":1,\"1996\":1,\"1997\":2,\"1998\":2,\"1999\":1,\"2000\":1,\"2001\":1,\"2073\":1,\"2088\":1,\"2089\":2,\"2090\":2,\"2091\":1,\"2092\":1,\"2093\":1,\"2201\":1,\"2215\":1,\"2216\":2,\"2217\":2,\"2218\":1,\"2219\":1,\"2220\":1,\"2292\":1,\"2307\":1,\"2308\":2,\"2309\":2,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"square\",{\"1\":{\"67\":1}}],[\"sni\",{\"1\":{\"64\":1}}],[\"snomed\",{\"1\":{\"58\":1}}],[\"switches\",{\"1\":{\"61\":1}}],[\"src\",{\"1\":{\"37\":1}}],[\"space\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1445\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1581\":1,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1825\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1977\":1,\"2044\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2196\":1,\"2263\":1}}],[\"specifying\",{\"1\":{\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"specify\",{\"1\":{\"192\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"505\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"602\":1,\"612\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"675\":1,\"676\":1,\"677\":3,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"819\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"882\":1,\"883\":1,\"884\":3,\"917\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"1042\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1105\":1,\"1106\":1,\"1107\":3,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1209\":1,\"1219\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1282\":1,\"1283\":1,\"1284\":3,\"1297\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1402\":1,\"1412\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1475\":1,\"1476\":1,\"1477\":3,\"1484\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1587\":1,\"1588\":3,\"1601\":1,\"1611\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1678\":1,\"1679\":1,\"1680\":3,\"1693\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1792\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1855\":1,\"1856\":1,\"1857\":3,\"1870\":1,\"1880\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1983\":1,\"1984\":3,\"1997\":1,\"2007\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2074\":1,\"2075\":1,\"2076\":3,\"2089\":1,\"2099\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2202\":1,\"2203\":3,\"2216\":1,\"2226\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2293\":1,\"2294\":1,\"2295\":3,\"2308\":1}}],[\"specifies\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"specified\",{\"1\":{\"59\":2,\"437\":1,\"445\":1,\"446\":1,\"448\":1,\"449\":1,\"450\":1,\"491\":1,\"506\":1,\"513\":1,\"514\":1,\"516\":1,\"517\":1,\"518\":1,\"588\":1,\"603\":1,\"610\":3,\"611\":1,\"612\":1,\"613\":2,\"614\":1,\"616\":1,\"617\":2,\"645\":1,\"652\":1,\"653\":1,\"655\":1,\"656\":1,\"657\":1,\"731\":1,\"732\":1,\"734\":1,\"735\":1,\"736\":1,\"810\":1,\"817\":3,\"818\":1,\"819\":1,\"820\":2,\"821\":1,\"823\":1,\"824\":2,\"852\":1,\"859\":1,\"860\":1,\"862\":1,\"863\":1,\"864\":1,\"918\":1,\"954\":1,\"955\":1,\"957\":1,\"958\":1,\"959\":1,\"1033\":1,\"1040\":3,\"1041\":1,\"1042\":1,\"1043\":2,\"1044\":1,\"1046\":1,\"1047\":2,\"1075\":1,\"1082\":1,\"1083\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1115\":1,\"1116\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1194\":1,\"1210\":1,\"1217\":3,\"1218\":1,\"1219\":1,\"1220\":2,\"1221\":1,\"1223\":1,\"1224\":2,\"1252\":1,\"1259\":1,\"1260\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1298\":1,\"1308\":1,\"1309\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1387\":1,\"1403\":1,\"1410\":3,\"1411\":1,\"1412\":1,\"1413\":2,\"1414\":1,\"1416\":1,\"1417\":2,\"1445\":1,\"1452\":1,\"1453\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1482\":3,\"1483\":1,\"1484\":1,\"1485\":2,\"1486\":1,\"1488\":1,\"1495\":1,\"1496\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1581\":1,\"1602\":1,\"1609\":3,\"1610\":1,\"1611\":1,\"1612\":2,\"1613\":1,\"1615\":1,\"1616\":2,\"1648\":1,\"1655\":1,\"1656\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1694\":1,\"1704\":1,\"1705\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1783\":1,\"1790\":3,\"1791\":1,\"1792\":1,\"1793\":2,\"1794\":1,\"1796\":1,\"1797\":2,\"1825\":1,\"1832\":1,\"1833\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1871\":1,\"1878\":3,\"1879\":1,\"1880\":1,\"1881\":2,\"1882\":1,\"1884\":1,\"1891\":1,\"1892\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1977\":1,\"1998\":1,\"2005\":3,\"2006\":1,\"2007\":1,\"2008\":2,\"2009\":1,\"2011\":1,\"2012\":2,\"2044\":1,\"2051\":1,\"2052\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2090\":1,\"2097\":3,\"2098\":1,\"2099\":1,\"2100\":2,\"2101\":1,\"2103\":1,\"2110\":1,\"2111\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2196\":1,\"2217\":1,\"2224\":3,\"2225\":1,\"2226\":1,\"2227\":2,\"2228\":1,\"2230\":1,\"2231\":2,\"2263\":1,\"2270\":1,\"2271\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2309\":1}}],[\"specific\",{\"1\":{\"81\":2,\"84\":1,\"89\":1,\"129\":1,\"152\":1,\"176\":1,\"192\":1,\"212\":1,\"237\":1,\"242\":1,\"267\":1,\"272\":1,\"293\":1,\"313\":1,\"318\":1,\"343\":1,\"359\":1,\"364\":1,\"610\":1,\"684\":1,\"704\":1,\"709\":1,\"817\":1,\"891\":1,\"927\":1,\"932\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"specifications\",{\"1\":{\"10\":1}}],[\"speziellen\",{\"1\":{\"30\":1}}],[\"sprechstunde\",{\"0\":{\"103\":1},\"1\":{\"29\":2,\"103\":3}}],[\"suggest\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"suggestions\",{\"1\":{\"303\":1,\"305\":2,\"353\":1,\"355\":2,\"694\":1,\"696\":2,\"901\":1,\"903\":2}}],[\"suggestion\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"sudo\",{\"1\":{\"132\":8,\"137\":3,\"138\":3,\"155\":8,\"160\":3,\"161\":3,\"168\":1,\"169\":1,\"179\":8,\"184\":3,\"185\":3,\"192\":1,\"193\":1,\"215\":8,\"220\":3,\"221\":3,\"228\":1,\"229\":1,\"245\":8,\"250\":3,\"251\":3,\"258\":1,\"259\":1,\"275\":8,\"280\":3,\"281\":3,\"288\":1,\"289\":1,\"321\":8,\"326\":3,\"327\":3,\"334\":1,\"335\":1,\"367\":8,\"372\":3,\"373\":3,\"380\":1,\"381\":1,\"712\":8,\"717\":3,\"718\":3,\"725\":1,\"726\":1,\"931\":4,\"935\":8,\"940\":3,\"941\":3,\"948\":1,\"949\":1}}],[\"suing\",{\"1\":{\"101\":1}}],[\"success\",{\"1\":{\"304\":1,\"305\":1,\"354\":1,\"355\":1,\"695\":1,\"696\":1,\"902\":1,\"903\":1}}],[\"successful\",{\"1\":{\"88\":1,\"90\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"such\",{\"1\":{\"21\":1,\"54\":1,\"58\":1,\"59\":2,\"62\":2,\"80\":2,\"81\":4,\"88\":1}}],[\"sustainable\",{\"1\":{\"81\":1}}],[\"sufficient\",{\"1\":{\"62\":1,\"89\":1}}],[\"subset\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"subscription\",{\"0\":{\"407\":1,\"410\":1,\"411\":1,\"412\":1,\"558\":1,\"561\":1,\"562\":1,\"563\":1,\"777\":1,\"779\":1,\"780\":1,\"781\":1,\"1000\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1161\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1354\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1544\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1750\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1940\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"2159\":1,\"2161\":1,\"2162\":1,\"2163\":1},\"1\":{\"54\":1,\"61\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"407\":2,\"410\":1,\"411\":1,\"412\":2,\"558\":2,\"561\":1,\"562\":1,\"563\":2,\"718\":1,\"777\":2,\"779\":1,\"780\":1,\"781\":2,\"941\":1,\"1000\":2,\"1002\":1,\"1003\":1,\"1004\":2,\"1161\":2,\"1163\":1,\"1164\":1,\"1165\":2,\"1354\":2,\"1356\":1,\"1357\":1,\"1358\":2,\"1544\":2,\"1546\":1,\"1547\":1,\"1548\":2,\"1750\":2,\"1752\":1,\"1753\":1,\"1754\":2,\"1940\":2,\"1942\":1,\"1943\":1,\"1944\":2,\"2159\":2,\"2161\":1,\"2162\":1,\"2163\":2}}],[\"sub\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"810\":1,\"852\":1,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1}}],[\"subject\",{\"1\":{\"76\":1,\"613\":2,\"820\":2,\"1043\":2,\"1220\":2,\"1413\":2,\"1485\":2,\"1612\":2,\"1793\":2,\"1881\":2,\"2008\":2,\"2100\":2,\"2227\":2}}],[\"subprocess\",{\"1\":{\"69\":1,\"70\":1,\"71\":1}}],[\"subprocesses\",{\"1\":{\"68\":1}}],[\"submitting\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"submit\",{\"1\":{\"62\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"sure\",{\"1\":{\"49\":1,\"297\":1,\"347\":1,\"688\":1,\"895\":1,\"931\":1}}],[\"summary\",{\"1\":{\"20\":1}}],[\"supports\",{\"1\":{\"59\":1,\"674\":1,\"881\":1,\"1104\":1,\"1281\":1,\"1474\":1,\"1586\":1,\"1677\":1,\"1854\":1,\"1982\":1,\"2073\":1,\"2201\":1,\"2292\":1}}],[\"supported\",{\"1\":{\"10\":1,\"74\":1,\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"645\":1,\"674\":1,\"723\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"852\":1,\"881\":1,\"946\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1075\":1,\"1104\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1252\":1,\"1281\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1445\":1,\"1474\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1580\":1,\"1581\":1,\"1586\":1,\"1647\":1,\"1648\":1,\"1677\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1825\":1,\"1854\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1976\":1,\"1977\":1,\"1982\":1,\"2043\":1,\"2044\":1,\"2073\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2195\":1,\"2196\":1,\"2201\":1,\"2262\":1,\"2263\":1,\"2292\":1}}],[\"support\",{\"0\":{\"8\":1},\"1\":{\"0\":2,\"21\":1,\"27\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"139\":1,\"162\":1,\"171\":1,\"186\":1,\"193\":1,\"203\":1,\"222\":1,\"252\":1,\"282\":1,\"290\":1,\"328\":1,\"340\":1,\"374\":1,\"681\":1,\"719\":1,\"888\":1,\"942\":1,\"1489\":1,\"1885\":1,\"2104\":1}}],[\"signing\",{\"1\":{\"504\":1,\"505\":1,\"601\":1,\"602\":1,\"916\":1,\"917\":1,\"1208\":1,\"1209\":1,\"1296\":1,\"1297\":1,\"1401\":1,\"1402\":1,\"1600\":1,\"1601\":1,\"1692\":1,\"1693\":1,\"1869\":1,\"1870\":1,\"1996\":1,\"1997\":1,\"2088\":1,\"2089\":1,\"2215\":1,\"2216\":1,\"2307\":1,\"2308\":1}}],[\"significant\",{\"1\":{\"89\":1,\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"sign\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"signed\",{\"1\":{\"132\":1,\"137\":2,\"155\":1,\"160\":2,\"179\":1,\"184\":2,\"215\":1,\"220\":2,\"245\":1,\"250\":2,\"275\":1,\"280\":2,\"321\":1,\"326\":2,\"367\":1,\"372\":2,\"425\":1,\"506\":1,\"576\":1,\"603\":1,\"712\":1,\"717\":2,\"794\":1,\"918\":1,\"935\":1,\"940\":2,\"1017\":1,\"1178\":1,\"1210\":1,\"1298\":1,\"1371\":1,\"1403\":1,\"1561\":1,\"1602\":1,\"1694\":1,\"1767\":1,\"1871\":1,\"1957\":1,\"1998\":1,\"2090\":1,\"2176\":1,\"2217\":1,\"2309\":1}}],[\"single\",{\"1\":{\"137\":1,\"610\":2,\"611\":1,\"643\":1,\"817\":2,\"818\":1,\"1040\":2,\"1041\":1,\"1217\":2,\"1218\":1,\"1410\":2,\"1411\":1,\"1482\":2,\"1483\":1,\"1609\":2,\"1610\":1,\"1790\":2,\"1791\":1,\"1878\":2,\"1879\":1,\"2005\":2,\"2006\":1,\"2097\":2,\"2098\":1,\"2224\":2,\"2225\":1}}],[\"since\",{\"1\":{\"91\":1,\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"sind\",{\"1\":{\"32\":1}}],[\"silent\",{\"1\":{\"66\":1}}],[\"sizes\",{\"1\":{\"89\":1}}],[\"size\",{\"1\":{\"63\":1,\"89\":1,\"290\":1,\"340\":1,\"488\":1,\"642\":1,\"681\":1,\"801\":1,\"802\":2,\"803\":1,\"849\":1,\"888\":1,\"1024\":1,\"1025\":2,\"1026\":1,\"1072\":1,\"1185\":1,\"1186\":2,\"1187\":1,\"1249\":1,\"1378\":1,\"1379\":2,\"1380\":1,\"1442\":1,\"1568\":1,\"1569\":2,\"1570\":1,\"1644\":1,\"1774\":1,\"1775\":2,\"1776\":1,\"1822\":1,\"1964\":1,\"1965\":2,\"1966\":1,\"2040\":1,\"2183\":1,\"2184\":2,\"2185\":1,\"2259\":1}}],[\"side\",{\"1\":{\"61\":3}}],[\"simply\",{\"1\":{\"137\":1}}],[\"simplify\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"126\":1,\"149\":1,\"171\":1,\"173\":1,\"203\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"simplifier\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"simplifies\",{\"1\":{\"60\":1}}],[\"simplified\",{\"1\":{\"52\":1}}],[\"simultaneously\",{\"1\":{\"54\":1}}],[\"simon\",{\"1\":{\"18\":2}}],[\"sicherzustellen\",{\"1\":{\"31\":1}}],[\"sich\",{\"1\":{\"29\":1,\"31\":2,\"37\":1}}],[\"sie\",{\"1\":{\"29\":1,\"31\":1,\"37\":2,\"103\":1}}],[\"sites\",{\"1\":{\"0\":1,\"23\":1,\"52\":1,\"62\":1,\"88\":1}}],[\"site\",{\"1\":{\"0\":2,\"23\":2,\"28\":1,\"90\":2,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"synthetic\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"syntax\",{\"1\":{\"58\":1}}],[\"syntactically\",{\"1\":{\"0\":1,\"62\":1}}],[\"synchronized\",{\"1\":{\"74\":1}}],[\"systematically\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"systemctl\",{\"1\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"system\",{\"1\":{\"31\":1,\"58\":2,\"59\":1,\"63\":1,\"99\":1,\"137\":2,\"138\":2,\"160\":2,\"161\":2,\"184\":2,\"185\":2,\"220\":2,\"221\":2,\"250\":2,\"251\":2,\"280\":2,\"281\":2,\"297\":1,\"326\":2,\"327\":2,\"347\":1,\"372\":2,\"373\":2,\"617\":1,\"688\":1,\"717\":2,\"718\":2,\"824\":1,\"895\":1,\"940\":2,\"941\":2,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"systeme\",{\"1\":{\"30\":1}}],[\"systems\",{\"1\":{\"14\":1,\"54\":1,\"58\":3,\"59\":1,\"62\":1,\"73\":1,\"89\":1,\"95\":1,\"97\":1,\"100\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"scripts\",{\"1\":{\"290\":1,\"340\":1,\"681\":1,\"888\":1}}],[\"scalar\",{\"1\":{\"610\":2,\"643\":1,\"817\":2,\"1040\":2,\"1217\":2,\"1410\":2,\"1482\":2,\"1609\":2,\"1790\":2,\"1878\":2,\"2005\":2,\"2097\":2,\"2224\":2}}],[\"scalars\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1445\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1581\":1,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1825\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1977\":1,\"2044\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2196\":1,\"2263\":1}}],[\"scalable\",{\"1\":{\"10\":1}}],[\"scales\",{\"1\":{\"62\":1}}],[\"scheme\",{\"1\":{\"55\":1,\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"schema\",{\"1\":{\"55\":3}}],[\"schweizer\",{\"1\":{\"18\":1,\"39\":3}}],[\"scenarios\",{\"1\":{\"20\":1}}],[\"scientific\",{\"1\":{\"14\":1}}],[\"science\",{\"1\":{\"13\":1}}],[\"sciences\",{\"0\":{\"13\":1},\"1\":{\"13\":1}}],[\"sort\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"software\",{\"1\":{\"80\":1,\"82\":1,\"97\":2}}],[\"socket\",{\"1\":{\"73\":1}}],[\"social\",{\"1\":{\"58\":1}}],[\"sources\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"source\",{\"1\":{\"73\":1,\"80\":1,\"81\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"486\":1,\"639\":1,\"714\":1,\"846\":1,\"937\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"some\",{\"1\":{\"57\":1,\"61\":1,\"64\":1,\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"226\":1,\"252\":2,\"256\":1,\"282\":2,\"286\":1,\"300\":1,\"301\":1,\"328\":2,\"332\":1,\"350\":1,\"351\":1,\"374\":2,\"378\":1,\"691\":1,\"692\":1,\"719\":2,\"723\":1,\"898\":1,\"899\":1,\"942\":2,\"946\":1}}],[\"something\",{\"1\":{\"53\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"303\":1,\"313\":1,\"329\":1,\"353\":1,\"359\":1,\"375\":1,\"694\":1,\"704\":1,\"720\":1,\"901\":1,\"927\":1,\"943\":1}}],[\"solved\",{\"1\":{\"62\":1}}],[\"sollten\",{\"1\":{\"30\":1}}],[\"solution\",{\"1\":{\"21\":1}}],[\"solutions\",{\"1\":{\"11\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"sowie\",{\"1\":{\"29\":1}}],[\"so\",{\"1\":{\"10\":1,\"55\":1,\"89\":1,\"139\":1,\"143\":1,\"162\":1,\"166\":1,\"186\":1,\"190\":1,\"222\":1,\"252\":1,\"282\":1,\"297\":1,\"328\":1,\"347\":1,\"374\":1,\"610\":1,\"688\":1,\"719\":1,\"817\":1,\"895\":1,\"942\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"soon\",{\"0\":{\"2\":1,\"51\":1},\"1\":{\"4\":1}}],[\"s\",{\"1\":{\"5\":1,\"8\":1,\"13\":1,\"20\":1,\"39\":5,\"54\":1,\"81\":1,\"99\":1,\"102\":1,\"137\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"294\":1,\"301\":4,\"303\":3,\"304\":1,\"327\":1,\"344\":1,\"351\":4,\"353\":3,\"354\":1,\"373\":1,\"425\":2,\"426\":1,\"432\":1,\"576\":2,\"577\":1,\"583\":1,\"617\":1,\"685\":1,\"692\":4,\"694\":3,\"695\":1,\"718\":1,\"794\":2,\"795\":1,\"804\":1,\"824\":1,\"892\":1,\"899\":4,\"901\":3,\"902\":1,\"941\":1,\"1017\":2,\"1018\":1,\"1027\":1,\"1047\":1,\"1178\":2,\"1179\":1,\"1188\":1,\"1224\":1,\"1371\":2,\"1372\":1,\"1381\":1,\"1417\":1,\"1561\":2,\"1562\":1,\"1571\":1,\"1616\":1,\"1767\":2,\"1768\":1,\"1777\":1,\"1797\":1,\"1957\":2,\"1958\":1,\"1967\":1,\"2012\":1,\"2176\":2,\"2177\":1,\"2186\":1,\"2231\":1}}],[\"ship\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"shutdown\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"shut\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"sha\",{\"1\":{\"137\":2,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":2,\"612\":1,\"641\":1,\"717\":1,\"817\":2,\"819\":1,\"848\":1,\"940\":1,\"1040\":2,\"1042\":1,\"1071\":1,\"1217\":2,\"1219\":1,\"1248\":1,\"1410\":2,\"1412\":1,\"1441\":1,\"1482\":2,\"1484\":1,\"1609\":2,\"1611\":1,\"1643\":1,\"1790\":2,\"1792\":1,\"1821\":1,\"1878\":2,\"1880\":1,\"2005\":2,\"2007\":1,\"2039\":1,\"2097\":2,\"2099\":1,\"2224\":2,\"2226\":1,\"2258\":1}}],[\"sharpen\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"shared\",{\"1\":{\"20\":1,\"23\":1,\"58\":1}}],[\"share\",{\"0\":{\"8\":1},\"1\":{\"8\":1,\"62\":1,\"91\":1,\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"290\":1,\"305\":3,\"321\":2,\"340\":1,\"355\":3,\"367\":2,\"681\":1,\"696\":3,\"712\":2,\"888\":1,\"903\":3,\"935\":2}}],[\"sharing\",{\"0\":{\"0\":1,\"10\":1,\"23\":1,\"37\":1},\"1\":{\"0\":3,\"1\":1,\"12\":1,\"20\":1,\"21\":2,\"23\":2,\"25\":1,\"27\":2,\"29\":3,\"30\":1,\"32\":3,\"35\":1,\"37\":1,\"39\":5,\"41\":1,\"42\":2,\"52\":1,\"61\":1,\"62\":2,\"63\":1,\"73\":1,\"80\":1,\"81\":2,\"82\":2,\"92\":1,\"102\":1,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"170\":2,\"202\":2,\"290\":2,\"291\":1,\"302\":1,\"303\":2,\"305\":1,\"340\":2,\"341\":1,\"352\":1,\"353\":2,\"355\":1,\"681\":2,\"682\":1,\"693\":1,\"694\":2,\"696\":1,\"707\":2,\"888\":2,\"889\":1,\"900\":1,\"901\":2,\"903\":1,\"929\":1,\"931\":4}}],[\"shortest\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"236\":1,\"250\":1,\"266\":1,\"280\":1,\"312\":1,\"326\":1,\"358\":1,\"372\":1,\"409\":1,\"487\":1,\"560\":1,\"640\":1,\"703\":1,\"717\":1,\"847\":1,\"926\":1,\"940\":1,\"1070\":1,\"1247\":1,\"1440\":1,\"1642\":1,\"1820\":1,\"2038\":1,\"2257\":1}}],[\"shown\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1609\":1,\"1790\":1,\"2005\":1,\"2224\":1}}],[\"show\",{\"1\":{\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"237\":1,\"242\":1,\"267\":1,\"272\":1,\"301\":2,\"313\":1,\"318\":1,\"351\":2,\"359\":1,\"364\":1,\"692\":2,\"704\":1,\"709\":1,\"899\":2,\"927\":1,\"932\":1}}],[\"shows\",{\"1\":{\"52\":1,\"68\":1,\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"should\",{\"1\":{\"27\":1,\"70\":1,\"95\":1,\"134\":1,\"138\":1,\"139\":1,\"157\":1,\"161\":1,\"162\":1,\"169\":2,\"181\":1,\"185\":1,\"186\":1,\"193\":2,\"217\":1,\"221\":1,\"222\":1,\"229\":2,\"247\":1,\"251\":1,\"252\":1,\"259\":2,\"277\":1,\"281\":1,\"282\":1,\"289\":2,\"301\":1,\"323\":1,\"327\":1,\"328\":1,\"335\":2,\"351\":1,\"369\":1,\"373\":1,\"374\":1,\"381\":2,\"394\":1,\"395\":1,\"396\":1,\"432\":1,\"436\":1,\"545\":1,\"546\":1,\"547\":1,\"583\":1,\"587\":1,\"610\":1,\"643\":1,\"692\":1,\"714\":1,\"718\":1,\"719\":1,\"726\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"804\":1,\"808\":1,\"817\":1,\"899\":1,\"937\":1,\"941\":1,\"942\":1,\"949\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1027\":1,\"1031\":1,\"1040\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1188\":1,\"1192\":1,\"1217\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1381\":1,\"1385\":1,\"1410\":1,\"1482\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1571\":1,\"1575\":1,\"1609\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1777\":1,\"1781\":1,\"1790\":1,\"1878\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1967\":1,\"1971\":1,\"2005\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2097\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2186\":1,\"2190\":1,\"2224\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"shti230921\",{\"1\":{\"39\":1}}],[\"shti230113\",{\"1\":{\"39\":1}}],[\"shti230066\",{\"1\":{\"1\":1,\"39\":1}}],[\"shti220802\",{\"1\":{\"39\":1}}],[\"shti220554\",{\"1\":{\"39\":1}}],[\"shti210548\",{\"1\":{\"39\":1}}],[\"shti210062\",{\"1\":{\"39\":1}}],[\"shti210061\",{\"1\":{\"39\":1}}],[\"shti210060\",{\"1\":{\"39\":1}}],[\"self\",{\"1\":{\"506\":1,\"603\":1,\"918\":1,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"selected\",{\"1\":{\"70\":2}}],[\"select\",{\"1\":{\"70\":1,\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"293\":2,\"343\":2,\"684\":2,\"891\":2}}],[\"separated\",{\"1\":{\"422\":1,\"427\":1,\"428\":1,\"432\":1,\"436\":1,\"437\":1,\"491\":1,\"573\":1,\"578\":1,\"579\":1,\"583\":1,\"587\":1,\"588\":1,\"645\":1,\"791\":1,\"796\":1,\"797\":1,\"804\":1,\"808\":1,\"810\":1,\"852\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1027\":1,\"1031\":1,\"1033\":1,\"1075\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1188\":1,\"1192\":1,\"1194\":1,\"1252\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1381\":1,\"1385\":1,\"1387\":1,\"1445\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1571\":1,\"1575\":1,\"1581\":1,\"1648\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1777\":1,\"1781\":1,\"1783\":1,\"1825\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"1967\":1,\"1971\":1,\"1977\":1,\"2044\":1,\"2173\":1,\"2178\":1,\"2179\":1,\"2186\":1,\"2190\":1,\"2196\":1,\"2263\":1}}],[\"separates\",{\"1\":{\"62\":1}}],[\"searching\",{\"1\":{\"488\":1,\"642\":1,\"849\":1,\"1072\":1,\"1249\":1,\"1442\":1,\"1644\":1,\"1822\":1,\"2040\":1,\"2259\":1}}],[\"search\",{\"0\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1},\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"610\":1,\"616\":1,\"618\":3,\"777\":1,\"781\":1,\"817\":1,\"823\":1,\"825\":3,\"1000\":1,\"1004\":1,\"1040\":1,\"1046\":1,\"1048\":3,\"1161\":1,\"1165\":1,\"1217\":1,\"1223\":1,\"1225\":3,\"1354\":1,\"1358\":1,\"1410\":1,\"1416\":1,\"1418\":3,\"1544\":1,\"1548\":1,\"1609\":1,\"1615\":1,\"1617\":3,\"1750\":1,\"1754\":1,\"1790\":1,\"1796\":1,\"1798\":3,\"1940\":1,\"1944\":1,\"2005\":1,\"2011\":1,\"2013\":3,\"2159\":1,\"2163\":1,\"2224\":1,\"2230\":1,\"2232\":3}}],[\"seasoned\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"seamless\",{\"1\":{\"58\":1,\"59\":1}}],[\"seamlessly\",{\"1\":{\"58\":1}}],[\"sensitive\",{\"1\":{\"302\":2,\"352\":2,\"693\":2,\"900\":2}}],[\"sendtestmailonstartup\",{\"0\":{\"424\":1,\"575\":1,\"793\":1,\"1016\":1,\"1177\":1,\"1370\":1,\"1560\":1,\"1766\":1,\"1956\":1,\"2175\":1},\"1\":{\"424\":1,\"575\":1,\"793\":1,\"1016\":1,\"1177\":1,\"1370\":1,\"1560\":1,\"1766\":1,\"1956\":1,\"2175\":1}}],[\"sendmailonerrorlogevent\",{\"0\":{\"423\":1,\"574\":1,\"792\":1,\"1015\":1,\"1176\":1,\"1369\":1,\"1559\":1,\"1765\":1,\"1955\":1,\"2174\":1},\"1\":{\"423\":1,\"574\":1,\"792\":1,\"1015\":1,\"1176\":1,\"1369\":1,\"1559\":1,\"1765\":1,\"1955\":1,\"2174\":1}}],[\"sender\",{\"1\":{\"416\":2,\"567\":2,\"785\":2,\"1008\":2,\"1169\":2,\"1362\":2,\"1552\":2,\"1758\":2,\"1948\":2,\"2167\":2}}],[\"send\",{\"1\":{\"61\":2,\"70\":1,\"71\":2,\"92\":1,\"99\":1,\"102\":1,\"418\":1,\"419\":1,\"423\":1,\"424\":1,\"425\":1,\"505\":1,\"569\":1,\"570\":1,\"574\":1,\"575\":1,\"576\":1,\"602\":1,\"787\":1,\"788\":1,\"792\":1,\"793\":1,\"794\":1,\"917\":1,\"1010\":1,\"1011\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1171\":1,\"1172\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1209\":1,\"1297\":1,\"1364\":1,\"1365\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1402\":1,\"1554\":1,\"1555\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1601\":1,\"1693\":1,\"1760\":1,\"1761\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1870\":1,\"1950\":1,\"1951\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1997\":1,\"2089\":1,\"2169\":1,\"2170\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2216\":1,\"2308\":1}}],[\"sends\",{\"1\":{\"61\":1}}],[\"session\",{\"1\":{\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"719\":2,\"942\":2}}],[\"seriously\",{\"1\":{\"95\":1,\"97\":1}}],[\"server\",{\"0\":{\"53\":1,\"77\":1,\"133\":1,\"137\":1,\"138\":1,\"156\":1,\"160\":1,\"161\":1,\"168\":1,\"169\":1,\"180\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"216\":1,\"220\":1,\"221\":1,\"228\":1,\"229\":1,\"246\":1,\"250\":1,\"251\":1,\"258\":1,\"259\":1,\"276\":1,\"280\":1,\"281\":1,\"288\":1,\"289\":1,\"322\":1,\"326\":1,\"327\":1,\"334\":1,\"335\":1,\"368\":1,\"372\":1,\"373\":1,\"380\":1,\"381\":1,\"382\":1,\"406\":1,\"408\":1,\"409\":1,\"429\":1,\"433\":1,\"434\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":2,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":2,\"463\":1,\"464\":1,\"465\":1,\"466\":1,\"472\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"498\":1,\"499\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":2,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":2,\"531\":1,\"532\":1,\"533\":1,\"557\":1,\"559\":1,\"560\":1,\"580\":1,\"584\":1,\"585\":1,\"592\":1,\"595\":1,\"596\":1,\"625\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":2,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":2,\"670\":1,\"671\":1,\"672\":1,\"679\":1,\"713\":1,\"717\":1,\"718\":1,\"725\":1,\"726\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":2,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":2,\"749\":1,\"750\":1,\"751\":1,\"776\":1,\"778\":1,\"798\":1,\"805\":1,\"806\":1,\"814\":1,\"832\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":2,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":2,\"877\":1,\"878\":1,\"879\":1,\"886\":1,\"909\":1,\"910\":1,\"915\":1,\"936\":1,\"940\":1,\"941\":1,\"948\":1,\"949\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":2,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":2,\"972\":1,\"973\":1,\"974\":1,\"999\":1,\"1001\":1,\"1021\":1,\"1028\":1,\"1029\":1,\"1037\":1,\"1055\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":2,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":2,\"1100\":1,\"1101\":1,\"1102\":1,\"1109\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":2,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":2,\"1133\":1,\"1134\":1,\"1135\":1,\"1160\":1,\"1162\":1,\"1182\":1,\"1189\":1,\"1190\":1,\"1198\":1,\"1201\":1,\"1202\":1,\"1207\":1,\"1232\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":2,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":2,\"1277\":1,\"1278\":1,\"1279\":1,\"1286\":1,\"1289\":1,\"1290\":1,\"1295\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":2,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":2,\"1326\":1,\"1327\":1,\"1328\":1,\"1353\":1,\"1355\":1,\"1375\":1,\"1382\":1,\"1383\":1,\"1391\":1,\"1394\":1,\"1395\":1,\"1400\":1,\"1425\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":2,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":2,\"1470\":1,\"1471\":1,\"1472\":1,\"1479\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":2,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":2,\"1513\":1,\"1514\":1,\"1515\":1,\"1543\":1,\"1545\":1,\"1565\":1,\"1572\":1,\"1573\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1590\":1,\"1593\":1,\"1594\":1,\"1599\":1,\"1624\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":2,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":2,\"1673\":1,\"1674\":1,\"1675\":1,\"1682\":1,\"1685\":1,\"1686\":1,\"1691\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":2,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":2,\"1722\":1,\"1723\":1,\"1724\":1,\"1749\":1,\"1751\":1,\"1771\":1,\"1778\":1,\"1779\":1,\"1787\":1,\"1805\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":2,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":2,\"1850\":1,\"1851\":1,\"1852\":1,\"1859\":1,\"1862\":1,\"1863\":1,\"1868\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":2,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":2,\"1909\":1,\"1910\":1,\"1911\":1,\"1939\":1,\"1941\":1,\"1961\":1,\"1968\":1,\"1969\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1986\":1,\"1989\":1,\"1990\":1,\"1995\":1,\"2020\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":2,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":2,\"2069\":1,\"2070\":1,\"2071\":1,\"2078\":1,\"2081\":1,\"2082\":1,\"2087\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":2,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":2,\"2128\":1,\"2129\":1,\"2130\":1,\"2158\":1,\"2160\":1,\"2180\":1,\"2187\":1,\"2188\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2205\":1,\"2208\":1,\"2209\":1,\"2214\":1,\"2239\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":2,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":2,\"2288\":1,\"2289\":1,\"2290\":1,\"2297\":1,\"2300\":1,\"2301\":1,\"2306\":1},\"1\":{\"32\":2,\"49\":1,\"53\":3,\"54\":3,\"60\":1,\"63\":18,\"73\":1,\"74\":3,\"76\":6,\"77\":6,\"133\":4,\"134\":5,\"136\":2,\"137\":14,\"138\":13,\"139\":2,\"143\":1,\"156\":4,\"157\":5,\"159\":2,\"160\":13,\"161\":12,\"162\":2,\"165\":2,\"166\":1,\"169\":7,\"180\":4,\"181\":5,\"183\":2,\"184\":13,\"185\":12,\"186\":2,\"189\":2,\"190\":1,\"192\":1,\"193\":7,\"216\":4,\"217\":5,\"219\":2,\"220\":13,\"221\":12,\"222\":2,\"225\":2,\"226\":2,\"229\":7,\"246\":4,\"247\":5,\"249\":2,\"250\":13,\"251\":11,\"252\":2,\"255\":2,\"256\":2,\"259\":7,\"276\":4,\"277\":5,\"279\":2,\"280\":13,\"281\":11,\"282\":2,\"285\":2,\"286\":2,\"289\":7,\"322\":4,\"323\":5,\"325\":2,\"326\":13,\"327\":11,\"328\":2,\"331\":2,\"332\":2,\"335\":7,\"368\":4,\"369\":5,\"371\":2,\"372\":13,\"373\":11,\"374\":2,\"377\":2,\"378\":2,\"381\":7,\"385\":1,\"386\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":2,\"391\":1,\"392\":1,\"393\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"406\":3,\"407\":1,\"408\":2,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":2,\"414\":2,\"415\":1,\"417\":2,\"420\":2,\"421\":1,\"423\":1,\"424\":1,\"429\":4,\"430\":2,\"432\":1,\"433\":2,\"434\":2,\"435\":1,\"436\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":4,\"446\":4,\"447\":1,\"448\":2,\"449\":2,\"450\":2,\"451\":1,\"452\":3,\"453\":2,\"454\":1,\"455\":1,\"456\":3,\"457\":1,\"458\":1,\"459\":3,\"460\":3,\"461\":3,\"462\":3,\"463\":1,\"464\":1,\"465\":1,\"470\":2,\"471\":1,\"472\":3,\"476\":1,\"477\":1,\"478\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":2,\"484\":2,\"485\":2,\"486\":2,\"487\":1,\"488\":2,\"489\":1,\"490\":1,\"496\":2,\"499\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"506\":2,\"507\":1,\"508\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":4,\"514\":4,\"515\":1,\"516\":2,\"517\":2,\"518\":2,\"519\":1,\"520\":3,\"521\":2,\"522\":1,\"523\":1,\"524\":3,\"525\":1,\"526\":1,\"527\":3,\"528\":3,\"529\":3,\"530\":3,\"531\":1,\"532\":1,\"533\":1,\"536\":1,\"537\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":2,\"542\":1,\"543\":1,\"544\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"557\":3,\"558\":1,\"559\":2,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":2,\"565\":2,\"566\":1,\"568\":2,\"571\":2,\"572\":1,\"574\":1,\"575\":1,\"580\":4,\"581\":2,\"583\":1,\"584\":2,\"585\":2,\"586\":1,\"587\":1,\"596\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"603\":2,\"604\":1,\"605\":1,\"610\":6,\"618\":3,\"623\":2,\"624\":1,\"625\":3,\"629\":1,\"630\":1,\"631\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":2,\"637\":2,\"638\":2,\"639\":2,\"640\":1,\"641\":1,\"642\":2,\"643\":2,\"644\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":4,\"653\":4,\"654\":1,\"655\":2,\"656\":2,\"657\":2,\"658\":1,\"659\":3,\"660\":2,\"661\":1,\"662\":1,\"663\":3,\"664\":1,\"665\":1,\"666\":3,\"667\":3,\"668\":3,\"669\":3,\"670\":1,\"671\":1,\"672\":1,\"674\":2,\"675\":8,\"676\":2,\"677\":4,\"678\":8,\"713\":4,\"714\":5,\"716\":2,\"717\":13,\"718\":11,\"722\":2,\"723\":2,\"726\":7,\"728\":1,\"729\":1,\"730\":1,\"731\":4,\"732\":4,\"733\":1,\"734\":2,\"735\":2,\"736\":2,\"737\":1,\"738\":3,\"739\":2,\"740\":1,\"741\":1,\"742\":3,\"743\":1,\"744\":1,\"745\":3,\"746\":3,\"747\":3,\"748\":3,\"749\":1,\"750\":1,\"751\":1,\"754\":1,\"755\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":2,\"760\":1,\"761\":1,\"762\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"776\":3,\"777\":1,\"778\":2,\"779\":1,\"780\":1,\"781\":1,\"782\":2,\"783\":2,\"784\":1,\"786\":2,\"789\":2,\"790\":1,\"792\":1,\"793\":1,\"798\":4,\"799\":2,\"804\":1,\"805\":2,\"806\":2,\"807\":1,\"808\":1,\"817\":6,\"825\":3,\"830\":2,\"831\":1,\"832\":3,\"836\":1,\"837\":1,\"838\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":2,\"844\":2,\"845\":2,\"846\":2,\"847\":1,\"848\":1,\"849\":2,\"850\":2,\"851\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":4,\"860\":4,\"861\":1,\"862\":2,\"863\":2,\"864\":2,\"865\":1,\"866\":3,\"867\":2,\"868\":1,\"869\":1,\"870\":3,\"871\":1,\"872\":1,\"873\":3,\"874\":3,\"875\":3,\"876\":3,\"877\":1,\"878\":1,\"879\":1,\"881\":2,\"882\":8,\"883\":2,\"884\":4,\"885\":8,\"910\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"918\":2,\"919\":1,\"920\":1,\"936\":4,\"937\":5,\"939\":2,\"940\":13,\"941\":11,\"945\":2,\"946\":2,\"949\":7,\"951\":1,\"952\":1,\"953\":1,\"954\":4,\"955\":4,\"956\":1,\"957\":2,\"958\":2,\"959\":2,\"960\":1,\"961\":3,\"962\":2,\"963\":1,\"964\":1,\"965\":3,\"966\":1,\"967\":1,\"968\":3,\"969\":3,\"970\":3,\"971\":3,\"972\":1,\"973\":1,\"974\":1,\"977\":1,\"978\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":2,\"983\":1,\"984\":1,\"985\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"999\":2,\"1000\":1,\"1001\":2,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":2,\"1006\":2,\"1007\":1,\"1009\":2,\"1012\":2,\"1013\":1,\"1015\":1,\"1016\":1,\"1021\":4,\"1022\":2,\"1027\":1,\"1028\":2,\"1029\":2,\"1030\":1,\"1031\":1,\"1040\":6,\"1048\":3,\"1053\":2,\"1054\":1,\"1055\":2,\"1059\":1,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":2,\"1067\":2,\"1068\":2,\"1069\":2,\"1070\":1,\"1071\":1,\"1072\":2,\"1073\":2,\"1074\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":4,\"1083\":4,\"1084\":1,\"1085\":2,\"1086\":2,\"1087\":2,\"1088\":1,\"1089\":3,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":3,\"1094\":1,\"1095\":1,\"1096\":3,\"1097\":3,\"1098\":3,\"1099\":3,\"1100\":1,\"1101\":1,\"1102\":1,\"1104\":2,\"1105\":8,\"1106\":2,\"1107\":4,\"1108\":8,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":4,\"1116\":4,\"1117\":1,\"1118\":2,\"1119\":2,\"1120\":2,\"1121\":1,\"1122\":3,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":3,\"1127\":1,\"1128\":1,\"1129\":3,\"1130\":3,\"1131\":3,\"1132\":3,\"1133\":1,\"1134\":1,\"1135\":1,\"1138\":1,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":2,\"1144\":1,\"1145\":1,\"1146\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1160\":2,\"1161\":1,\"1162\":2,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":2,\"1167\":2,\"1168\":1,\"1170\":2,\"1173\":2,\"1174\":1,\"1176\":1,\"1177\":1,\"1182\":4,\"1183\":2,\"1188\":1,\"1189\":2,\"1190\":2,\"1191\":1,\"1192\":1,\"1202\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1210\":2,\"1211\":1,\"1212\":1,\"1217\":6,\"1225\":3,\"1230\":2,\"1231\":1,\"1232\":2,\"1236\":1,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":2,\"1244\":2,\"1245\":2,\"1246\":2,\"1247\":1,\"1248\":1,\"1249\":2,\"1250\":2,\"1251\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":4,\"1260\":4,\"1261\":1,\"1262\":2,\"1263\":2,\"1264\":2,\"1265\":1,\"1266\":3,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":3,\"1271\":1,\"1272\":1,\"1273\":3,\"1274\":3,\"1275\":3,\"1276\":3,\"1277\":1,\"1278\":1,\"1279\":1,\"1281\":2,\"1282\":8,\"1283\":2,\"1284\":4,\"1285\":8,\"1290\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1298\":2,\"1299\":1,\"1300\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":4,\"1309\":4,\"1310\":1,\"1311\":2,\"1312\":2,\"1313\":2,\"1314\":1,\"1315\":3,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":3,\"1320\":1,\"1321\":1,\"1322\":3,\"1323\":3,\"1324\":3,\"1325\":3,\"1326\":1,\"1327\":1,\"1328\":1,\"1331\":1,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":2,\"1337\":1,\"1338\":1,\"1339\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1353\":2,\"1354\":1,\"1355\":2,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":2,\"1360\":2,\"1361\":1,\"1363\":2,\"1366\":2,\"1367\":1,\"1369\":1,\"1370\":1,\"1375\":4,\"1376\":2,\"1381\":1,\"1382\":2,\"1383\":2,\"1384\":1,\"1385\":1,\"1395\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1403\":2,\"1404\":1,\"1405\":1,\"1410\":6,\"1418\":3,\"1423\":2,\"1424\":1,\"1425\":2,\"1429\":1,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":2,\"1437\":2,\"1438\":2,\"1439\":2,\"1440\":1,\"1441\":1,\"1442\":2,\"1443\":2,\"1444\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":4,\"1453\":4,\"1454\":1,\"1455\":2,\"1456\":2,\"1457\":2,\"1458\":1,\"1459\":3,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":3,\"1464\":1,\"1465\":1,\"1466\":3,\"1467\":3,\"1468\":3,\"1469\":3,\"1470\":1,\"1471\":1,\"1472\":1,\"1474\":2,\"1475\":8,\"1476\":2,\"1477\":4,\"1478\":8,\"1482\":5,\"1489\":1,\"1490\":3,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":4,\"1496\":4,\"1497\":1,\"1498\":2,\"1499\":2,\"1500\":2,\"1501\":1,\"1502\":3,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":3,\"1507\":1,\"1508\":1,\"1509\":3,\"1510\":3,\"1511\":3,\"1512\":3,\"1513\":1,\"1514\":1,\"1515\":1,\"1518\":1,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":2,\"1524\":1,\"1525\":1,\"1526\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1543\":2,\"1544\":1,\"1545\":2,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":2,\"1550\":2,\"1551\":1,\"1553\":2,\"1556\":2,\"1557\":1,\"1559\":1,\"1560\":1,\"1565\":4,\"1566\":2,\"1571\":1,\"1572\":2,\"1573\":2,\"1574\":1,\"1575\":1,\"1577\":2,\"1578\":2,\"1579\":1,\"1580\":1,\"1586\":2,\"1587\":8,\"1588\":4,\"1589\":8,\"1593\":1,\"1594\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1602\":2,\"1603\":1,\"1604\":1,\"1609\":6,\"1617\":3,\"1622\":2,\"1623\":1,\"1624\":2,\"1628\":1,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":2,\"1636\":2,\"1640\":2,\"1641\":2,\"1642\":1,\"1643\":1,\"1644\":2,\"1645\":2,\"1646\":1,\"1647\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":4,\"1656\":4,\"1657\":1,\"1658\":2,\"1659\":2,\"1660\":2,\"1661\":1,\"1662\":3,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":3,\"1667\":1,\"1668\":1,\"1669\":3,\"1670\":3,\"1671\":3,\"1672\":3,\"1673\":1,\"1674\":1,\"1675\":1,\"1677\":2,\"1678\":8,\"1679\":2,\"1680\":4,\"1681\":8,\"1685\":1,\"1686\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1694\":2,\"1695\":1,\"1696\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":4,\"1705\":4,\"1706\":1,\"1707\":2,\"1708\":2,\"1709\":2,\"1710\":1,\"1711\":3,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":3,\"1716\":1,\"1717\":1,\"1718\":3,\"1719\":3,\"1720\":3,\"1721\":3,\"1722\":1,\"1723\":1,\"1724\":1,\"1727\":1,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":2,\"1733\":1,\"1734\":1,\"1735\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1749\":2,\"1750\":1,\"1751\":2,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":2,\"1756\":2,\"1757\":1,\"1759\":2,\"1762\":2,\"1763\":1,\"1765\":1,\"1766\":1,\"1771\":4,\"1772\":2,\"1777\":1,\"1778\":2,\"1779\":2,\"1780\":1,\"1781\":1,\"1790\":6,\"1798\":3,\"1803\":2,\"1804\":1,\"1805\":2,\"1809\":1,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":2,\"1817\":2,\"1818\":2,\"1819\":2,\"1820\":1,\"1821\":1,\"1822\":2,\"1823\":2,\"1824\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":4,\"1833\":4,\"1834\":1,\"1835\":2,\"1836\":2,\"1837\":2,\"1838\":1,\"1839\":3,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":3,\"1844\":1,\"1845\":1,\"1846\":3,\"1847\":3,\"1848\":3,\"1849\":3,\"1850\":1,\"1851\":1,\"1852\":1,\"1854\":2,\"1855\":8,\"1856\":2,\"1857\":4,\"1858\":8,\"1863\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1871\":2,\"1872\":1,\"1873\":1,\"1878\":5,\"1885\":1,\"1886\":3,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":4,\"1892\":4,\"1893\":1,\"1894\":2,\"1895\":2,\"1896\":2,\"1897\":1,\"1898\":3,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":3,\"1903\":1,\"1904\":1,\"1905\":3,\"1906\":3,\"1907\":3,\"1908\":3,\"1909\":1,\"1910\":1,\"1911\":1,\"1914\":1,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":2,\"1920\":1,\"1921\":1,\"1922\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1939\":2,\"1940\":1,\"1941\":2,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":2,\"1946\":2,\"1947\":1,\"1949\":2,\"1952\":2,\"1953\":1,\"1955\":1,\"1956\":1,\"1961\":4,\"1962\":2,\"1967\":1,\"1968\":2,\"1969\":2,\"1970\":1,\"1971\":1,\"1973\":2,\"1974\":2,\"1975\":1,\"1976\":1,\"1982\":2,\"1983\":8,\"1984\":4,\"1985\":8,\"1989\":1,\"1990\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"1998\":2,\"1999\":1,\"2000\":1,\"2005\":6,\"2013\":3,\"2018\":2,\"2019\":1,\"2020\":2,\"2024\":1,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":2,\"2032\":2,\"2036\":2,\"2037\":2,\"2038\":1,\"2039\":1,\"2040\":2,\"2041\":2,\"2042\":1,\"2043\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":4,\"2052\":4,\"2053\":1,\"2054\":2,\"2055\":2,\"2056\":2,\"2057\":1,\"2058\":3,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":3,\"2063\":1,\"2064\":1,\"2065\":3,\"2066\":3,\"2067\":3,\"2068\":3,\"2069\":1,\"2070\":1,\"2071\":1,\"2073\":2,\"2074\":8,\"2075\":2,\"2076\":4,\"2077\":8,\"2081\":1,\"2082\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2090\":2,\"2091\":1,\"2092\":1,\"2097\":5,\"2104\":1,\"2105\":3,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":4,\"2111\":4,\"2112\":1,\"2113\":2,\"2114\":2,\"2115\":2,\"2116\":1,\"2117\":3,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":3,\"2122\":1,\"2123\":1,\"2124\":3,\"2125\":3,\"2126\":3,\"2127\":3,\"2128\":1,\"2129\":1,\"2130\":1,\"2133\":1,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":2,\"2139\":1,\"2140\":1,\"2141\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2158\":2,\"2159\":1,\"2160\":2,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":2,\"2165\":2,\"2166\":1,\"2168\":2,\"2171\":2,\"2172\":1,\"2174\":1,\"2175\":1,\"2180\":4,\"2181\":2,\"2186\":1,\"2187\":2,\"2188\":2,\"2189\":1,\"2190\":1,\"2192\":2,\"2193\":2,\"2194\":1,\"2195\":1,\"2201\":2,\"2202\":8,\"2203\":4,\"2204\":8,\"2208\":1,\"2209\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2217\":2,\"2218\":1,\"2219\":1,\"2224\":6,\"2232\":3,\"2237\":2,\"2238\":1,\"2239\":2,\"2243\":1,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":2,\"2251\":2,\"2255\":2,\"2256\":2,\"2257\":1,\"2258\":1,\"2259\":2,\"2260\":2,\"2261\":1,\"2262\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":4,\"2271\":4,\"2272\":1,\"2273\":2,\"2274\":2,\"2275\":2,\"2276\":1,\"2277\":3,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":3,\"2282\":1,\"2283\":1,\"2284\":3,\"2285\":3,\"2286\":3,\"2287\":3,\"2288\":1,\"2289\":1,\"2290\":1,\"2292\":2,\"2293\":8,\"2294\":2,\"2295\":4,\"2296\":8,\"2300\":1,\"2301\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1,\"2309\":2,\"2310\":1,\"2311\":1}}],[\"servers\",{\"1\":{\"31\":1,\"54\":1,\"63\":2,\"73\":1,\"133\":2,\"136\":3,\"137\":2,\"138\":1,\"156\":2,\"159\":3,\"160\":2,\"161\":1,\"180\":2,\"183\":3,\"184\":2,\"185\":1,\"216\":2,\"219\":3,\"220\":2,\"221\":1,\"246\":2,\"249\":3,\"250\":2,\"251\":1,\"276\":2,\"279\":3,\"280\":2,\"281\":1,\"322\":2,\"325\":3,\"326\":2,\"327\":1,\"368\":2,\"371\":3,\"372\":2,\"373\":1,\"397\":1,\"405\":1,\"406\":1,\"467\":1,\"472\":1,\"473\":1,\"498\":1,\"548\":1,\"556\":1,\"557\":1,\"595\":1,\"620\":1,\"625\":1,\"626\":1,\"713\":2,\"716\":3,\"717\":2,\"718\":1,\"767\":1,\"775\":1,\"776\":1,\"827\":1,\"832\":1,\"833\":1,\"909\":1,\"936\":2,\"939\":3,\"940\":2,\"941\":1,\"990\":1,\"998\":1,\"999\":1,\"1050\":1,\"1055\":1,\"1056\":1,\"1151\":1,\"1159\":1,\"1160\":1,\"1201\":1,\"1227\":1,\"1232\":1,\"1233\":1,\"1289\":1,\"1344\":1,\"1352\":1,\"1353\":1,\"1394\":1,\"1420\":1,\"1425\":1,\"1426\":1,\"1534\":1,\"1542\":1,\"1543\":1,\"1619\":1,\"1624\":1,\"1625\":1,\"1740\":1,\"1748\":1,\"1749\":1,\"1800\":1,\"1805\":1,\"1806\":1,\"1862\":1,\"1930\":1,\"1938\":1,\"1939\":1,\"2015\":1,\"2020\":1,\"2021\":1,\"2149\":1,\"2157\":1,\"2158\":1,\"2234\":1,\"2239\":1,\"2240\":1}}],[\"services\",{\"1\":{\"95\":1,\"97\":1,\"102\":1,\"134\":1,\"137\":2,\"138\":1,\"157\":1,\"160\":2,\"161\":1,\"168\":1,\"169\":1,\"181\":1,\"184\":2,\"185\":1,\"192\":1,\"193\":1,\"217\":1,\"220\":2,\"221\":1,\"228\":1,\"229\":1,\"247\":1,\"250\":2,\"251\":1,\"258\":1,\"259\":1,\"277\":1,\"280\":2,\"281\":1,\"288\":1,\"289\":1,\"323\":1,\"326\":2,\"327\":1,\"334\":1,\"335\":1,\"369\":1,\"372\":2,\"373\":1,\"380\":1,\"381\":1,\"678\":1,\"714\":1,\"717\":2,\"718\":1,\"725\":1,\"726\":1,\"885\":1,\"937\":1,\"940\":2,\"941\":1,\"948\":1,\"949\":1,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"service\",{\"1\":{\"11\":1,\"63\":2,\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"416\":1,\"422\":1,\"427\":1,\"428\":1,\"567\":1,\"573\":1,\"578\":1,\"579\":1,\"712\":2,\"785\":1,\"791\":1,\"796\":1,\"797\":1,\"935\":2,\"1008\":1,\"1014\":1,\"1019\":1,\"1020\":1,\"1169\":1,\"1175\":1,\"1180\":1,\"1181\":1,\"1362\":1,\"1368\":1,\"1373\":1,\"1374\":1,\"1552\":1,\"1558\":1,\"1563\":1,\"1564\":1,\"1758\":1,\"1764\":1,\"1769\":1,\"1770\":1,\"1948\":1,\"1954\":1,\"1959\":1,\"1960\":1,\"2167\":1,\"2173\":1,\"2178\":1,\"2179\":1}}],[\"several\",{\"1\":{\"62\":1,\"66\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"semantic\",{\"1\":{\"58\":1}}],[\"semantically\",{\"1\":{\"0\":1,\"62\":1}}],[\"secret\",{\"0\":{\"450\":1,\"518\":1,\"657\":1,\"736\":1,\"864\":1,\"959\":1,\"1087\":1,\"1120\":1,\"1264\":1,\"1313\":1,\"1457\":1,\"1500\":1,\"1660\":1,\"1709\":1,\"1837\":1,\"1896\":1,\"2056\":1,\"2115\":1,\"2275\":1},\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"385\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":1,\"420\":1,\"425\":1,\"426\":1,\"429\":1,\"438\":1,\"445\":1,\"450\":2,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"480\":1,\"482\":1,\"492\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"513\":1,\"518\":2,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"536\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":1,\"571\":1,\"576\":1,\"577\":1,\"580\":1,\"589\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"633\":1,\"635\":1,\"646\":1,\"652\":1,\"657\":2,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"675\":1,\"678\":1,\"717\":1,\"718\":1,\"731\":1,\"736\":2,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"754\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"789\":1,\"794\":1,\"795\":1,\"798\":1,\"811\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"840\":1,\"842\":1,\"853\":1,\"859\":1,\"864\":2,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"882\":1,\"885\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"940\":1,\"941\":1,\"954\":1,\"959\":2,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"977\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1012\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1034\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1076\":1,\"1082\":1,\"1087\":2,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1105\":1,\"1108\":1,\"1115\":1,\"1120\":2,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1173\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1195\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1253\":1,\"1259\":1,\"1264\":2,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1282\":1,\"1285\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1308\":1,\"1313\":2,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1366\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1388\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1446\":1,\"1452\":1,\"1457\":2,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1475\":1,\"1478\":1,\"1495\":1,\"1500\":2,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1556\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1582\":1,\"1587\":1,\"1589\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1649\":1,\"1655\":1,\"1660\":2,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1678\":1,\"1681\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1704\":1,\"1709\":2,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1762\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1784\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1826\":1,\"1832\":1,\"1837\":2,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1855\":1,\"1858\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1891\":1,\"1896\":2,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1952\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1978\":1,\"1983\":1,\"1985\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2045\":1,\"2051\":1,\"2056\":2,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2074\":1,\"2077\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2110\":1,\"2115\":2,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2171\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2197\":1,\"2202\":1,\"2204\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2264\":1,\"2270\":1,\"2275\":2,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2293\":1,\"2296\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"secrets\",{\"1\":{\"137\":11,\"138\":7,\"160\":11,\"161\":7,\"184\":11,\"185\":7,\"220\":11,\"221\":7,\"250\":11,\"251\":7,\"280\":11,\"281\":7,\"326\":11,\"327\":7,\"372\":11,\"373\":7,\"385\":1,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":1,\"425\":1,\"426\":1,\"429\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"480\":1,\"482\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"536\":1,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":1,\"576\":1,\"577\":1,\"580\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"633\":1,\"635\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"678\":4,\"717\":11,\"718\":7,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"754\":1,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"794\":1,\"795\":1,\"798\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"840\":1,\"842\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"885\":4,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"940\":11,\"941\":7,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"977\":1,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1108\":4,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1285\":4,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1478\":4,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1589\":4,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1681\":4,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1858\":4,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1985\":4,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2077\":4,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2204\":4,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2296\":4,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"seconds\",{\"1\":{\"500\":2,\"501\":2,\"502\":2,\"503\":2,\"597\":2,\"598\":2,\"599\":2,\"600\":2,\"911\":2,\"912\":2,\"913\":2,\"914\":2,\"1203\":2,\"1204\":2,\"1205\":2,\"1206\":2,\"1291\":2,\"1292\":2,\"1293\":2,\"1294\":2,\"1396\":2,\"1397\":2,\"1398\":2,\"1399\":2,\"1595\":2,\"1596\":2,\"1597\":2,\"1598\":2,\"1687\":2,\"1688\":2,\"1689\":2,\"1690\":2,\"1864\":2,\"1865\":2,\"1866\":2,\"1867\":2,\"1991\":2,\"1992\":2,\"1993\":2,\"1994\":2,\"2083\":2,\"2084\":2,\"2085\":2,\"2086\":2,\"2210\":2,\"2211\":2,\"2212\":2,\"2213\":2,\"2302\":2,\"2303\":2,\"2304\":2,\"2305\":2}}],[\"second\",{\"1\":{\"58\":1,\"618\":2,\"825\":2,\"1048\":2,\"1225\":2,\"1418\":2,\"1490\":2,\"1617\":2,\"1798\":2,\"1886\":2,\"2013\":2,\"2105\":2,\"2232\":2}}],[\"secondly\",{\"1\":{\"49\":1}}],[\"section\",{\"1\":{\"53\":1,\"60\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"security\",{\"0\":{\"25\":1,\"72\":1,\"73\":1,\"95\":1,\"96\":1,\"97\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1},\"1\":{\"20\":2,\"21\":1,\"25\":1,\"44\":1,\"55\":2,\"73\":3,\"95\":5,\"97\":2,\"98\":1,\"99\":4,\"100\":2,\"102\":2}}],[\"securely\",{\"1\":{\"23\":1,\"58\":1}}],[\"secured\",{\"1\":{\"0\":1,\"52\":1}}],[\"secure\",{\"1\":{\"0\":3,\"10\":1,\"20\":1,\"21\":1,\"27\":1,\"39\":2,\"42\":1,\"54\":1,\"58\":1,\"62\":3,\"73\":1,\"95\":2,\"100\":1}}],[\"sein\",{\"1\":{\"30\":1,\"31\":1}}],[\"seidel\",{\"1\":{\"18\":1}}],[\"sets\",{\"1\":{\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"setting\",{\"0\":{\"296\":1,\"346\":1,\"687\":1,\"894\":1},\"1\":{\"80\":1,\"81\":1,\"675\":1,\"882\":1,\"1105\":1,\"1282\":1,\"1475\":1,\"1587\":1,\"1678\":1,\"1855\":1,\"1983\":1,\"2074\":1,\"2202\":1,\"2293\":1}}],[\"settings\",{\"1\":{\"20\":1,\"26\":1,\"226\":1,\"256\":1,\"286\":1,\"293\":2,\"332\":1,\"343\":2,\"378\":1,\"387\":1,\"478\":1,\"538\":1,\"631\":1,\"684\":2,\"723\":1,\"756\":1,\"838\":1,\"891\":2,\"946\":1,\"979\":1,\"1061\":1,\"1140\":1,\"1238\":1,\"1333\":1,\"1431\":1,\"1520\":1,\"1630\":1,\"1729\":1,\"1811\":1,\"1916\":1,\"2026\":1,\"2135\":1,\"2245\":1}}],[\"set\",{\"1\":{\"59\":1,\"90\":1,\"137\":7,\"138\":3,\"160\":6,\"161\":3,\"184\":6,\"185\":3,\"220\":6,\"221\":3,\"250\":6,\"251\":2,\"280\":6,\"281\":2,\"326\":6,\"327\":2,\"372\":6,\"373\":2,\"383\":1,\"394\":1,\"395\":1,\"396\":1,\"402\":1,\"405\":1,\"423\":1,\"424\":1,\"431\":1,\"445\":1,\"446\":2,\"448\":1,\"473\":1,\"474\":1,\"490\":2,\"513\":1,\"514\":2,\"516\":1,\"534\":1,\"545\":1,\"546\":1,\"547\":1,\"553\":1,\"556\":1,\"574\":1,\"575\":1,\"582\":1,\"606\":1,\"617\":1,\"626\":1,\"627\":1,\"644\":2,\"652\":1,\"653\":2,\"655\":1,\"674\":1,\"675\":1,\"676\":1,\"717\":6,\"718\":2,\"731\":1,\"732\":2,\"734\":1,\"752\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"772\":1,\"775\":1,\"792\":1,\"793\":1,\"800\":1,\"824\":1,\"833\":1,\"834\":1,\"851\":2,\"859\":1,\"860\":2,\"862\":1,\"881\":1,\"882\":1,\"883\":1,\"921\":1,\"940\":6,\"941\":2,\"954\":1,\"955\":2,\"957\":1,\"975\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"995\":1,\"998\":1,\"1015\":1,\"1016\":1,\"1023\":1,\"1047\":1,\"1056\":1,\"1057\":1,\"1074\":2,\"1082\":1,\"1083\":2,\"1085\":1,\"1104\":1,\"1105\":1,\"1106\":1,\"1115\":1,\"1116\":2,\"1118\":1,\"1136\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1156\":1,\"1159\":1,\"1176\":1,\"1177\":1,\"1184\":1,\"1213\":1,\"1224\":1,\"1233\":1,\"1234\":1,\"1251\":2,\"1259\":1,\"1260\":2,\"1262\":1,\"1281\":1,\"1282\":1,\"1283\":1,\"1301\":1,\"1308\":1,\"1309\":2,\"1311\":1,\"1329\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1349\":1,\"1352\":1,\"1369\":1,\"1370\":1,\"1377\":1,\"1406\":1,\"1417\":1,\"1426\":1,\"1427\":1,\"1444\":2,\"1452\":1,\"1453\":2,\"1455\":1,\"1474\":1,\"1475\":1,\"1476\":1,\"1495\":1,\"1496\":2,\"1498\":1,\"1516\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1539\":1,\"1542\":1,\"1559\":1,\"1560\":1,\"1567\":1,\"1579\":2,\"1586\":1,\"1587\":1,\"1605\":1,\"1616\":1,\"1625\":1,\"1626\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1646\":2,\"1655\":1,\"1656\":2,\"1658\":1,\"1677\":1,\"1678\":1,\"1679\":1,\"1697\":1,\"1704\":1,\"1705\":2,\"1707\":1,\"1725\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1745\":1,\"1748\":1,\"1765\":1,\"1766\":1,\"1773\":1,\"1797\":1,\"1806\":1,\"1807\":1,\"1824\":2,\"1832\":1,\"1833\":2,\"1835\":1,\"1854\":1,\"1855\":1,\"1856\":1,\"1874\":1,\"1891\":1,\"1892\":2,\"1894\":1,\"1912\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1935\":1,\"1938\":1,\"1955\":1,\"1956\":1,\"1963\":1,\"1975\":2,\"1982\":1,\"1983\":1,\"2001\":1,\"2012\":1,\"2021\":1,\"2022\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2042\":2,\"2051\":1,\"2052\":2,\"2054\":1,\"2073\":1,\"2074\":1,\"2075\":1,\"2093\":1,\"2110\":1,\"2111\":2,\"2113\":1,\"2131\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2154\":1,\"2157\":1,\"2174\":1,\"2175\":1,\"2182\":1,\"2194\":2,\"2201\":1,\"2202\":1,\"2220\":1,\"2231\":1,\"2240\":1,\"2241\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2261\":2,\"2270\":1,\"2271\":2,\"2273\":1,\"2292\":1,\"2293\":1,\"2294\":1,\"2312\":1}}],[\"setups\",{\"1\":{\"298\":1,\"348\":1,\"689\":1,\"896\":1}}],[\"setup\",{\"0\":{\"56\":1,\"63\":1,\"134\":1,\"135\":1,\"157\":1,\"158\":1,\"168\":1,\"169\":1,\"181\":1,\"182\":1,\"192\":1,\"193\":1,\"217\":1,\"218\":1,\"228\":1,\"229\":1,\"247\":1,\"248\":1,\"258\":1,\"259\":1,\"277\":1,\"278\":1,\"288\":1,\"289\":1,\"323\":1,\"324\":1,\"334\":1,\"335\":1,\"369\":1,\"370\":1,\"380\":1,\"381\":1,\"714\":1,\"715\":1,\"725\":1,\"726\":1,\"937\":1,\"938\":1,\"948\":1,\"949\":1},\"1\":{\"23\":1,\"56\":1,\"63\":1,\"64\":1,\"90\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"134\":1,\"157\":1,\"171\":1,\"181\":1,\"203\":1,\"217\":1,\"226\":4,\"247\":1,\"256\":4,\"277\":1,\"286\":4,\"323\":1,\"332\":4,\"369\":1,\"378\":4,\"714\":1,\"723\":4,\"937\":1,\"946\":4}}],[\"seen\",{\"1\":{\"54\":1,\"92\":1}}],[\"see\",{\"1\":{\"7\":1,\"61\":1,\"74\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"132\":1,\"137\":2,\"138\":1,\"139\":1,\"155\":1,\"160\":3,\"161\":1,\"162\":1,\"171\":1,\"179\":1,\"184\":3,\"185\":1,\"186\":1,\"192\":1,\"203\":1,\"215\":1,\"220\":3,\"221\":1,\"222\":1,\"245\":1,\"250\":3,\"251\":1,\"252\":1,\"275\":1,\"280\":3,\"281\":1,\"282\":1,\"303\":1,\"321\":1,\"326\":3,\"327\":1,\"328\":1,\"353\":1,\"367\":1,\"372\":3,\"373\":1,\"374\":1,\"610\":1,\"694\":1,\"712\":1,\"717\":3,\"718\":1,\"719\":1,\"817\":1,\"901\":1,\"935\":1,\"940\":3,\"941\":1,\"942\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"stuck\",{\"1\":{\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"752\":1,\"834\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1}}],[\"study\",{\"1\":{\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1}}],[\"studies\",{\"1\":{\"81\":2}}],[\"stud\",{\"1\":{\"39\":9}}],[\"style\",{\"0\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1},\"1\":{\"293\":4,\"343\":4,\"684\":4,\"891\":4}}],[\"stop\",{\"1\":{\"69\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"storing\",{\"1\":{\"63\":2,\"91\":1}}],[\"stores\",{\"1\":{\"49\":1}}],[\"store\",{\"0\":{\"32\":1},\"1\":{\"32\":1,\"136\":4,\"159\":4,\"183\":4,\"219\":4,\"235\":1,\"249\":4,\"265\":1,\"279\":4,\"311\":1,\"325\":4,\"357\":1,\"371\":4,\"408\":1,\"485\":1,\"559\":1,\"638\":1,\"702\":1,\"716\":4,\"778\":1,\"845\":1,\"925\":1,\"939\":4,\"1001\":1,\"1068\":1,\"1162\":1,\"1245\":1,\"1355\":1,\"1438\":1,\"1545\":1,\"1640\":1,\"1751\":1,\"1818\":1,\"1941\":1,\"2036\":1,\"2160\":1,\"2255\":1}}],[\"stored\",{\"1\":{\"0\":1,\"54\":1,\"62\":1}}],[\"step\",{\"1\":{\"299\":1,\"349\":1,\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"690\":1,\"752\":1,\"834\":1,\"897\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1}}],[\"steps\",{\"1\":{\"0\":1,\"62\":1,\"69\":1,\"70\":1,\"71\":1,\"99\":1,\"129\":1,\"143\":1,\"152\":1,\"166\":1,\"176\":1,\"190\":1,\"212\":1,\"226\":1,\"242\":1,\"256\":1,\"272\":1,\"286\":1,\"305\":2,\"318\":1,\"332\":1,\"355\":2,\"364\":1,\"378\":1,\"696\":2,\"709\":1,\"723\":1,\"903\":2,\"932\":1,\"946\":1}}],[\"stellen\",{\"1\":{\"32\":1}}],[\"strategy\",{\"0\":{\"294\":1,\"344\":1,\"685\":1,\"892\":1},\"1\":{\"294\":1,\"344\":1,\"685\":1,\"892\":1}}],[\"strategies\",{\"1\":{\"84\":1}}],[\"stronger\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"string\",{\"1\":{\"610\":1,\"643\":1,\"817\":1,\"915\":1,\"1040\":1,\"1207\":1,\"1217\":1,\"1295\":1,\"1400\":1,\"1410\":1,\"1482\":2,\"1599\":1,\"1609\":2,\"1691\":1,\"1790\":1,\"1868\":1,\"1878\":2,\"1995\":1,\"2005\":2,\"2087\":1,\"2097\":2,\"2214\":1,\"2224\":2,\"2306\":1}}],[\"stringent\",{\"1\":{\"20\":1}}],[\"strive\",{\"1\":{\"100\":1}}],[\"structural\",{\"1\":{\"58\":1}}],[\"structures\",{\"1\":{\"62\":1}}],[\"structuredefinition\",{\"1\":{\"61\":1}}],[\"structured\",{\"1\":{\"14\":2}}],[\"structure\",{\"0\":{\"10\":1},\"1\":{\"0\":1,\"62\":1,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"294\":1,\"326\":1,\"327\":1,\"344\":1,\"372\":1,\"373\":1,\"435\":1,\"586\":1,\"685\":1,\"717\":1,\"718\":1,\"807\":1,\"892\":1,\"940\":1,\"941\":1,\"1030\":1,\"1191\":1,\"1384\":1,\"1574\":1,\"1780\":1,\"1970\":1,\"2189\":1}}],[\"static\",{\"0\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1},\"1\":{\"490\":2,\"644\":2,\"851\":2,\"1074\":2,\"1251\":2,\"1444\":2,\"1579\":2,\"1646\":2,\"1824\":2,\"1975\":2,\"2042\":2,\"2194\":2,\"2261\":2}}],[\"state\",{\"1\":{\"95\":1}}],[\"status=active\",{\"1\":{\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"777\":1,\"781\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"statusclient\",{\"1\":{\"192\":1,\"193\":1}}],[\"status\",{\"0\":{\"464\":1,\"465\":1,\"532\":1,\"533\":1,\"671\":1,\"672\":1,\"750\":1,\"751\":1,\"878\":1,\"879\":1,\"973\":1,\"974\":1,\"1101\":1,\"1102\":1,\"1134\":1,\"1135\":1,\"1278\":1,\"1279\":1,\"1327\":1,\"1328\":1,\"1471\":1,\"1472\":1,\"1514\":1,\"1515\":1,\"1674\":1,\"1675\":1,\"1723\":1,\"1724\":1,\"1851\":1,\"1852\":1,\"1910\":1,\"1911\":1,\"2070\":1,\"2071\":1,\"2129\":1,\"2130\":1,\"2289\":1,\"2290\":1},\"1\":{\"54\":2,\"61\":2,\"70\":1,\"71\":1,\"192\":1,\"193\":1,\"464\":2,\"465\":2,\"532\":2,\"533\":2,\"671\":2,\"672\":2,\"750\":2,\"751\":2,\"878\":2,\"879\":2,\"973\":2,\"974\":2,\"1101\":2,\"1102\":2,\"1134\":2,\"1135\":2,\"1278\":2,\"1279\":2,\"1327\":2,\"1328\":2,\"1471\":2,\"1472\":2,\"1514\":2,\"1515\":2,\"1674\":2,\"1675\":2,\"1723\":2,\"1724\":2,\"1851\":2,\"1852\":2,\"1910\":2,\"1911\":2,\"2070\":2,\"2071\":2,\"2129\":2,\"2130\":2,\"2289\":2,\"2290\":2}}],[\"staff\",{\"1\":{\"81\":1}}],[\"stakeholders\",{\"1\":{\"60\":1}}],[\"star\",{\"1\":{\"55\":2}}],[\"starting\",{\"1\":{\"226\":2,\"256\":2,\"286\":2,\"304\":1,\"332\":2,\"354\":1,\"378\":2,\"695\":1,\"723\":2,\"902\":1,\"946\":2}}],[\"startup\",{\"1\":{\"138\":4,\"161\":4,\"185\":4,\"221\":4,\"251\":4,\"281\":4,\"327\":4,\"373\":4,\"424\":1,\"432\":1,\"435\":1,\"436\":1,\"486\":1,\"575\":1,\"583\":1,\"586\":1,\"587\":1,\"639\":1,\"718\":4,\"793\":1,\"804\":1,\"807\":1,\"808\":1,\"846\":1,\"941\":4,\"1016\":1,\"1027\":1,\"1030\":1,\"1031\":1,\"1069\":1,\"1177\":1,\"1188\":1,\"1191\":1,\"1192\":1,\"1246\":1,\"1370\":1,\"1381\":1,\"1384\":1,\"1385\":1,\"1439\":1,\"1560\":1,\"1571\":1,\"1574\":1,\"1575\":1,\"1641\":1,\"1766\":1,\"1777\":1,\"1780\":1,\"1781\":1,\"1819\":1,\"1956\":1,\"1967\":1,\"1970\":1,\"1971\":1,\"2037\":1,\"2175\":1,\"2186\":1,\"2189\":1,\"2190\":1,\"2256\":1}}],[\"starts\",{\"1\":{\"54\":1,\"61\":1}}],[\"start\",{\"0\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1},\"1\":{\"27\":1,\"61\":1,\"69\":2,\"80\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"128\":1,\"137\":2,\"138\":2,\"139\":1,\"151\":1,\"160\":2,\"161\":2,\"162\":1,\"171\":1,\"175\":1,\"184\":2,\"185\":2,\"186\":1,\"203\":1,\"207\":1,\"220\":2,\"221\":2,\"222\":1,\"226\":2,\"237\":1,\"250\":2,\"251\":2,\"252\":1,\"256\":2,\"267\":1,\"280\":2,\"281\":2,\"282\":1,\"286\":2,\"291\":1,\"305\":1,\"313\":1,\"326\":2,\"327\":2,\"328\":1,\"332\":2,\"341\":1,\"355\":1,\"359\":1,\"372\":2,\"373\":2,\"374\":1,\"378\":2,\"395\":1,\"396\":1,\"546\":1,\"547\":1,\"617\":2,\"682\":1,\"696\":1,\"704\":1,\"717\":2,\"718\":2,\"719\":1,\"723\":2,\"764\":1,\"765\":1,\"766\":1,\"809\":1,\"824\":2,\"889\":1,\"903\":1,\"915\":1,\"927\":1,\"940\":2,\"941\":2,\"942\":1,\"946\":2,\"987\":1,\"988\":1,\"989\":1,\"1032\":1,\"1047\":2,\"1148\":1,\"1149\":1,\"1150\":1,\"1193\":1,\"1207\":1,\"1224\":2,\"1295\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1386\":1,\"1400\":1,\"1417\":2,\"1530\":1,\"1531\":1,\"1532\":1,\"1576\":1,\"1599\":1,\"1616\":2,\"1691\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1782\":1,\"1797\":2,\"1868\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1972\":1,\"1995\":1,\"2012\":2,\"2087\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2191\":1,\"2214\":1,\"2231\":2,\"2306\":1}}],[\"started\",{\"0\":{\"27\":1},\"1\":{\"28\":1,\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"305\":4,\"306\":1,\"335\":2,\"336\":1,\"355\":4,\"381\":2,\"432\":1,\"583\":1,\"696\":4,\"697\":1,\"726\":2,\"804\":1,\"903\":4,\"904\":1,\"949\":2,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1}}],[\"stand\",{\"1\":{\"29\":1}}],[\"standorte\",{\"1\":{\"29\":1}}],[\"standardized\",{\"1\":{\"88\":1}}],[\"standardised\",{\"1\":{\"60\":1}}],[\"standard\",{\"1\":{\"24\":1,\"59\":2,\"89\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"standards\",{\"0\":{\"24\":1,\"57\":1},\"1\":{\"0\":1,\"21\":1,\"44\":1,\"52\":1,\"53\":1,\"57\":3,\"59\":1,\"62\":1,\"73\":1,\"80\":1,\"81\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"stable\",{\"1\":{\"10\":1,\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"stay\",{\"0\":{\"6\":1},\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"f0\",{\"1\":{\"610\":2,\"817\":2,\"1040\":2,\"1217\":2,\"1410\":2,\"1482\":2,\"1609\":2,\"1790\":2,\"1878\":2,\"2005\":2,\"2097\":2,\"2224\":2}}],[\"f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f\",{\"1\":{\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"f\",{\"1\":{\"137\":1,\"138\":1,\"139\":1,\"160\":1,\"161\":1,\"162\":1,\"168\":1,\"169\":1,\"184\":1,\"185\":1,\"186\":1,\"192\":1,\"193\":1,\"220\":1,\"221\":1,\"222\":1,\"228\":1,\"229\":1,\"250\":1,\"251\":1,\"252\":1,\"258\":1,\"259\":1,\"280\":1,\"281\":1,\"282\":1,\"288\":1,\"289\":1,\"326\":1,\"327\":1,\"328\":1,\"334\":1,\"335\":1,\"372\":1,\"373\":1,\"374\":1,\"380\":1,\"381\":1,\"717\":1,\"718\":1,\"719\":1,\"725\":1,\"726\":1,\"940\":1,\"941\":1,\"942\":1,\"948\":1,\"949\":1}}],[\"fttp\",{\"1\":{\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"714\":1,\"937\":1}}],[\"fssl\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"fqdns\",{\"1\":{\"76\":1}}],[\"fqdn\",{\"1\":{\"76\":3,\"77\":2,\"127\":1,\"133\":2,\"134\":1,\"137\":5,\"138\":4,\"139\":2,\"150\":1,\"156\":2,\"157\":1,\"160\":4,\"161\":3,\"162\":2,\"174\":1,\"180\":2,\"181\":1,\"184\":4,\"185\":3,\"186\":2,\"206\":1,\"216\":2,\"217\":1,\"220\":4,\"221\":3,\"222\":2,\"236\":1,\"246\":2,\"247\":1,\"250\":4,\"251\":2,\"252\":2,\"266\":1,\"276\":2,\"277\":1,\"280\":4,\"281\":2,\"282\":2,\"312\":1,\"322\":2,\"323\":1,\"326\":4,\"327\":2,\"328\":2,\"358\":1,\"368\":2,\"369\":1,\"372\":4,\"373\":2,\"374\":2,\"409\":1,\"487\":1,\"499\":2,\"560\":1,\"596\":2,\"640\":1,\"703\":1,\"713\":2,\"714\":1,\"717\":4,\"718\":2,\"847\":1,\"910\":2,\"926\":1,\"936\":2,\"937\":1,\"940\":4,\"941\":2,\"1070\":1,\"1202\":2,\"1247\":1,\"1290\":2,\"1395\":2,\"1440\":1,\"1594\":2,\"1642\":1,\"1686\":2,\"1820\":1,\"1863\":2,\"1990\":2,\"2038\":1,\"2082\":2,\"2209\":2,\"2257\":1,\"2301\":2}}],[\"für\",{\"1\":{\"30\":1,\"31\":2,\"32\":1,\"88\":1}}],[\"flyer\",{\"1\":{\"88\":1}}],[\"flexible\",{\"0\":{\"55\":1},\"1\":{\"55\":1}}],[\"flexibility\",{\"0\":{\"24\":1},\"1\":{\"24\":1}}],[\"flare\",{\"1\":{\"29\":2,\"36\":1}}],[\"florian\",{\"1\":{\"18\":1}}],[\"flow\",{\"0\":{\"445\":1,\"513\":1,\"652\":1,\"675\":1,\"731\":1,\"859\":1,\"882\":1,\"954\":1,\"1082\":1,\"1105\":1,\"1115\":1,\"1259\":1,\"1282\":1,\"1308\":1,\"1452\":1,\"1475\":1,\"1495\":1,\"1587\":1,\"1655\":1,\"1678\":1,\"1704\":1,\"1832\":1,\"1855\":1,\"1891\":1,\"1983\":1,\"2051\":1,\"2074\":1,\"2110\":1,\"2202\":1,\"2270\":1,\"2293\":1},\"1\":{\"7\":1,\"294\":1,\"344\":1,\"445\":2,\"446\":1,\"449\":1,\"450\":1,\"513\":2,\"514\":1,\"517\":1,\"518\":1,\"652\":2,\"653\":1,\"656\":1,\"657\":1,\"674\":1,\"675\":2,\"678\":1,\"685\":1,\"731\":2,\"732\":1,\"735\":1,\"736\":1,\"859\":2,\"860\":1,\"863\":1,\"864\":1,\"881\":1,\"882\":2,\"885\":1,\"892\":1,\"954\":2,\"955\":1,\"958\":1,\"959\":1,\"1082\":2,\"1083\":1,\"1086\":1,\"1087\":1,\"1104\":1,\"1105\":2,\"1108\":1,\"1115\":2,\"1116\":1,\"1119\":1,\"1120\":1,\"1259\":2,\"1260\":1,\"1263\":1,\"1264\":1,\"1281\":1,\"1282\":2,\"1285\":1,\"1308\":2,\"1309\":1,\"1312\":1,\"1313\":1,\"1452\":2,\"1453\":1,\"1456\":1,\"1457\":1,\"1474\":1,\"1475\":2,\"1478\":1,\"1495\":2,\"1496\":1,\"1499\":1,\"1500\":1,\"1586\":1,\"1587\":2,\"1589\":1,\"1655\":2,\"1656\":1,\"1659\":1,\"1660\":1,\"1677\":1,\"1678\":2,\"1681\":1,\"1704\":2,\"1705\":1,\"1708\":1,\"1709\":1,\"1832\":2,\"1833\":1,\"1836\":1,\"1837\":1,\"1854\":1,\"1855\":2,\"1858\":1,\"1891\":2,\"1892\":1,\"1895\":1,\"1896\":1,\"1982\":1,\"1983\":2,\"1985\":1,\"2051\":2,\"2052\":1,\"2055\":1,\"2056\":1,\"2073\":1,\"2074\":2,\"2077\":1,\"2110\":2,\"2111\":1,\"2114\":1,\"2115\":1,\"2201\":1,\"2202\":2,\"2204\":1,\"2270\":2,\"2271\":1,\"2274\":1,\"2275\":1,\"2292\":1,\"2293\":2,\"2296\":1}}],[\"false\",{\"1\":{\"383\":1,\"394\":1,\"395\":1,\"396\":1,\"402\":1,\"405\":1,\"423\":1,\"424\":1,\"431\":1,\"445\":1,\"446\":1,\"448\":1,\"473\":1,\"474\":1,\"490\":2,\"513\":1,\"514\":1,\"516\":1,\"534\":1,\"545\":1,\"546\":1,\"547\":1,\"553\":1,\"556\":1,\"574\":1,\"575\":1,\"582\":1,\"626\":1,\"627\":1,\"644\":2,\"652\":1,\"653\":1,\"655\":1,\"731\":1,\"732\":1,\"734\":1,\"752\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"772\":1,\"775\":1,\"792\":1,\"793\":1,\"800\":1,\"833\":1,\"834\":1,\"851\":2,\"859\":1,\"860\":1,\"862\":1,\"954\":1,\"955\":1,\"957\":1,\"975\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"995\":1,\"998\":1,\"1015\":1,\"1016\":1,\"1023\":1,\"1056\":1,\"1057\":1,\"1074\":2,\"1082\":1,\"1083\":1,\"1085\":1,\"1115\":1,\"1116\":1,\"1118\":1,\"1136\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1156\":1,\"1159\":1,\"1176\":1,\"1177\":1,\"1184\":1,\"1233\":1,\"1234\":1,\"1251\":2,\"1259\":1,\"1260\":1,\"1262\":1,\"1308\":1,\"1309\":1,\"1311\":1,\"1329\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1349\":1,\"1352\":1,\"1369\":1,\"1370\":1,\"1377\":1,\"1426\":1,\"1427\":1,\"1444\":2,\"1452\":1,\"1453\":1,\"1455\":1,\"1495\":1,\"1496\":1,\"1498\":1,\"1516\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1539\":1,\"1542\":1,\"1559\":1,\"1560\":1,\"1567\":1,\"1579\":2,\"1625\":1,\"1626\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1646\":2,\"1655\":1,\"1656\":1,\"1658\":1,\"1704\":1,\"1705\":1,\"1707\":1,\"1725\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1745\":1,\"1748\":1,\"1765\":1,\"1766\":1,\"1773\":1,\"1806\":1,\"1807\":1,\"1824\":2,\"1832\":1,\"1833\":1,\"1835\":1,\"1891\":1,\"1892\":1,\"1894\":1,\"1912\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1935\":1,\"1938\":1,\"1955\":1,\"1956\":1,\"1963\":1,\"1975\":2,\"2021\":1,\"2022\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2042\":2,\"2051\":1,\"2052\":1,\"2054\":1,\"2110\":1,\"2111\":1,\"2113\":1,\"2131\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2154\":1,\"2157\":1,\"2174\":1,\"2175\":1,\"2182\":1,\"2194\":2,\"2240\":1,\"2241\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2261\":2,\"2270\":1,\"2271\":1,\"2273\":1}}],[\"fall\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"falls\",{\"1\":{\"37\":1}}],[\"failure\",{\"1\":{\"168\":2,\"169\":1,\"192\":2,\"193\":1,\"228\":2,\"229\":1,\"258\":2,\"259\":1,\"288\":2,\"289\":1,\"334\":2,\"335\":1,\"380\":2,\"381\":1,\"725\":2,\"726\":1,\"948\":2,\"949\":1}}],[\"failed\",{\"1\":{\"61\":1}}],[\"faith\",{\"1\":{\"101\":1}}],[\"fast\",{\"1\":{\"73\":1}}],[\"facilitating\",{\"1\":{\"23\":1}}],[\"facilitate\",{\"1\":{\"21\":1}}],[\"familiar\",{\"1\":{\"7\":1}}],[\"fdpg\",{\"1\":{\"10\":2,\"31\":1,\"55\":1,\"88\":1}}],[\"fdpg+\",{\"1\":{\"10\":2,\"29\":1,\"103\":1}}],[\"fdgp+\",{\"1\":{\"10\":1}}],[\"full\",{\"1\":{\"802\":1,\"1025\":1,\"1186\":1,\"1379\":1,\"1569\":1,\"1775\":1,\"1965\":1,\"2184\":1}}],[\"fulfilled\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"future\",{\"1\":{\"81\":1,\"291\":1,\"301\":1,\"341\":1,\"351\":1,\"682\":1,\"692\":1,\"889\":1,\"899\":1}}],[\"function\",{\"1\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"functionality\",{\"1\":{\"66\":1,\"298\":1,\"305\":1,\"348\":1,\"355\":1,\"689\":1,\"696\":1,\"896\":1,\"903\":1}}],[\"funktionstests\",{\"1\":{\"31\":1}}],[\"funktionen\",{\"1\":{\"29\":2}}],[\"fundamental\",{\"1\":{\"80\":1,\"81\":1}}],[\"funding\",{\"0\":{\"9\":1},\"1\":{\"10\":3,\"11\":2,\"17\":1,\"62\":1}}],[\"funded\",{\"1\":{\"0\":1,\"12\":1,\"18\":1,\"21\":1,\"62\":1,\"80\":1,\"88\":1}}],[\"furthermore\",{\"1\":{\"60\":1}}],[\"further\",{\"1\":{\"10\":4,\"12\":1,\"28\":1,\"88\":1}}],[\"field\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"fields\",{\"1\":{\"15\":1}}],[\"fix\",{\"1\":{\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"fixing\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"figure\",{\"1\":{\"68\":1,\"92\":1}}],[\"fit\",{\"1\":{\"61\":1}}],[\"fits\",{\"1\":{\"61\":1}}],[\"fingerprint\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"610\":1,\"641\":1,\"717\":1,\"817\":1,\"848\":1,\"940\":1,\"1040\":1,\"1071\":1,\"1217\":1,\"1248\":1,\"1410\":1,\"1441\":1,\"1482\":1,\"1609\":1,\"1643\":1,\"1790\":1,\"1821\":1,\"1878\":1,\"2005\":1,\"2039\":1,\"2097\":1,\"2224\":1,\"2258\":1}}],[\"finally\",{\"1\":{\"81\":1}}],[\"final\",{\"1\":{\"58\":1}}],[\"findings\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"finden\",{\"1\":{\"32\":1}}],[\"find\",{\"1\":{\"7\":1,\"56\":1,\"57\":1,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"139\":1,\"162\":1,\"170\":1,\"186\":1,\"202\":1,\"208\":1,\"222\":1,\"238\":1,\"252\":1,\"268\":1,\"282\":1,\"294\":1,\"303\":1,\"305\":1,\"314\":1,\"328\":1,\"344\":1,\"353\":1,\"355\":1,\"360\":1,\"374\":1,\"685\":1,\"694\":1,\"696\":1,\"705\":1,\"719\":1,\"892\":1,\"901\":1,\"903\":1,\"929\":1,\"942\":1}}],[\"filters\",{\"1\":{\"63\":1}}],[\"filtering\",{\"1\":{\"0\":1}}],[\"files\",{\"1\":{\"137\":3,\"138\":3,\"139\":2,\"160\":3,\"161\":3,\"162\":2,\"167\":1,\"184\":3,\"185\":3,\"186\":2,\"191\":1,\"220\":3,\"221\":3,\"222\":2,\"226\":1,\"227\":1,\"250\":3,\"251\":3,\"252\":2,\"256\":1,\"257\":1,\"280\":3,\"281\":3,\"282\":2,\"286\":1,\"287\":1,\"302\":2,\"326\":3,\"327\":3,\"328\":2,\"332\":1,\"333\":1,\"352\":2,\"372\":3,\"373\":3,\"374\":2,\"378\":1,\"379\":1,\"486\":1,\"639\":1,\"693\":2,\"717\":3,\"718\":3,\"719\":2,\"723\":1,\"724\":1,\"846\":1,\"900\":2,\"940\":3,\"941\":3,\"942\":2,\"946\":1,\"947\":1,\"1069\":1,\"1246\":1,\"1439\":1,\"1641\":1,\"1819\":1,\"2037\":1,\"2256\":1}}],[\"file\",{\"0\":{\"385\":1,\"389\":1,\"392\":1,\"399\":1,\"415\":1,\"420\":1,\"426\":1,\"438\":1,\"453\":1,\"462\":1,\"469\":1,\"476\":1,\"480\":1,\"482\":1,\"492\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"521\":1,\"530\":1,\"536\":1,\"540\":1,\"543\":1,\"550\":1,\"566\":1,\"571\":1,\"577\":1,\"589\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"622\":1,\"629\":1,\"633\":1,\"635\":1,\"646\":1,\"660\":1,\"669\":1,\"739\":1,\"748\":1,\"754\":1,\"758\":1,\"761\":1,\"769\":1,\"784\":1,\"789\":1,\"795\":1,\"811\":1,\"829\":1,\"836\":1,\"840\":1,\"842\":1,\"853\":1,\"867\":1,\"876\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"962\":1,\"971\":1,\"977\":1,\"981\":1,\"984\":1,\"992\":1,\"1007\":1,\"1012\":1,\"1018\":1,\"1034\":1,\"1052\":1,\"1059\":1,\"1063\":1,\"1065\":1,\"1076\":1,\"1090\":1,\"1099\":1,\"1123\":1,\"1132\":1,\"1138\":1,\"1142\":1,\"1145\":1,\"1153\":1,\"1168\":1,\"1173\":1,\"1179\":1,\"1195\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1229\":1,\"1236\":1,\"1240\":1,\"1242\":1,\"1253\":1,\"1267\":1,\"1276\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1316\":1,\"1325\":1,\"1331\":1,\"1335\":1,\"1338\":1,\"1346\":1,\"1361\":1,\"1366\":1,\"1372\":1,\"1388\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1422\":1,\"1429\":1,\"1433\":1,\"1435\":1,\"1446\":1,\"1460\":1,\"1469\":1,\"1503\":1,\"1512\":1,\"1518\":1,\"1522\":1,\"1525\":1,\"1536\":1,\"1551\":1,\"1556\":1,\"1562\":1,\"1582\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1621\":1,\"1628\":1,\"1632\":1,\"1634\":1,\"1649\":1,\"1663\":1,\"1672\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1712\":1,\"1721\":1,\"1727\":1,\"1731\":1,\"1734\":1,\"1742\":1,\"1757\":1,\"1762\":1,\"1768\":1,\"1784\":1,\"1802\":1,\"1809\":1,\"1813\":1,\"1815\":1,\"1826\":1,\"1840\":1,\"1849\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1899\":1,\"1908\":1,\"1914\":1,\"1918\":1,\"1921\":1,\"1932\":1,\"1947\":1,\"1952\":1,\"1958\":1,\"1978\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2017\":1,\"2024\":1,\"2028\":1,\"2030\":1,\"2045\":1,\"2059\":1,\"2068\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2118\":1,\"2127\":1,\"2133\":1,\"2137\":1,\"2140\":1,\"2151\":1,\"2166\":1,\"2171\":1,\"2177\":1,\"2197\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2236\":1,\"2243\":1,\"2247\":1,\"2249\":1,\"2264\":1,\"2278\":1,\"2287\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1},\"1\":{\"54\":1,\"66\":1,\"99\":1,\"136\":4,\"137\":24,\"138\":8,\"159\":4,\"160\":23,\"161\":8,\"168\":1,\"169\":1,\"183\":4,\"184\":23,\"185\":8,\"192\":1,\"193\":3,\"219\":4,\"220\":23,\"221\":8,\"228\":1,\"229\":1,\"249\":4,\"250\":23,\"251\":8,\"258\":1,\"259\":1,\"279\":4,\"280\":23,\"281\":8,\"288\":1,\"289\":1,\"293\":2,\"325\":4,\"326\":23,\"327\":8,\"334\":1,\"335\":1,\"343\":2,\"371\":4,\"372\":23,\"373\":8,\"380\":1,\"381\":1,\"385\":2,\"389\":2,\"392\":2,\"397\":2,\"398\":3,\"399\":2,\"406\":2,\"413\":2,\"414\":3,\"415\":2,\"419\":1,\"420\":2,\"425\":2,\"426\":3,\"429\":2,\"438\":2,\"451\":2,\"452\":3,\"453\":2,\"456\":2,\"458\":2,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"467\":2,\"468\":3,\"469\":2,\"472\":2,\"476\":2,\"480\":2,\"482\":2,\"492\":2,\"504\":3,\"505\":4,\"506\":5,\"507\":3,\"508\":3,\"519\":2,\"520\":3,\"521\":2,\"524\":2,\"526\":2,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"536\":2,\"540\":2,\"543\":2,\"548\":2,\"549\":3,\"550\":2,\"557\":2,\"564\":2,\"565\":3,\"566\":2,\"570\":1,\"571\":2,\"576\":2,\"577\":3,\"580\":2,\"589\":2,\"601\":3,\"602\":4,\"603\":5,\"604\":3,\"605\":3,\"620\":2,\"621\":3,\"622\":2,\"625\":2,\"629\":2,\"633\":2,\"635\":2,\"646\":2,\"658\":2,\"659\":3,\"660\":2,\"663\":2,\"665\":2,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"677\":1,\"678\":1,\"684\":2,\"716\":4,\"717\":23,\"718\":8,\"725\":1,\"726\":1,\"737\":2,\"738\":3,\"739\":2,\"742\":2,\"744\":2,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"754\":2,\"758\":2,\"761\":2,\"767\":2,\"768\":3,\"769\":2,\"776\":2,\"782\":2,\"783\":3,\"784\":2,\"788\":1,\"789\":2,\"794\":2,\"795\":3,\"798\":2,\"811\":2,\"827\":2,\"828\":3,\"829\":2,\"832\":2,\"836\":2,\"840\":2,\"842\":2,\"853\":2,\"865\":2,\"866\":3,\"867\":2,\"870\":2,\"872\":2,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"884\":1,\"885\":1,\"891\":2,\"916\":3,\"917\":4,\"918\":5,\"919\":3,\"920\":3,\"929\":1,\"931\":4,\"939\":4,\"940\":23,\"941\":8,\"948\":1,\"949\":1,\"960\":2,\"961\":3,\"962\":2,\"965\":2,\"967\":2,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"977\":2,\"981\":2,\"984\":2,\"990\":2,\"991\":3,\"992\":2,\"999\":2,\"1005\":2,\"1006\":3,\"1007\":2,\"1011\":1,\"1012\":2,\"1017\":2,\"1018\":3,\"1021\":2,\"1034\":2,\"1050\":2,\"1051\":3,\"1052\":2,\"1055\":2,\"1059\":2,\"1063\":2,\"1065\":2,\"1076\":2,\"1088\":2,\"1089\":3,\"1090\":2,\"1093\":2,\"1095\":2,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1107\":1,\"1108\":1,\"1121\":2,\"1122\":3,\"1123\":2,\"1126\":2,\"1128\":2,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1138\":2,\"1142\":2,\"1145\":2,\"1151\":2,\"1152\":3,\"1153\":2,\"1160\":2,\"1166\":2,\"1167\":3,\"1168\":2,\"1172\":1,\"1173\":2,\"1178\":2,\"1179\":3,\"1182\":2,\"1195\":2,\"1208\":3,\"1209\":4,\"1210\":5,\"1211\":3,\"1212\":3,\"1227\":2,\"1228\":3,\"1229\":2,\"1232\":2,\"1236\":2,\"1240\":2,\"1242\":2,\"1253\":2,\"1265\":2,\"1266\":3,\"1267\":2,\"1270\":2,\"1272\":2,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1284\":1,\"1285\":1,\"1296\":3,\"1297\":4,\"1298\":5,\"1299\":3,\"1300\":3,\"1314\":2,\"1315\":3,\"1316\":2,\"1319\":2,\"1321\":2,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1331\":2,\"1335\":2,\"1338\":2,\"1344\":2,\"1345\":3,\"1346\":2,\"1353\":2,\"1359\":2,\"1360\":3,\"1361\":2,\"1365\":1,\"1366\":2,\"1371\":2,\"1372\":3,\"1375\":2,\"1388\":2,\"1401\":3,\"1402\":4,\"1403\":5,\"1404\":3,\"1405\":3,\"1420\":2,\"1421\":3,\"1422\":2,\"1425\":2,\"1429\":2,\"1433\":2,\"1435\":2,\"1446\":2,\"1458\":2,\"1459\":3,\"1460\":2,\"1463\":2,\"1465\":2,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1477\":1,\"1478\":1,\"1501\":2,\"1502\":3,\"1503\":2,\"1506\":2,\"1508\":2,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1518\":2,\"1522\":2,\"1525\":2,\"1534\":2,\"1535\":3,\"1536\":2,\"1543\":2,\"1549\":2,\"1550\":3,\"1551\":2,\"1555\":1,\"1556\":2,\"1561\":2,\"1562\":3,\"1565\":2,\"1582\":2,\"1588\":1,\"1589\":1,\"1600\":3,\"1601\":4,\"1602\":5,\"1603\":3,\"1604\":3,\"1619\":2,\"1620\":3,\"1621\":2,\"1624\":2,\"1628\":2,\"1632\":2,\"1634\":2,\"1649\":2,\"1661\":2,\"1662\":3,\"1663\":2,\"1666\":2,\"1668\":2,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1680\":1,\"1681\":1,\"1692\":3,\"1693\":4,\"1694\":5,\"1695\":3,\"1696\":3,\"1710\":2,\"1711\":3,\"1712\":2,\"1715\":2,\"1717\":2,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1727\":2,\"1731\":2,\"1734\":2,\"1740\":2,\"1741\":3,\"1742\":2,\"1749\":2,\"1755\":2,\"1756\":3,\"1757\":2,\"1761\":1,\"1762\":2,\"1767\":2,\"1768\":3,\"1771\":2,\"1784\":2,\"1800\":2,\"1801\":3,\"1802\":2,\"1805\":2,\"1809\":2,\"1813\":2,\"1815\":2,\"1826\":2,\"1838\":2,\"1839\":3,\"1840\":2,\"1843\":2,\"1845\":2,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1857\":1,\"1858\":1,\"1869\":3,\"1870\":4,\"1871\":5,\"1872\":3,\"1873\":3,\"1897\":2,\"1898\":3,\"1899\":2,\"1902\":2,\"1904\":2,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1914\":2,\"1918\":2,\"1921\":2,\"1930\":2,\"1931\":3,\"1932\":2,\"1939\":2,\"1945\":2,\"1946\":3,\"1947\":2,\"1951\":1,\"1952\":2,\"1957\":2,\"1958\":3,\"1961\":2,\"1978\":2,\"1984\":1,\"1985\":1,\"1996\":3,\"1997\":4,\"1998\":5,\"1999\":3,\"2000\":3,\"2015\":2,\"2016\":3,\"2017\":2,\"2020\":2,\"2024\":2,\"2028\":2,\"2030\":2,\"2045\":2,\"2057\":2,\"2058\":3,\"2059\":2,\"2062\":2,\"2064\":2,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2076\":1,\"2077\":1,\"2088\":3,\"2089\":4,\"2090\":5,\"2091\":3,\"2092\":3,\"2116\":2,\"2117\":3,\"2118\":2,\"2121\":2,\"2123\":2,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2133\":2,\"2137\":2,\"2140\":2,\"2149\":2,\"2150\":3,\"2151\":2,\"2158\":2,\"2164\":2,\"2165\":3,\"2166\":2,\"2170\":1,\"2171\":2,\"2176\":2,\"2177\":3,\"2180\":2,\"2197\":2,\"2203\":1,\"2204\":1,\"2215\":3,\"2216\":4,\"2217\":5,\"2218\":3,\"2219\":3,\"2234\":2,\"2235\":3,\"2236\":2,\"2239\":2,\"2243\":2,\"2247\":2,\"2249\":2,\"2264\":2,\"2276\":2,\"2277\":3,\"2278\":2,\"2281\":2,\"2283\":2,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2295\":1,\"2296\":1,\"2307\":3,\"2308\":4,\"2309\":5,\"2310\":3,\"2311\":3}}],[\"firewall\",{\"1\":{\"95\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"firewallregeln\",{\"1\":{\"31\":1}}],[\"first\",{\"1\":{\"49\":1,\"63\":1,\"227\":2,\"257\":2,\"287\":2,\"294\":1,\"333\":2,\"344\":1,\"379\":2,\"618\":2,\"685\":1,\"724\":2,\"825\":2,\"892\":1,\"947\":2,\"1048\":2,\"1225\":2,\"1418\":2,\"1490\":2,\"1617\":2,\"1798\":2,\"1886\":2,\"2013\":2,\"2105\":2,\"2232\":2}}],[\"fowler\",{\"1\":{\"301\":3,\"351\":3,\"692\":3,\"899\":3}}],[\"foster\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"footer\",{\"1\":{\"419\":1,\"570\":1,\"788\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1}}],[\"foo\",{\"1\":{\"137\":4,\"138\":2,\"160\":4,\"161\":2,\"184\":4,\"185\":2,\"220\":4,\"221\":2,\"250\":4,\"251\":2,\"280\":4,\"281\":2,\"326\":4,\"327\":2,\"372\":4,\"373\":2,\"408\":1,\"437\":1,\"439\":1,\"485\":1,\"491\":1,\"493\":1,\"559\":1,\"588\":1,\"590\":1,\"638\":1,\"645\":1,\"647\":1,\"717\":4,\"718\":2,\"778\":1,\"810\":1,\"812\":1,\"845\":1,\"852\":1,\"854\":1,\"940\":4,\"941\":2,\"1001\":1,\"1033\":1,\"1035\":1,\"1068\":1,\"1075\":1,\"1077\":1,\"1162\":1,\"1194\":1,\"1196\":1,\"1245\":1,\"1252\":1,\"1254\":1,\"1355\":1,\"1387\":1,\"1389\":1,\"1438\":1,\"1445\":1,\"1447\":1,\"1545\":1,\"1577\":1,\"1581\":1,\"1583\":1,\"1640\":1,\"1648\":1,\"1650\":1,\"1751\":1,\"1783\":1,\"1785\":1,\"1818\":1,\"1825\":1,\"1827\":1,\"1941\":1,\"1973\":1,\"1977\":1,\"1979\":1,\"2036\":1,\"2044\":1,\"2046\":1,\"2160\":1,\"2192\":1,\"2196\":1,\"2198\":1,\"2255\":1,\"2263\":1,\"2265\":1}}],[\"folders\",{\"1\":{\"138\":1,\"143\":1,\"161\":1,\"166\":1,\"185\":1,\"190\":1,\"221\":1,\"226\":1,\"251\":1,\"256\":1,\"281\":1,\"286\":1,\"327\":1,\"332\":1,\"373\":1,\"378\":1,\"718\":1,\"723\":1,\"941\":1,\"946\":1}}],[\"folder\",{\"1\":{\"137\":2,\"138\":1,\"160\":2,\"161\":1,\"184\":2,\"185\":1,\"220\":2,\"221\":1,\"250\":2,\"251\":1,\"280\":2,\"281\":1,\"326\":2,\"327\":1,\"372\":2,\"373\":1,\"717\":2,\"718\":1,\"931\":1,\"940\":2,\"941\":1}}],[\"following\",{\"1\":{\"52\":1,\"61\":2,\"67\":1,\"68\":1,\"69\":1,\"70\":1,\"71\":1,\"92\":1,\"99\":1,\"129\":1,\"137\":2,\"138\":1,\"139\":1,\"143\":1,\"152\":1,\"160\":2,\"161\":1,\"162\":1,\"166\":1,\"176\":1,\"184\":2,\"185\":1,\"186\":1,\"190\":1,\"212\":1,\"220\":2,\"221\":1,\"222\":1,\"226\":1,\"242\":1,\"250\":2,\"251\":1,\"252\":1,\"256\":1,\"272\":1,\"280\":2,\"281\":1,\"282\":1,\"286\":1,\"294\":1,\"295\":1,\"299\":1,\"302\":1,\"318\":1,\"326\":2,\"327\":1,\"328\":1,\"332\":1,\"344\":1,\"345\":1,\"349\":1,\"352\":1,\"364\":1,\"372\":2,\"373\":1,\"374\":1,\"378\":1,\"675\":1,\"676\":1,\"685\":1,\"686\":1,\"690\":1,\"693\":1,\"709\":1,\"717\":2,\"718\":1,\"719\":1,\"723\":1,\"882\":1,\"883\":1,\"892\":1,\"893\":1,\"897\":1,\"900\":1,\"932\":1,\"940\":2,\"941\":1,\"942\":1,\"946\":1,\"1105\":1,\"1106\":1,\"1282\":1,\"1283\":1,\"1475\":1,\"1476\":1,\"1587\":1,\"1678\":1,\"1679\":1,\"1855\":1,\"1856\":1,\"1983\":1,\"2074\":1,\"2075\":1,\"2202\":1,\"2293\":1,\"2294\":1}}],[\"follows\",{\"1\":{\"7\":1}}],[\"follow\",{\"1\":{\"6\":1,\"15\":1,\"98\":1,\"126\":1,\"149\":1,\"167\":1,\"173\":1,\"191\":1,\"205\":1,\"227\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"found\",{\"1\":{\"64\":1,\"73\":1,\"74\":1,\"88\":1,\"92\":1,\"99\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"313\":1,\"329\":1,\"359\":1,\"375\":1,\"704\":1,\"720\":1,\"927\":1,\"930\":1,\"943\":1,\"2315\":1}}],[\"founded\",{\"1\":{\"62\":1}}],[\"foundational\",{\"1\":{\"58\":1}}],[\"four\",{\"1\":{\"58\":1}}],[\"focus\",{\"1\":{\"14\":1}}],[\"focusing\",{\"1\":{\"10\":1}}],[\"focuses\",{\"1\":{\"10\":1}}],[\"forward\",{\"1\":{\"437\":1,\"438\":1,\"439\":2,\"440\":1,\"491\":1,\"492\":1,\"493\":2,\"494\":1,\"588\":1,\"589\":1,\"590\":2,\"591\":1,\"645\":1,\"646\":1,\"647\":2,\"648\":1,\"810\":1,\"811\":1,\"812\":2,\"813\":1,\"852\":1,\"853\":1,\"854\":2,\"855\":1,\"1033\":1,\"1034\":1,\"1035\":2,\"1036\":1,\"1075\":1,\"1076\":1,\"1077\":2,\"1078\":1,\"1194\":1,\"1195\":1,\"1196\":2,\"1197\":1,\"1252\":1,\"1253\":1,\"1254\":2,\"1255\":1,\"1387\":1,\"1388\":1,\"1389\":2,\"1390\":1,\"1445\":1,\"1446\":1,\"1447\":2,\"1448\":1,\"1581\":1,\"1582\":1,\"1583\":2,\"1584\":1,\"1648\":1,\"1649\":1,\"1650\":2,\"1651\":1,\"1783\":1,\"1784\":1,\"1785\":2,\"1786\":1,\"1825\":1,\"1826\":1,\"1827\":2,\"1828\":1,\"1977\":1,\"1978\":1,\"1979\":2,\"1980\":1,\"2044\":1,\"2045\":1,\"2046\":2,\"2047\":1,\"2196\":1,\"2197\":1,\"2198\":2,\"2199\":1,\"2263\":1,\"2264\":1,\"2265\":2,\"2266\":1}}],[\"force\",{\"1\":{\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"752\":1,\"834\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1}}],[\"forceunlock\",{\"0\":{\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"752\":1,\"834\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1},\"1\":{\"383\":1,\"474\":1,\"534\":1,\"627\":1,\"752\":1,\"834\":1,\"975\":1,\"1057\":1,\"1136\":1,\"1234\":1,\"1329\":1,\"1427\":1,\"1516\":1,\"1626\":1,\"1725\":1,\"1807\":1,\"1912\":1,\"2022\":1,\"2131\":1,\"2241\":1}}],[\"fork\",{\"1\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"forschungsdaten\",{\"1\":{\"88\":1}}],[\"forschungsdatenportal\",{\"1\":{\"55\":1}}],[\"formalities\",{\"1\":{\"67\":1}}],[\"formatted\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"formatter\",{\"1\":{\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"format\",{\"1\":{\"58\":1,\"88\":1,\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"formats\",{\"1\":{\"24\":1,\"58\":1,\"59\":1}}],[\"forms\",{\"1\":{\"60\":1}}],[\"form\",{\"1\":{\"32\":1,\"305\":1,\"355\":1,\"610\":1,\"617\":1,\"696\":1,\"817\":1,\"824\":1,\"903\":1,\"1040\":1,\"1047\":1,\"1217\":1,\"1224\":1,\"1410\":1,\"1417\":1,\"1482\":1,\"1609\":1,\"1616\":1,\"1790\":1,\"1797\":1,\"1878\":1,\"2005\":1,\"2012\":1,\"2097\":1,\"2224\":1,\"2231\":1}}],[\"former\",{\"1\":{\"1\":1}}],[\"for\",{\"0\":{\"20\":1},\"1\":{\"0\":1,\"1\":3,\"7\":1,\"8\":1,\"10\":2,\"12\":1,\"20\":1,\"21\":1,\"24\":1,\"27\":1,\"35\":3,\"39\":1,\"42\":1,\"52\":3,\"53\":2,\"54\":1,\"55\":2,\"58\":2,\"59\":5,\"60\":2,\"61\":2,\"62\":7,\"63\":12,\"64\":1,\"66\":2,\"68\":1,\"73\":2,\"74\":2,\"80\":2,\"81\":6,\"82\":2,\"83\":1,\"84\":2,\"89\":3,\"91\":1,\"92\":1,\"99\":1,\"101\":1,\"126\":5,\"127\":1,\"128\":1,\"129\":3,\"132\":1,\"134\":1,\"137\":5,\"138\":2,\"140\":2,\"143\":1,\"149\":5,\"150\":1,\"151\":1,\"152\":3,\"155\":1,\"157\":1,\"160\":6,\"161\":2,\"163\":2,\"166\":1,\"168\":1,\"169\":2,\"173\":5,\"174\":1,\"175\":1,\"176\":3,\"179\":1,\"181\":1,\"184\":6,\"185\":2,\"187\":2,\"190\":1,\"192\":3,\"193\":3,\"205\":3,\"206\":1,\"207\":4,\"212\":2,\"215\":1,\"217\":1,\"220\":6,\"221\":2,\"223\":2,\"226\":4,\"228\":1,\"229\":2,\"235\":2,\"236\":1,\"237\":4,\"242\":2,\"245\":1,\"247\":1,\"250\":6,\"251\":2,\"253\":2,\"256\":4,\"258\":1,\"259\":2,\"265\":2,\"266\":1,\"267\":4,\"272\":2,\"275\":1,\"277\":1,\"280\":6,\"281\":2,\"283\":2,\"286\":4,\"288\":1,\"289\":2,\"290\":1,\"293\":1,\"299\":1,\"301\":7,\"302\":2,\"303\":2,\"304\":1,\"305\":12,\"311\":2,\"312\":1,\"313\":4,\"318\":2,\"321\":1,\"323\":1,\"326\":6,\"327\":2,\"329\":2,\"332\":4,\"334\":1,\"335\":2,\"340\":1,\"343\":1,\"349\":1,\"351\":7,\"352\":2,\"353\":2,\"354\":1,\"355\":12,\"357\":2,\"358\":1,\"359\":4,\"364\":2,\"367\":1,\"369\":1,\"372\":6,\"373\":2,\"375\":2,\"378\":4,\"380\":1,\"381\":2,\"382\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"406\":1,\"423\":1,\"435\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"459\":2,\"460\":2,\"461\":2,\"462\":2,\"463\":1,\"466\":1,\"467\":1,\"472\":1,\"478\":1,\"481\":1,\"482\":1,\"483\":1,\"490\":1,\"500\":2,\"501\":2,\"502\":2,\"503\":2,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"527\":2,\"528\":2,\"529\":2,\"530\":2,\"531\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"557\":1,\"574\":1,\"586\":1,\"597\":2,\"598\":2,\"599\":2,\"600\":2,\"610\":6,\"620\":1,\"625\":1,\"631\":1,\"634\":1,\"635\":1,\"636\":1,\"644\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"666\":2,\"667\":2,\"668\":2,\"669\":2,\"670\":1,\"674\":3,\"677\":2,\"681\":1,\"684\":1,\"690\":1,\"692\":7,\"693\":2,\"694\":2,\"695\":1,\"696\":12,\"702\":2,\"703\":1,\"704\":4,\"709\":2,\"712\":1,\"714\":1,\"717\":6,\"718\":2,\"720\":2,\"723\":4,\"725\":1,\"726\":2,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"745\":2,\"746\":2,\"747\":2,\"748\":2,\"749\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"776\":1,\"792\":1,\"807\":1,\"817\":6,\"827\":1,\"832\":1,\"838\":1,\"841\":1,\"842\":1,\"843\":1,\"851\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"873\":2,\"874\":2,\"875\":2,\"876\":2,\"877\":1,\"881\":3,\"884\":2,\"888\":1,\"891\":1,\"897\":1,\"899\":7,\"900\":2,\"901\":2,\"902\":1,\"903\":12,\"911\":2,\"912\":2,\"913\":2,\"914\":2,\"925\":2,\"926\":1,\"927\":4,\"928\":1,\"929\":3,\"931\":3,\"932\":2,\"935\":1,\"937\":1,\"940\":6,\"941\":2,\"943\":2,\"946\":4,\"948\":1,\"949\":2,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"968\":2,\"969\":2,\"970\":2,\"971\":2,\"972\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"999\":1,\"1015\":1,\"1030\":1,\"1040\":6,\"1050\":1,\"1055\":1,\"1061\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1074\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1096\":2,\"1097\":2,\"1098\":2,\"1099\":2,\"1100\":1,\"1104\":3,\"1107\":2,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1129\":2,\"1130\":2,\"1131\":2,\"1132\":2,\"1133\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1160\":1,\"1176\":1,\"1191\":1,\"1203\":2,\"1204\":2,\"1205\":2,\"1206\":2,\"1217\":6,\"1227\":1,\"1232\":1,\"1238\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1251\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1273\":2,\"1274\":2,\"1275\":2,\"1276\":2,\"1277\":1,\"1281\":3,\"1284\":2,\"1291\":2,\"1292\":2,\"1293\":2,\"1294\":2,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1322\":2,\"1323\":2,\"1324\":2,\"1325\":2,\"1326\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1353\":1,\"1369\":1,\"1384\":1,\"1396\":2,\"1397\":2,\"1398\":2,\"1399\":2,\"1410\":6,\"1420\":1,\"1425\":1,\"1431\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1444\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1466\":2,\"1467\":2,\"1468\":2,\"1469\":2,\"1470\":1,\"1474\":3,\"1477\":2,\"1482\":7,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1509\":2,\"1510\":2,\"1511\":2,\"1512\":2,\"1513\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1534\":1,\"1543\":1,\"1559\":1,\"1574\":1,\"1579\":1,\"1586\":2,\"1588\":2,\"1595\":2,\"1596\":2,\"1597\":2,\"1598\":2,\"1609\":7,\"1619\":1,\"1624\":1,\"1630\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1646\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1669\":2,\"1670\":2,\"1671\":2,\"1672\":2,\"1673\":1,\"1677\":3,\"1680\":2,\"1687\":2,\"1688\":2,\"1689\":2,\"1690\":2,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1718\":2,\"1719\":2,\"1720\":2,\"1721\":2,\"1722\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1749\":1,\"1765\":1,\"1780\":1,\"1790\":6,\"1800\":1,\"1805\":1,\"1811\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1824\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1846\":2,\"1847\":2,\"1848\":2,\"1849\":2,\"1850\":1,\"1854\":3,\"1857\":2,\"1864\":2,\"1865\":2,\"1866\":2,\"1867\":2,\"1878\":7,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1905\":2,\"1906\":2,\"1907\":2,\"1908\":2,\"1909\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1930\":1,\"1939\":1,\"1955\":1,\"1970\":1,\"1975\":1,\"1982\":2,\"1984\":2,\"1991\":2,\"1992\":2,\"1993\":2,\"1994\":2,\"2005\":7,\"2015\":1,\"2020\":1,\"2026\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2042\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2065\":2,\"2066\":2,\"2067\":2,\"2068\":2,\"2069\":1,\"2073\":3,\"2076\":2,\"2083\":2,\"2084\":2,\"2085\":2,\"2086\":2,\"2097\":7,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2124\":2,\"2125\":2,\"2126\":2,\"2127\":2,\"2128\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2149\":1,\"2158\":1,\"2174\":1,\"2189\":1,\"2194\":1,\"2201\":2,\"2203\":2,\"2210\":2,\"2211\":2,\"2212\":2,\"2213\":2,\"2224\":7,\"2234\":1,\"2239\":1,\"2245\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2261\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2284\":2,\"2285\":2,\"2286\":2,\"2287\":2,\"2288\":1,\"2292\":3,\"2295\":2,\"2302\":2,\"2303\":2,\"2304\":2,\"2305\":2}}],[\"friendly\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"fragen\",{\"1\":{\"37\":1}}],[\"framework\",{\"0\":{\"0\":1,\"10\":1},\"1\":{\"0\":1,\"1\":1,\"12\":1,\"21\":1,\"39\":3,\"41\":1,\"42\":1,\"52\":1,\"62\":1,\"63\":1,\"73\":1,\"80\":1,\"81\":2,\"92\":1,\"102\":1,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"170\":2,\"202\":2,\"290\":2,\"302\":1,\"303\":2,\"340\":2,\"352\":1,\"353\":2,\"681\":2,\"693\":1,\"694\":2,\"888\":2,\"900\":1,\"901\":2}}],[\"frequently\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"freigaben\",{\"1\":{\"31\":1}}],[\"freigabe\",{\"1\":{\"31\":2}}],[\"free\",{\"1\":{\"4\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"300\":1,\"303\":1,\"313\":1,\"329\":1,\"350\":1,\"353\":1,\"359\":1,\"375\":1,\"691\":1,\"694\":1,\"704\":1,\"720\":1,\"898\":1,\"901\":1,\"927\":1,\"943\":1}}],[\"fromaddress\",{\"0\":{\"416\":1,\"567\":1,\"785\":1,\"1008\":1,\"1169\":1,\"1362\":1,\"1552\":1,\"1758\":1,\"1948\":1,\"2167\":1},\"1\":{\"416\":1,\"567\":1,\"785\":1,\"1008\":1,\"1169\":1,\"1362\":1,\"1552\":1,\"1758\":1,\"1948\":1,\"2167\":1}}],[\"from\",{\"0\":{\"122\":1,\"143\":1,\"147\":1,\"166\":1,\"167\":1,\"190\":1,\"191\":1,\"197\":1,\"201\":1,\"226\":1,\"227\":1,\"233\":1,\"256\":1,\"257\":1,\"263\":1,\"286\":1,\"287\":1,\"309\":1,\"332\":1,\"333\":1,\"339\":1,\"378\":1,\"379\":1,\"700\":1,\"723\":1,\"724\":1,\"907\":1,\"946\":1,\"947\":1},\"1\":{\"10\":3,\"41\":1,\"52\":1,\"55\":1,\"58\":1,\"62\":2,\"63\":1,\"70\":1,\"71\":1,\"73\":1,\"76\":2,\"77\":1,\"80\":1,\"81\":2,\"84\":1,\"89\":2,\"90\":1,\"92\":1,\"105\":2,\"107\":3,\"109\":3,\"111\":3,\"113\":3,\"115\":3,\"117\":3,\"121\":1,\"123\":3,\"126\":1,\"127\":2,\"133\":1,\"137\":3,\"138\":3,\"139\":1,\"142\":1,\"143\":3,\"146\":1,\"149\":1,\"150\":2,\"156\":1,\"160\":2,\"161\":3,\"162\":1,\"165\":1,\"166\":3,\"167\":3,\"168\":1,\"169\":1,\"170\":3,\"173\":1,\"174\":2,\"180\":1,\"184\":2,\"185\":3,\"186\":1,\"189\":1,\"190\":3,\"191\":3,\"192\":1,\"193\":1,\"196\":1,\"200\":1,\"202\":3,\"205\":1,\"206\":2,\"216\":1,\"220\":2,\"221\":3,\"222\":1,\"225\":1,\"226\":2,\"227\":4,\"228\":1,\"229\":1,\"232\":1,\"235\":1,\"236\":2,\"246\":1,\"250\":2,\"251\":3,\"252\":1,\"255\":1,\"256\":2,\"257\":2,\"258\":1,\"259\":1,\"262\":1,\"265\":1,\"266\":2,\"276\":1,\"280\":2,\"281\":3,\"282\":1,\"285\":1,\"286\":2,\"287\":2,\"288\":1,\"289\":1,\"305\":1,\"308\":1,\"311\":1,\"312\":2,\"322\":1,\"326\":2,\"327\":3,\"328\":1,\"331\":1,\"332\":2,\"333\":2,\"334\":1,\"335\":1,\"338\":1,\"355\":1,\"357\":1,\"358\":2,\"368\":1,\"372\":2,\"373\":3,\"374\":1,\"377\":1,\"378\":2,\"379\":2,\"380\":1,\"381\":1,\"385\":1,\"386\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"401\":1,\"402\":1,\"404\":1,\"405\":1,\"407\":1,\"412\":1,\"432\":1,\"435\":1,\"444\":1,\"458\":1,\"471\":1,\"473\":1,\"476\":1,\"477\":1,\"478\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"486\":2,\"505\":1,\"512\":1,\"526\":1,\"536\":1,\"537\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"552\":1,\"553\":1,\"555\":1,\"556\":1,\"558\":1,\"563\":1,\"583\":1,\"586\":1,\"602\":1,\"612\":1,\"613\":1,\"617\":1,\"618\":1,\"624\":1,\"626\":1,\"629\":1,\"630\":1,\"631\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"639\":2,\"651\":1,\"665\":1,\"696\":1,\"699\":1,\"702\":1,\"703\":2,\"713\":1,\"717\":2,\"718\":3,\"719\":1,\"722\":1,\"723\":2,\"724\":2,\"725\":1,\"726\":1,\"730\":1,\"744\":1,\"754\":1,\"755\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"771\":1,\"772\":1,\"774\":1,\"775\":1,\"777\":1,\"781\":1,\"804\":1,\"807\":1,\"819\":1,\"820\":1,\"824\":1,\"825\":1,\"831\":1,\"833\":1,\"836\":1,\"837\":1,\"838\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"846\":2,\"858\":1,\"872\":1,\"903\":1,\"906\":1,\"917\":1,\"925\":1,\"926\":2,\"936\":1,\"940\":2,\"941\":3,\"942\":1,\"945\":1,\"946\":2,\"947\":2,\"948\":1,\"949\":1,\"953\":1,\"967\":1,\"977\":1,\"978\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"994\":1,\"995\":1,\"997\":1,\"998\":1,\"1000\":1,\"1004\":1,\"1027\":1,\"1030\":1,\"1042\":1,\"1043\":1,\"1047\":1,\"1048\":1,\"1054\":1,\"1056\":1,\"1059\":1,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1069\":2,\"1081\":1,\"1095\":1,\"1114\":1,\"1128\":1,\"1138\":1,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1155\":1,\"1156\":1,\"1158\":1,\"1159\":1,\"1161\":1,\"1165\":1,\"1188\":1,\"1191\":1,\"1209\":1,\"1219\":1,\"1220\":1,\"1224\":1,\"1225\":1,\"1231\":1,\"1233\":1,\"1236\":1,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1246\":2,\"1258\":1,\"1272\":1,\"1297\":1,\"1307\":1,\"1321\":1,\"1331\":1,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1348\":1,\"1349\":1,\"1351\":1,\"1352\":1,\"1354\":1,\"1358\":1,\"1381\":1,\"1384\":1,\"1402\":1,\"1412\":1,\"1413\":1,\"1417\":1,\"1418\":1,\"1424\":1,\"1426\":1,\"1429\":1,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1439\":2,\"1451\":1,\"1465\":1,\"1484\":1,\"1485\":1,\"1490\":1,\"1494\":1,\"1508\":1,\"1518\":1,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1538\":1,\"1539\":1,\"1541\":1,\"1542\":1,\"1544\":1,\"1548\":1,\"1571\":1,\"1574\":1,\"1601\":1,\"1611\":1,\"1612\":1,\"1616\":1,\"1617\":1,\"1623\":1,\"1625\":1,\"1628\":1,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1641\":2,\"1654\":1,\"1668\":1,\"1693\":1,\"1703\":1,\"1717\":1,\"1727\":1,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1744\":1,\"1745\":1,\"1747\":1,\"1748\":1,\"1750\":1,\"1754\":1,\"1777\":1,\"1780\":1,\"1792\":1,\"1793\":1,\"1797\":1,\"1798\":1,\"1804\":1,\"1806\":1,\"1809\":1,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1819\":2,\"1831\":1,\"1845\":1,\"1870\":1,\"1880\":1,\"1881\":1,\"1886\":1,\"1890\":1,\"1904\":1,\"1914\":1,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"1934\":1,\"1935\":1,\"1937\":1,\"1938\":1,\"1940\":1,\"1944\":1,\"1967\":1,\"1970\":1,\"1997\":1,\"2007\":1,\"2008\":1,\"2012\":1,\"2013\":1,\"2019\":1,\"2021\":1,\"2024\":1,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2037\":2,\"2050\":1,\"2064\":1,\"2089\":1,\"2099\":1,\"2100\":1,\"2105\":1,\"2109\":1,\"2123\":1,\"2133\":1,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2153\":1,\"2154\":1,\"2156\":1,\"2157\":1,\"2159\":1,\"2163\":1,\"2186\":1,\"2189\":1,\"2216\":1,\"2226\":1,\"2227\":1,\"2231\":1,\"2232\":1,\"2238\":1,\"2240\":1,\"2243\":1,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1,\"2256\":2,\"2269\":1,\"2283\":1,\"2308\":1}}],[\"fellow\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"feedback\",{\"1\":{\"81\":1,\"300\":1,\"301\":1,\"303\":1,\"305\":4,\"350\":1,\"351\":1,\"353\":1,\"355\":4,\"691\":1,\"692\":1,\"694\":1,\"696\":4,\"898\":1,\"899\":1,\"901\":1,\"903\":4}}],[\"feeling\",{\"1\":{\"303\":1,\"353\":1,\"694\":1,\"901\":1}}],[\"feel\",{\"1\":{\"4\":1,\"128\":1,\"140\":1,\"151\":1,\"163\":1,\"175\":1,\"187\":1,\"207\":1,\"223\":1,\"237\":1,\"253\":1,\"267\":1,\"283\":1,\"300\":2,\"303\":1,\"313\":1,\"329\":1,\"350\":2,\"353\":1,\"359\":1,\"375\":1,\"691\":2,\"694\":1,\"704\":1,\"720\":1,\"898\":2,\"901\":1,\"927\":1,\"943\":1}}],[\"fegeler\",{\"1\":{\"13\":1,\"18\":1,\"39\":9}}],[\"features\",{\"0\":{\"22\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1},\"1\":{\"106\":2,\"108\":2,\"110\":2,\"112\":2,\"114\":2,\"116\":2,\"118\":2,\"124\":2,\"171\":2,\"203\":2,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"feature\",{\"1\":{\"8\":1,\"300\":1,\"305\":5,\"350\":1,\"355\":5,\"691\":1,\"696\":5,\"898\":1,\"903\":5}}],[\"feasibility\",{\"0\":{\"87\":1,\"89\":1},\"1\":{\"0\":1,\"23\":1,\"29\":1,\"32\":1,\"35\":1,\"39\":2,\"42\":1,\"62\":1,\"66\":2,\"81\":1,\"88\":2,\"89\":2,\"90\":8,\"94\":1,\"210\":2,\"240\":2,\"270\":2,\"316\":2,\"362\":2,\"707\":2,\"929\":1}}],[\"federated\",{\"1\":{\"39\":1,\"42\":1,\"62\":2}}],[\"federation\",{\"1\":{\"1\":1}}],[\"federal\",{\"1\":{\"0\":1,\"21\":1,\"62\":2,\"80\":1,\"88\":1}}],[\"fhir\",{\"0\":{\"32\":1,\"53\":1,\"59\":1,\"61\":1,\"76\":1,\"137\":1,\"160\":1,\"168\":1,\"184\":1,\"192\":1,\"220\":1,\"228\":1,\"250\":1,\"258\":1,\"280\":1,\"288\":1,\"326\":1,\"334\":1,\"372\":1,\"380\":1,\"397\":1,\"398\":1,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"433\":1,\"434\":1,\"466\":1,\"467\":1,\"468\":1,\"469\":2,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"497\":1,\"548\":1,\"549\":1,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"584\":1,\"585\":1,\"607\":1,\"620\":1,\"621\":1,\"622\":2,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"679\":1,\"717\":1,\"725\":1,\"767\":1,\"768\":1,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"805\":1,\"806\":1,\"827\":1,\"828\":1,\"829\":2,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"886\":1,\"922\":1,\"940\":1,\"948\":1,\"990\":1,\"991\":1,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1028\":1,\"1029\":1,\"1050\":1,\"1051\":1,\"1052\":2,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1109\":1,\"1151\":1,\"1152\":1,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1189\":1,\"1190\":1,\"1214\":1,\"1227\":1,\"1228\":1,\"1229\":2,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1286\":1,\"1302\":1,\"1344\":1,\"1345\":1,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1382\":1,\"1383\":1,\"1407\":1,\"1420\":1,\"1421\":1,\"1422\":2,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1479\":1,\"1534\":1,\"1535\":1,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1572\":1,\"1573\":1,\"1619\":1,\"1620\":1,\"1621\":2,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1682\":1,\"1698\":1,\"1740\":1,\"1741\":1,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1778\":1,\"1779\":1,\"1800\":1,\"1801\":1,\"1802\":2,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1859\":1,\"1875\":1,\"1930\":1,\"1931\":1,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1968\":1,\"1969\":1,\"2015\":1,\"2016\":1,\"2017\":2,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2078\":1,\"2094\":1,\"2149\":1,\"2150\":1,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2187\":1,\"2188\":1,\"2234\":1,\"2235\":1,\"2236\":2,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2297\":1,\"2313\":1},\"1\":{\"0\":2,\"20\":1,\"21\":1,\"23\":1,\"24\":1,\"31\":1,\"32\":6,\"37\":1,\"49\":1,\"52\":3,\"53\":3,\"54\":7,\"57\":2,\"58\":1,\"59\":5,\"61\":8,\"62\":1,\"63\":13,\"66\":1,\"73\":3,\"74\":1,\"76\":2,\"77\":2,\"80\":1,\"81\":1,\"88\":1,\"89\":1,\"127\":2,\"131\":1,\"133\":1,\"134\":11,\"136\":2,\"137\":40,\"138\":13,\"139\":7,\"143\":3,\"150\":2,\"154\":1,\"156\":1,\"157\":11,\"159\":2,\"160\":39,\"161\":12,\"162\":7,\"165\":2,\"166\":3,\"168\":10,\"169\":5,\"174\":2,\"178\":1,\"180\":1,\"181\":11,\"183\":2,\"184\":39,\"185\":12,\"186\":7,\"189\":2,\"190\":3,\"192\":12,\"193\":5,\"206\":2,\"214\":1,\"216\":1,\"217\":11,\"219\":2,\"220\":39,\"221\":12,\"222\":7,\"225\":2,\"226\":5,\"228\":10,\"229\":5,\"236\":2,\"244\":1,\"246\":1,\"247\":11,\"249\":2,\"250\":39,\"251\":11,\"252\":7,\"255\":2,\"256\":5,\"258\":10,\"259\":5,\"266\":2,\"274\":1,\"276\":1,\"277\":11,\"279\":2,\"280\":39,\"281\":11,\"282\":7,\"285\":2,\"286\":5,\"288\":10,\"289\":5,\"312\":2,\"320\":1,\"322\":1,\"323\":11,\"325\":2,\"326\":39,\"327\":11,\"328\":7,\"331\":2,\"332\":5,\"334\":10,\"335\":5,\"358\":2,\"366\":1,\"368\":1,\"369\":11,\"371\":2,\"372\":39,\"373\":11,\"374\":7,\"377\":2,\"378\":5,\"380\":10,\"381\":5,\"397\":2,\"398\":3,\"399\":2,\"400\":2,\"401\":2,\"402\":2,\"403\":2,\"404\":2,\"405\":2,\"406\":2,\"407\":3,\"408\":4,\"409\":1,\"410\":2,\"411\":2,\"412\":3,\"433\":2,\"434\":2,\"463\":2,\"467\":2,\"468\":3,\"469\":2,\"470\":3,\"471\":2,\"472\":2,\"473\":2,\"474\":1,\"475\":1,\"476\":3,\"477\":2,\"478\":3,\"479\":3,\"480\":3,\"481\":3,\"482\":3,\"483\":4,\"484\":3,\"485\":4,\"486\":3,\"487\":1,\"488\":3,\"489\":1,\"490\":1,\"496\":2,\"498\":1,\"499\":1,\"531\":2,\"548\":2,\"549\":3,\"550\":2,\"551\":2,\"552\":2,\"553\":2,\"554\":2,\"555\":2,\"556\":2,\"557\":2,\"558\":3,\"559\":4,\"560\":1,\"561\":2,\"562\":2,\"563\":3,\"584\":2,\"585\":2,\"595\":1,\"596\":1,\"610\":7,\"617\":2,\"618\":5,\"620\":2,\"621\":3,\"622\":2,\"623\":3,\"624\":2,\"625\":2,\"626\":2,\"627\":1,\"628\":1,\"629\":3,\"630\":2,\"631\":3,\"632\":3,\"633\":3,\"634\":3,\"635\":3,\"636\":4,\"637\":3,\"638\":4,\"639\":3,\"640\":1,\"641\":1,\"642\":3,\"643\":2,\"644\":1,\"670\":2,\"674\":4,\"675\":2,\"677\":1,\"678\":2,\"703\":2,\"711\":1,\"713\":1,\"714\":11,\"716\":2,\"717\":39,\"718\":11,\"719\":3,\"722\":2,\"723\":5,\"725\":10,\"726\":5,\"749\":2,\"767\":2,\"768\":3,\"769\":2,\"770\":2,\"771\":2,\"772\":2,\"773\":2,\"774\":2,\"775\":2,\"776\":2,\"777\":3,\"778\":4,\"779\":2,\"780\":2,\"781\":3,\"805\":2,\"806\":2,\"817\":7,\"824\":2,\"825\":5,\"827\":2,\"828\":3,\"829\":2,\"830\":3,\"831\":2,\"832\":2,\"833\":2,\"834\":1,\"835\":1,\"836\":3,\"837\":2,\"838\":3,\"839\":3,\"840\":3,\"841\":3,\"842\":3,\"843\":4,\"844\":3,\"845\":4,\"846\":3,\"847\":1,\"848\":1,\"849\":3,\"850\":2,\"851\":1,\"877\":2,\"881\":4,\"882\":2,\"884\":1,\"885\":2,\"909\":1,\"910\":1,\"915\":1,\"926\":2,\"934\":1,\"936\":1,\"937\":11,\"939\":2,\"940\":39,\"941\":11,\"942\":3,\"945\":2,\"946\":5,\"948\":10,\"949\":5,\"972\":2,\"990\":2,\"991\":3,\"992\":2,\"993\":2,\"994\":2,\"995\":2,\"996\":2,\"997\":2,\"998\":2,\"999\":2,\"1000\":3,\"1001\":4,\"1002\":2,\"1003\":2,\"1004\":3,\"1028\":2,\"1029\":2,\"1040\":7,\"1047\":2,\"1048\":5,\"1050\":2,\"1051\":3,\"1052\":2,\"1053\":3,\"1054\":2,\"1055\":2,\"1056\":2,\"1057\":1,\"1058\":1,\"1059\":3,\"1060\":2,\"1061\":3,\"1062\":3,\"1063\":3,\"1064\":3,\"1065\":3,\"1066\":4,\"1067\":3,\"1068\":4,\"1069\":3,\"1070\":1,\"1071\":1,\"1072\":3,\"1073\":2,\"1074\":1,\"1100\":2,\"1104\":4,\"1105\":2,\"1107\":1,\"1108\":2,\"1133\":2,\"1151\":2,\"1152\":3,\"1153\":2,\"1154\":2,\"1155\":2,\"1156\":2,\"1157\":2,\"1158\":2,\"1159\":2,\"1160\":2,\"1161\":3,\"1162\":4,\"1163\":2,\"1164\":2,\"1165\":3,\"1189\":2,\"1190\":2,\"1201\":1,\"1202\":1,\"1207\":1,\"1217\":7,\"1224\":2,\"1225\":5,\"1227\":2,\"1228\":3,\"1229\":2,\"1230\":3,\"1231\":2,\"1232\":2,\"1233\":2,\"1234\":1,\"1235\":1,\"1236\":3,\"1237\":2,\"1238\":3,\"1239\":3,\"1240\":3,\"1241\":3,\"1242\":3,\"1243\":4,\"1244\":3,\"1245\":4,\"1246\":3,\"1247\":1,\"1248\":1,\"1249\":3,\"1250\":2,\"1251\":1,\"1277\":2,\"1281\":4,\"1282\":2,\"1284\":1,\"1285\":2,\"1289\":1,\"1290\":1,\"1295\":1,\"1326\":2,\"1344\":2,\"1345\":3,\"1346\":2,\"1347\":2,\"1348\":2,\"1349\":2,\"1350\":2,\"1351\":2,\"1352\":2,\"1353\":2,\"1354\":3,\"1355\":4,\"1356\":2,\"1357\":2,\"1358\":3,\"1382\":2,\"1383\":2,\"1394\":1,\"1395\":1,\"1400\":1,\"1410\":7,\"1417\":2,\"1418\":5,\"1420\":2,\"1421\":3,\"1422\":2,\"1423\":3,\"1424\":2,\"1425\":2,\"1426\":2,\"1427\":1,\"1428\":1,\"1429\":3,\"1430\":2,\"1431\":3,\"1432\":3,\"1433\":3,\"1434\":3,\"1435\":3,\"1436\":4,\"1437\":3,\"1438\":4,\"1439\":3,\"1440\":1,\"1441\":1,\"1442\":3,\"1443\":2,\"1444\":1,\"1470\":2,\"1474\":4,\"1475\":2,\"1477\":1,\"1478\":2,\"1513\":2,\"1534\":2,\"1535\":3,\"1536\":2,\"1537\":2,\"1538\":2,\"1539\":2,\"1540\":2,\"1541\":2,\"1542\":2,\"1543\":2,\"1544\":3,\"1545\":4,\"1546\":2,\"1547\":2,\"1548\":3,\"1572\":2,\"1573\":2,\"1578\":1,\"1609\":7,\"1616\":2,\"1617\":5,\"1619\":2,\"1620\":3,\"1621\":2,\"1622\":3,\"1623\":2,\"1624\":2,\"1625\":2,\"1626\":1,\"1627\":1,\"1628\":3,\"1629\":2,\"1630\":3,\"1631\":3,\"1632\":3,\"1633\":3,\"1634\":3,\"1635\":4,\"1636\":3,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":4,\"1641\":3,\"1642\":1,\"1643\":1,\"1644\":3,\"1645\":2,\"1646\":1,\"1647\":1,\"1673\":2,\"1677\":4,\"1678\":2,\"1680\":1,\"1681\":2,\"1685\":1,\"1686\":1,\"1691\":1,\"1722\":2,\"1740\":2,\"1741\":3,\"1742\":2,\"1743\":2,\"1744\":2,\"1745\":2,\"1746\":2,\"1747\":2,\"1748\":2,\"1749\":2,\"1750\":3,\"1751\":4,\"1752\":2,\"1753\":2,\"1754\":3,\"1778\":2,\"1779\":2,\"1790\":7,\"1797\":2,\"1798\":5,\"1800\":2,\"1801\":3,\"1802\":2,\"1803\":3,\"1804\":2,\"1805\":2,\"1806\":2,\"1807\":1,\"1808\":1,\"1809\":3,\"1810\":2,\"1811\":3,\"1812\":3,\"1813\":3,\"1814\":3,\"1815\":3,\"1816\":4,\"1817\":3,\"1818\":4,\"1819\":3,\"1820\":1,\"1821\":1,\"1822\":3,\"1823\":2,\"1824\":1,\"1850\":2,\"1854\":4,\"1855\":2,\"1857\":1,\"1858\":2,\"1862\":1,\"1863\":1,\"1868\":1,\"1909\":2,\"1930\":2,\"1931\":3,\"1932\":2,\"1933\":2,\"1934\":2,\"1935\":2,\"1936\":2,\"1937\":2,\"1938\":2,\"1939\":2,\"1940\":3,\"1941\":4,\"1942\":2,\"1943\":2,\"1944\":3,\"1968\":2,\"1969\":2,\"1974\":1,\"2005\":7,\"2012\":2,\"2013\":5,\"2015\":2,\"2016\":3,\"2017\":2,\"2018\":3,\"2019\":2,\"2020\":2,\"2021\":2,\"2022\":1,\"2023\":1,\"2024\":3,\"2025\":2,\"2026\":3,\"2027\":3,\"2028\":3,\"2029\":3,\"2030\":3,\"2031\":4,\"2032\":3,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":4,\"2037\":3,\"2038\":1,\"2039\":1,\"2040\":3,\"2041\":2,\"2042\":1,\"2043\":1,\"2069\":2,\"2073\":4,\"2074\":2,\"2076\":1,\"2077\":2,\"2081\":1,\"2082\":1,\"2087\":1,\"2128\":2,\"2149\":2,\"2150\":3,\"2151\":2,\"2152\":2,\"2153\":2,\"2154\":2,\"2155\":2,\"2156\":2,\"2157\":2,\"2158\":2,\"2159\":3,\"2160\":4,\"2161\":2,\"2162\":2,\"2163\":3,\"2187\":2,\"2188\":2,\"2193\":1,\"2224\":7,\"2231\":2,\"2232\":5,\"2234\":2,\"2235\":3,\"2236\":2,\"2237\":3,\"2238\":2,\"2239\":2,\"2240\":2,\"2241\":1,\"2242\":1,\"2243\":3,\"2244\":2,\"2245\":3,\"2246\":3,\"2247\":3,\"2248\":3,\"2249\":3,\"2250\":4,\"2251\":3,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":4,\"2256\":3,\"2257\":1,\"2258\":1,\"2259\":3,\"2260\":2,\"2261\":1,\"2262\":1,\"2288\":2,\"2292\":4,\"2293\":2,\"2295\":1,\"2296\":2,\"2300\":1,\"2301\":1,\"2306\":1}}],[\"afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d\",{\"1\":{\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"after\",{\"1\":{\"1\":1,\"61\":1,\"69\":1,\"88\":1,\"90\":1}}],[\"ahead\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"aka\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"506\":1,\"603\":1,\"717\":1,\"918\":1,\"940\":1,\"1210\":1,\"1298\":1,\"1403\":1,\"1602\":1,\"1694\":1,\"1871\":1,\"1998\":1,\"2090\":1,\"2217\":1,\"2309\":1}}],[\"aktiver\",{\"1\":{\"30\":1}}],[\"aktualisieren\",{\"1\":{\"30\":1}}],[\"avoid\",{\"1\":{\"99\":1}}],[\"available\",{\"1\":{\"62\":1,\"63\":1,\"74\":1,\"81\":1,\"88\":2,\"436\":1,\"587\":1,\"808\":1,\"929\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"apache\",{\"1\":{\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"ap1\",{\"1\":{\"211\":1,\"241\":1,\"271\":1,\"317\":1,\"363\":1,\"708\":1}}],[\"apt\",{\"1\":{\"132\":6,\"155\":6,\"179\":6,\"215\":6,\"245\":6,\"275\":6,\"321\":6,\"367\":6,\"712\":6,\"935\":6}}],[\"april\",{\"1\":{\"91\":1}}],[\"apply\",{\"1\":{\"301\":1,\"351\":1,\"611\":1,\"692\":1,\"818\":1,\"899\":1,\"1041\":1,\"1218\":1,\"1411\":1,\"1483\":1,\"1610\":1,\"1791\":1,\"1879\":1,\"2006\":1,\"2098\":1,\"2225\":1}}],[\"applicability\",{\"1\":{\"26\":1}}],[\"applications\",{\"1\":{\"82\":1}}],[\"application\",{\"1\":{\"10\":1,\"58\":2,\"84\":1,\"99\":1,\"129\":1,\"137\":1,\"138\":1,\"152\":1,\"160\":1,\"161\":1,\"176\":1,\"184\":1,\"185\":1,\"212\":1,\"220\":1,\"221\":1,\"242\":1,\"250\":1,\"251\":1,\"272\":1,\"280\":1,\"281\":1,\"318\":1,\"326\":1,\"327\":1,\"364\":1,\"372\":1,\"373\":1,\"463\":1,\"498\":1,\"531\":1,\"595\":1,\"670\":1,\"709\":1,\"717\":1,\"718\":1,\"749\":1,\"877\":1,\"909\":1,\"932\":1,\"940\":1,\"941\":1,\"972\":1,\"1100\":1,\"1133\":1,\"1201\":1,\"1277\":1,\"1289\":1,\"1326\":1,\"1394\":1,\"1470\":1,\"1513\":1,\"1593\":1,\"1673\":1,\"1685\":1,\"1722\":1,\"1850\":1,\"1862\":1,\"1909\":1,\"1989\":1,\"2069\":1,\"2081\":1,\"2128\":1,\"2208\":1,\"2288\":1,\"2300\":1}}],[\"applied\",{\"0\":{\"13\":1},\"1\":{\"13\":1,\"84\":1,\"295\":1,\"345\":1,\"610\":1,\"612\":1,\"615\":1,\"686\":1,\"817\":1,\"819\":1,\"822\":1,\"893\":1,\"1040\":1,\"1042\":1,\"1045\":1,\"1217\":1,\"1219\":1,\"1222\":1,\"1410\":1,\"1412\":1,\"1415\":1,\"1482\":1,\"1484\":1,\"1487\":1,\"1609\":1,\"1611\":1,\"1614\":1,\"1790\":1,\"1792\":1,\"1795\":1,\"1878\":1,\"1880\":1,\"1883\":1,\"2005\":1,\"2007\":1,\"2010\":1,\"2097\":1,\"2099\":1,\"2102\":1,\"2224\":1,\"2226\":1,\"2229\":1}}],[\"appear\",{\"1\":{\"128\":1,\"151\":1,\"175\":1,\"207\":1}}],[\"approval\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"approved\",{\"1\":{\"73\":1,\"293\":1,\"343\":1,\"684\":1,\"891\":1}}],[\"approach\",{\"1\":{\"98\":1,\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"appropriate\",{\"1\":{\"84\":1,\"129\":1,\"137\":1,\"138\":1,\"152\":1,\"160\":1,\"161\":1,\"176\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"app\",{\"0\":{\"498\":1,\"595\":1,\"909\":1,\"1201\":1,\"1289\":1,\"1394\":1,\"1593\":1,\"1685\":1,\"1862\":1,\"1989\":1,\"2081\":1,\"2208\":1,\"2300\":1},\"1\":{\"63\":8,\"137\":4,\"138\":4,\"160\":4,\"161\":4,\"168\":1,\"169\":1,\"184\":4,\"185\":4,\"192\":2,\"193\":1,\"220\":4,\"221\":4,\"228\":1,\"229\":1,\"250\":4,\"251\":4,\"258\":1,\"259\":1,\"280\":4,\"281\":4,\"288\":1,\"289\":1,\"326\":4,\"327\":4,\"334\":1,\"335\":1,\"372\":4,\"373\":4,\"380\":1,\"381\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"458\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"498\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"526\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"595\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"665\":1,\"678\":1,\"717\":4,\"718\":4,\"725\":1,\"726\":1,\"744\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"872\":1,\"885\":1,\"909\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"940\":4,\"941\":4,\"948\":1,\"949\":1,\"967\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1095\":1,\"1108\":1,\"1128\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1201\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1272\":1,\"1285\":1,\"1289\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1321\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1394\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1465\":1,\"1478\":1,\"1508\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1589\":1,\"1593\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1668\":1,\"1681\":1,\"1685\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1717\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1845\":1,\"1858\":1,\"1862\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1904\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1985\":1,\"1989\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2064\":1,\"2077\":1,\"2081\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2123\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2204\":1,\"2208\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2283\":1,\"2296\":1,\"2300\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1}}],[\"api\",{\"0\":{\"442\":1,\"443\":1,\"510\":1,\"511\":1,\"649\":1,\"650\":1,\"728\":1,\"729\":1,\"856\":1,\"857\":1,\"951\":1,\"952\":1,\"1079\":1,\"1080\":1,\"1112\":1,\"1113\":1,\"1256\":1,\"1257\":1,\"1305\":1,\"1306\":1,\"1449\":1,\"1450\":1,\"1492\":1,\"1493\":1,\"1652\":1,\"1653\":1,\"1701\":1,\"1702\":1,\"1829\":1,\"1830\":1,\"1888\":1,\"1889\":1,\"2048\":1,\"2049\":1,\"2107\":1,\"2108\":1,\"2267\":1,\"2268\":1},\"1\":{\"54\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"192\":1,\"203\":1,\"442\":2,\"443\":2,\"510\":2,\"511\":2,\"610\":4,\"616\":1,\"649\":2,\"650\":2,\"674\":2,\"728\":2,\"729\":2,\"817\":4,\"823\":1,\"856\":2,\"857\":2,\"881\":2,\"951\":2,\"952\":2,\"1040\":4,\"1046\":1,\"1079\":2,\"1080\":2,\"1104\":2,\"1112\":2,\"1113\":2,\"1217\":4,\"1223\":1,\"1256\":2,\"1257\":2,\"1281\":2,\"1305\":2,\"1306\":2,\"1410\":4,\"1416\":1,\"1449\":2,\"1450\":2,\"1474\":2,\"1492\":2,\"1493\":2,\"1609\":4,\"1615\":1,\"1652\":2,\"1653\":2,\"1677\":2,\"1701\":2,\"1702\":2,\"1790\":4,\"1796\":1,\"1829\":2,\"1830\":2,\"1854\":2,\"1888\":2,\"1889\":2,\"2005\":4,\"2011\":1,\"2048\":2,\"2049\":2,\"2073\":2,\"2107\":2,\"2108\":2,\"2224\":4,\"2230\":1,\"2267\":2,\"2268\":2,\"2292\":2}}],[\"arch=amd64\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"archive\",{\"0\":{\"2317\":1},\"1\":{\"66\":1,\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"321\":2,\"367\":2,\"712\":2,\"935\":2}}],[\"architecture\",{\"0\":{\"52\":1,\"63\":1},\"1\":{\"44\":1,\"49\":1,\"52\":3,\"55\":1,\"57\":1,\"60\":1,\"80\":1,\"81\":1,\"82\":1,\"84\":1,\"95\":1}}],[\"architectures\",{\"1\":{\"39\":2,\"42\":1,\"59\":1,\"62\":1}}],[\"article\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"artifacts\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"artifact\",{\"1\":{\"169\":2,\"193\":2,\"229\":2,\"259\":2,\"289\":2,\"335\":2,\"381\":2,\"726\":2,\"949\":2}}],[\"art\",{\"1\":{\"95\":1}}],[\"areas\",{\"1\":{\"13\":1,\"303\":1,\"305\":1,\"353\":1,\"355\":1,\"694\":1,\"696\":1,\"901\":1,\"903\":1}}],[\"area\",{\"1\":{\"13\":1}}],[\"are\",{\"0\":{\"61\":1},\"1\":{\"1\":1,\"8\":1,\"10\":1,\"12\":1,\"20\":1,\"25\":1,\"54\":4,\"55\":2,\"57\":1,\"58\":2,\"60\":1,\"61\":2,\"63\":2,\"67\":1,\"68\":1,\"73\":2,\"74\":2,\"76\":1,\"77\":2,\"81\":1,\"82\":1,\"88\":1,\"119\":1,\"122\":1,\"129\":3,\"133\":3,\"134\":2,\"144\":1,\"147\":1,\"152\":3,\"156\":3,\"157\":2,\"176\":3,\"180\":3,\"181\":2,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"212\":2,\"216\":3,\"217\":2,\"226\":1,\"230\":1,\"233\":1,\"242\":2,\"246\":3,\"247\":2,\"256\":1,\"260\":1,\"263\":1,\"272\":2,\"276\":3,\"277\":2,\"286\":1,\"294\":2,\"300\":1,\"301\":1,\"302\":1,\"303\":2,\"304\":2,\"305\":3,\"306\":1,\"309\":1,\"318\":2,\"322\":3,\"323\":2,\"332\":1,\"336\":1,\"339\":1,\"344\":2,\"350\":1,\"351\":1,\"352\":1,\"353\":2,\"354\":2,\"355\":3,\"364\":2,\"368\":3,\"369\":2,\"378\":1,\"436\":1,\"437\":1,\"491\":1,\"505\":1,\"587\":1,\"588\":1,\"602\":1,\"612\":1,\"616\":1,\"617\":1,\"618\":2,\"645\":1,\"674\":1,\"677\":2,\"685\":2,\"691\":1,\"692\":1,\"693\":1,\"694\":2,\"695\":2,\"696\":3,\"697\":1,\"700\":1,\"709\":2,\"713\":3,\"714\":2,\"723\":1,\"802\":1,\"803\":2,\"808\":1,\"810\":1,\"819\":1,\"823\":1,\"824\":1,\"825\":2,\"852\":1,\"881\":1,\"884\":2,\"892\":2,\"898\":1,\"899\":1,\"900\":1,\"901\":2,\"902\":2,\"903\":3,\"904\":1,\"907\":1,\"917\":1,\"929\":1,\"932\":2,\"936\":3,\"937\":2,\"946\":1,\"1025\":1,\"1026\":2,\"1031\":1,\"1033\":1,\"1042\":1,\"1046\":1,\"1047\":1,\"1048\":2,\"1075\":1,\"1104\":1,\"1107\":2,\"1186\":1,\"1187\":2,\"1192\":1,\"1194\":1,\"1209\":1,\"1219\":1,\"1223\":1,\"1224\":1,\"1225\":2,\"1252\":1,\"1281\":1,\"1284\":2,\"1297\":1,\"1379\":1,\"1380\":2,\"1385\":1,\"1387\":1,\"1402\":1,\"1412\":1,\"1416\":1,\"1417\":1,\"1418\":2,\"1445\":1,\"1474\":1,\"1477\":2,\"1484\":1,\"1488\":1,\"1490\":1,\"1569\":1,\"1570\":2,\"1575\":1,\"1581\":1,\"1586\":1,\"1588\":2,\"1601\":1,\"1611\":1,\"1615\":1,\"1616\":1,\"1617\":2,\"1648\":1,\"1677\":1,\"1680\":2,\"1693\":1,\"1775\":1,\"1776\":2,\"1781\":1,\"1783\":1,\"1792\":1,\"1796\":1,\"1797\":1,\"1798\":2,\"1825\":1,\"1854\":1,\"1857\":2,\"1870\":1,\"1880\":1,\"1884\":1,\"1886\":1,\"1965\":1,\"1966\":2,\"1971\":1,\"1977\":1,\"1982\":1,\"1984\":2,\"1997\":1,\"2007\":1,\"2011\":1,\"2012\":1,\"2013\":2,\"2044\":1,\"2073\":1,\"2076\":2,\"2089\":1,\"2099\":1,\"2103\":1,\"2105\":1,\"2184\":1,\"2185\":2,\"2190\":1,\"2196\":1,\"2201\":1,\"2203\":2,\"2216\":1,\"2226\":1,\"2230\":1,\"2231\":1,\"2232\":2,\"2263\":1,\"2292\":1,\"2295\":2,\"2308\":1}}],[\"able\",{\"1\":{\"134\":2,\"138\":3,\"157\":2,\"161\":3,\"181\":2,\"185\":3,\"217\":2,\"221\":3,\"247\":2,\"251\":3,\"277\":2,\"281\":3,\"305\":1,\"323\":2,\"327\":3,\"355\":1,\"369\":2,\"373\":3,\"696\":1,\"714\":2,\"718\":3,\"903\":1,\"937\":2,\"941\":3}}],[\"abstract\",{\"0\":{\"80\":1}}],[\"ability\",{\"1\":{\"58\":1,\"89\":1}}],[\"aborted\",{\"1\":{\"401\":1,\"404\":1,\"471\":1,\"552\":1,\"555\":1,\"624\":1,\"771\":1,\"774\":1,\"831\":1,\"994\":1,\"997\":1,\"1054\":1,\"1155\":1,\"1158\":1,\"1231\":1,\"1348\":1,\"1351\":1,\"1424\":1,\"1538\":1,\"1541\":1,\"1623\":1,\"1744\":1,\"1747\":1,\"1804\":1,\"1934\":1,\"1937\":1,\"2019\":1,\"2153\":1,\"2156\":1,\"2238\":1}}],[\"above\",{\"1\":{\"53\":1,\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"293\":1,\"327\":1,\"343\":1,\"373\":1,\"610\":1,\"684\":1,\"718\":1,\"817\":1,\"891\":1,\"941\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"about\",{\"0\":{\"16\":1},\"1\":{\"28\":1,\"54\":1,\"55\":1,\"56\":1,\"57\":2,\"60\":1,\"73\":1,\"74\":1,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"125\":1,\"148\":1,\"170\":1,\"172\":1,\"202\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"407\":1,\"412\":1,\"558\":1,\"563\":1,\"701\":1,\"777\":1,\"781\":1,\"924\":1,\"928\":1,\"1000\":1,\"1004\":1,\"1161\":1,\"1165\":1,\"1354\":1,\"1358\":1,\"1544\":1,\"1548\":1,\"1750\":1,\"1754\":1,\"1940\":1,\"1944\":1,\"2159\":1,\"2163\":1}}],[\"ab\",{\"1\":{\"29\":2}}],[\"agianst\",{\"1\":{\"437\":1,\"491\":1,\"588\":1,\"645\":1,\"810\":1,\"852\":1,\"1033\":1,\"1075\":1,\"1194\":1,\"1252\":1,\"1387\":1,\"1445\":1,\"1581\":1,\"1648\":1,\"1783\":1,\"1825\":1,\"1977\":1,\"2044\":1,\"2196\":1,\"2263\":1}}],[\"again\",{\"1\":{\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"against\",{\"1\":{\"54\":1,\"74\":1,\"77\":1,\"101\":1,\"413\":1,\"564\":1,\"613\":3,\"614\":1,\"618\":2,\"782\":1,\"820\":3,\"821\":1,\"825\":2,\"1005\":1,\"1043\":3,\"1044\":1,\"1048\":2,\"1166\":1,\"1220\":3,\"1221\":1,\"1225\":2,\"1359\":1,\"1413\":3,\"1414\":1,\"1418\":2,\"1485\":3,\"1486\":1,\"1490\":2,\"1549\":1,\"1612\":3,\"1613\":1,\"1617\":2,\"1755\":1,\"1793\":3,\"1794\":1,\"1798\":2,\"1881\":3,\"1882\":1,\"1886\":2,\"1945\":1,\"2008\":3,\"2009\":1,\"2013\":2,\"2100\":3,\"2101\":1,\"2105\":2,\"2164\":1,\"2227\":3,\"2228\":1,\"2232\":2}}],[\"agenda\",{\"1\":{\"29\":1}}],[\"agnostic\",{\"1\":{\"20\":1,\"66\":1}}],[\"ams\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"among\",{\"1\":{\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"am\",{\"1\":{\"29\":1}}],[\"audience\",{\"1\":{\"82\":1}}],[\"audimax\",{\"1\":{\"29\":1}}],[\"autostart\",{\"0\":{\"69\":1},\"1\":{\"69\":1}}],[\"automatic\",{\"1\":{\"63\":2}}],[\"automated\",{\"1\":{\"62\":1,\"89\":1}}],[\"auth\",{\"0\":{\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1},\"1\":{\"444\":1,\"445\":4,\"446\":4,\"447\":1,\"448\":2,\"449\":2,\"450\":2,\"451\":1,\"452\":3,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"512\":1,\"513\":4,\"514\":4,\"515\":1,\"516\":2,\"517\":2,\"518\":2,\"519\":1,\"520\":3,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"651\":1,\"652\":4,\"653\":4,\"654\":1,\"655\":2,\"656\":2,\"657\":2,\"658\":1,\"659\":3,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"675\":6,\"676\":2,\"677\":2,\"678\":7,\"730\":1,\"731\":4,\"732\":4,\"733\":1,\"734\":2,\"735\":2,\"736\":2,\"737\":1,\"738\":3,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"858\":1,\"859\":4,\"860\":4,\"861\":1,\"862\":2,\"863\":2,\"864\":2,\"865\":1,\"866\":3,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"882\":6,\"883\":2,\"884\":2,\"885\":7,\"953\":1,\"954\":4,\"955\":4,\"956\":1,\"957\":2,\"958\":2,\"959\":2,\"960\":1,\"961\":3,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"1081\":1,\"1082\":4,\"1083\":4,\"1084\":1,\"1085\":2,\"1086\":2,\"1087\":2,\"1088\":1,\"1089\":3,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1105\":6,\"1106\":2,\"1107\":2,\"1108\":7,\"1114\":1,\"1115\":4,\"1116\":4,\"1117\":1,\"1118\":2,\"1119\":2,\"1120\":2,\"1121\":1,\"1122\":3,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1258\":1,\"1259\":4,\"1260\":4,\"1261\":1,\"1262\":2,\"1263\":2,\"1264\":2,\"1265\":1,\"1266\":3,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1282\":6,\"1283\":2,\"1284\":2,\"1285\":7,\"1307\":1,\"1308\":4,\"1309\":4,\"1310\":1,\"1311\":2,\"1312\":2,\"1313\":2,\"1314\":1,\"1315\":3,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1451\":1,\"1452\":4,\"1453\":4,\"1454\":1,\"1455\":2,\"1456\":2,\"1457\":2,\"1458\":1,\"1459\":3,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1475\":6,\"1476\":2,\"1477\":2,\"1478\":7,\"1494\":1,\"1495\":4,\"1496\":4,\"1497\":1,\"1498\":2,\"1499\":2,\"1500\":2,\"1501\":1,\"1502\":3,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1587\":6,\"1588\":2,\"1589\":7,\"1654\":1,\"1655\":4,\"1656\":4,\"1657\":1,\"1658\":2,\"1659\":2,\"1660\":2,\"1661\":1,\"1662\":3,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1678\":6,\"1679\":2,\"1680\":2,\"1681\":7,\"1703\":1,\"1704\":4,\"1705\":4,\"1706\":1,\"1707\":2,\"1708\":2,\"1709\":2,\"1710\":1,\"1711\":3,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1831\":1,\"1832\":4,\"1833\":4,\"1834\":1,\"1835\":2,\"1836\":2,\"1837\":2,\"1838\":1,\"1839\":3,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1855\":6,\"1856\":2,\"1857\":2,\"1858\":7,\"1890\":1,\"1891\":4,\"1892\":4,\"1893\":1,\"1894\":2,\"1895\":2,\"1896\":2,\"1897\":1,\"1898\":3,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1983\":6,\"1984\":2,\"1985\":7,\"2050\":1,\"2051\":4,\"2052\":4,\"2053\":1,\"2054\":2,\"2055\":2,\"2056\":2,\"2057\":1,\"2058\":3,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2074\":6,\"2075\":2,\"2076\":2,\"2077\":7,\"2109\":1,\"2110\":4,\"2111\":4,\"2112\":1,\"2113\":2,\"2114\":2,\"2115\":2,\"2116\":1,\"2117\":3,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2202\":6,\"2203\":2,\"2204\":7,\"2269\":1,\"2270\":4,\"2271\":4,\"2272\":1,\"2273\":2,\"2274\":2,\"2275\":2,\"2276\":1,\"2277\":3,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2293\":6,\"2294\":2,\"2295\":2,\"2296\":7}}],[\"authenitication\",{\"1\":{\"106\":1}}],[\"authenticates\",{\"1\":{\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"authenticated\",{\"1\":{\"610\":1,\"674\":1,\"817\":1,\"881\":1,\"1040\":1,\"1104\":1,\"1217\":1,\"1281\":1,\"1410\":1,\"1474\":1,\"1482\":2,\"1586\":1,\"1609\":1,\"1677\":1,\"1790\":1,\"1854\":1,\"1878\":2,\"1982\":1,\"2005\":1,\"2073\":1,\"2097\":2,\"2201\":1,\"2224\":1,\"2292\":1}}],[\"authenticate\",{\"1\":{\"74\":1,\"76\":1,\"77\":2,\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"413\":1,\"564\":1,\"704\":1,\"782\":1,\"927\":1,\"1005\":1,\"1166\":1,\"1359\":1,\"1549\":1,\"1755\":1,\"1945\":1,\"2164\":1}}],[\"authenticating\",{\"1\":{\"55\":1,\"610\":1,\"612\":1,\"817\":1,\"819\":1,\"1040\":1,\"1042\":1,\"1217\":1,\"1219\":1,\"1410\":1,\"1412\":1,\"1482\":1,\"1484\":1,\"1609\":1,\"1611\":1,\"1790\":1,\"1792\":1,\"1878\":1,\"1880\":1,\"2005\":1,\"2007\":1,\"2097\":1,\"2099\":1,\"2224\":1,\"2226\":1}}],[\"authentication\",{\"0\":{\"74\":1,\"676\":1,\"883\":1,\"1106\":1,\"1283\":1,\"1476\":1,\"1679\":1,\"1856\":1,\"2075\":1,\"2294\":1},\"1\":{\"20\":1,\"25\":1,\"63\":1,\"74\":1,\"80\":1,\"81\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"126\":1,\"133\":4,\"149\":1,\"156\":4,\"169\":1,\"171\":1,\"173\":1,\"180\":4,\"193\":1,\"203\":1,\"205\":1,\"216\":4,\"229\":1,\"235\":1,\"246\":4,\"259\":1,\"265\":1,\"276\":4,\"289\":1,\"311\":1,\"322\":4,\"335\":1,\"357\":1,\"368\":4,\"381\":1,\"420\":2,\"430\":2,\"438\":1,\"440\":1,\"448\":1,\"492\":1,\"494\":1,\"516\":1,\"571\":2,\"581\":2,\"589\":1,\"591\":1,\"606\":1,\"610\":1,\"646\":1,\"648\":1,\"655\":1,\"674\":3,\"675\":1,\"676\":1,\"702\":1,\"713\":4,\"726\":1,\"734\":1,\"789\":2,\"799\":2,\"811\":1,\"813\":1,\"817\":1,\"853\":1,\"855\":1,\"862\":1,\"881\":3,\"882\":1,\"883\":1,\"921\":1,\"925\":1,\"936\":4,\"949\":1,\"957\":1,\"1012\":2,\"1022\":2,\"1034\":1,\"1036\":1,\"1040\":1,\"1076\":1,\"1078\":1,\"1085\":1,\"1104\":3,\"1105\":1,\"1106\":1,\"1118\":1,\"1173\":2,\"1183\":2,\"1195\":1,\"1197\":1,\"1213\":1,\"1217\":1,\"1253\":1,\"1255\":1,\"1262\":1,\"1281\":3,\"1282\":1,\"1283\":1,\"1301\":1,\"1311\":1,\"1366\":2,\"1376\":2,\"1388\":1,\"1390\":1,\"1406\":1,\"1410\":1,\"1446\":1,\"1448\":1,\"1455\":1,\"1474\":3,\"1475\":1,\"1476\":1,\"1482\":1,\"1498\":1,\"1556\":2,\"1566\":2,\"1582\":1,\"1584\":1,\"1586\":2,\"1587\":1,\"1605\":1,\"1609\":1,\"1649\":1,\"1651\":1,\"1658\":1,\"1677\":3,\"1678\":1,\"1679\":1,\"1697\":1,\"1707\":1,\"1762\":2,\"1772\":2,\"1784\":1,\"1786\":1,\"1790\":1,\"1826\":1,\"1828\":1,\"1835\":1,\"1854\":3,\"1855\":1,\"1856\":1,\"1874\":1,\"1878\":1,\"1894\":1,\"1952\":2,\"1962\":2,\"1978\":1,\"1980\":1,\"1982\":2,\"1983\":1,\"2001\":1,\"2005\":1,\"2045\":1,\"2047\":1,\"2054\":1,\"2073\":3,\"2074\":1,\"2075\":1,\"2093\":1,\"2097\":1,\"2113\":1,\"2171\":2,\"2181\":2,\"2197\":1,\"2199\":1,\"2201\":2,\"2202\":1,\"2220\":1,\"2224\":1,\"2264\":1,\"2266\":1,\"2273\":1,\"2292\":3,\"2293\":1,\"2294\":1,\"2312\":1}}],[\"authority\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"717\":1,\"940\":1}}],[\"authorities\",{\"1\":{\"74\":1}}],[\"authorisation\",{\"1\":{\"61\":1}}],[\"authorized\",{\"1\":{\"20\":1,\"25\":1,\"49\":1}}],[\"authorization\",{\"0\":{\"445\":1,\"513\":1,\"652\":1,\"675\":1,\"731\":1,\"859\":1,\"882\":1,\"954\":1,\"1082\":1,\"1105\":1,\"1115\":1,\"1259\":1,\"1282\":1,\"1308\":1,\"1452\":1,\"1475\":1,\"1495\":1,\"1587\":1,\"1655\":1,\"1678\":1,\"1704\":1,\"1832\":1,\"1855\":1,\"1891\":1,\"1983\":1,\"2051\":1,\"2074\":1,\"2110\":1,\"2202\":1,\"2270\":1,\"2293\":1},\"1\":{\"20\":1,\"25\":1,\"63\":1,\"80\":1,\"81\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1,\"445\":2,\"446\":1,\"449\":1,\"450\":1,\"513\":2,\"514\":1,\"517\":1,\"518\":1,\"652\":2,\"653\":1,\"656\":1,\"657\":1,\"674\":1,\"675\":2,\"678\":1,\"731\":2,\"732\":1,\"735\":1,\"736\":1,\"859\":2,\"860\":1,\"863\":1,\"864\":1,\"881\":1,\"882\":2,\"885\":1,\"954\":2,\"955\":1,\"958\":1,\"959\":1,\"1082\":2,\"1083\":1,\"1086\":1,\"1087\":1,\"1104\":1,\"1105\":2,\"1108\":1,\"1115\":2,\"1116\":1,\"1119\":1,\"1120\":1,\"1259\":2,\"1260\":1,\"1263\":1,\"1264\":1,\"1281\":1,\"1282\":2,\"1285\":1,\"1308\":2,\"1309\":1,\"1312\":1,\"1313\":1,\"1452\":2,\"1453\":1,\"1456\":1,\"1457\":1,\"1474\":1,\"1475\":2,\"1478\":1,\"1495\":2,\"1496\":1,\"1499\":1,\"1500\":1,\"1586\":1,\"1587\":2,\"1589\":1,\"1655\":2,\"1656\":1,\"1659\":1,\"1660\":1,\"1677\":1,\"1678\":2,\"1681\":1,\"1704\":2,\"1705\":1,\"1708\":1,\"1709\":1,\"1832\":2,\"1833\":1,\"1836\":1,\"1837\":1,\"1854\":1,\"1855\":2,\"1858\":1,\"1891\":2,\"1892\":1,\"1895\":1,\"1896\":1,\"1982\":1,\"1983\":2,\"1985\":1,\"2051\":2,\"2052\":1,\"2055\":1,\"2056\":1,\"2073\":1,\"2074\":2,\"2077\":1,\"2110\":2,\"2111\":1,\"2114\":1,\"2115\":1,\"2201\":1,\"2202\":2,\"2204\":1,\"2270\":2,\"2271\":1,\"2274\":1,\"2275\":1,\"2292\":1,\"2293\":2,\"2296\":1}}],[\"auch\",{\"1\":{\"31\":4,\"32\":1}}],[\"ausgewählten\",{\"1\":{\"31\":1}}],[\"aus\",{\"1\":{\"31\":1}}],[\"auf\",{\"1\":{\"29\":2,\"31\":1,\"32\":1}}],[\"alert\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"alexander\",{\"1\":{\"18\":1}}],[\"alpine\",{\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"718\":1,\"941\":1}}],[\"always\",{\"1\":{\"95\":1,\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"302\":1,\"328\":1,\"352\":1,\"374\":1,\"693\":1,\"719\":1,\"900\":1,\"942\":1}}],[\"alternative\",{\"1\":{\"76\":2,\"613\":1,\"820\":1,\"1043\":1,\"1220\":1,\"1413\":1,\"1485\":1,\"1612\":1,\"1793\":1,\"1881\":1,\"2008\":1,\"2100\":1,\"2227\":1}}],[\"almost\",{\"1\":{\"66\":1}}],[\"al\",{\"1\":{\"39\":1}}],[\"algorithm\",{\"1\":{\"39\":1,\"42\":1}}],[\"all\",{\"1\":{\"50\":1,\"55\":3,\"61\":2,\"74\":1,\"90\":1,\"91\":2,\"92\":1,\"125\":1,\"128\":1,\"148\":1,\"151\":1,\"172\":1,\"175\":1,\"204\":1,\"207\":1,\"234\":1,\"237\":1,\"264\":1,\"267\":1,\"290\":1,\"294\":1,\"296\":1,\"302\":1,\"310\":1,\"313\":1,\"340\":1,\"344\":1,\"346\":1,\"352\":1,\"356\":1,\"359\":1,\"437\":1,\"491\":1,\"504\":1,\"505\":2,\"506\":1,\"588\":1,\"601\":1,\"602\":2,\"603\":1,\"610\":2,\"645\":1,\"681\":1,\"685\":1,\"687\":1,\"693\":1,\"701\":1,\"704\":1,\"803\":1,\"810\":1,\"817\":2,\"852\":1,\"888\":1,\"892\":1,\"894\":1,\"900\":1,\"916\":1,\"917\":2,\"918\":1,\"924\":1,\"927\":1,\"1026\":1,\"1033\":1,\"1040\":2,\"1075\":1,\"1187\":1,\"1194\":1,\"1208\":1,\"1209\":2,\"1210\":1,\"1217\":2,\"1252\":1,\"1296\":1,\"1297\":2,\"1298\":1,\"1380\":1,\"1387\":1,\"1401\":1,\"1402\":2,\"1403\":1,\"1410\":2,\"1445\":1,\"1482\":2,\"1570\":1,\"1581\":1,\"1600\":1,\"1601\":2,\"1602\":1,\"1609\":2,\"1648\":1,\"1692\":1,\"1693\":2,\"1694\":1,\"1776\":1,\"1783\":1,\"1790\":2,\"1825\":1,\"1869\":1,\"1870\":2,\"1871\":1,\"1878\":2,\"1966\":1,\"1977\":1,\"1996\":1,\"1997\":2,\"1998\":1,\"2005\":2,\"2044\":1,\"2088\":1,\"2089\":2,\"2090\":1,\"2097\":2,\"2185\":1,\"2196\":1,\"2215\":1,\"2216\":2,\"2217\":1,\"2224\":2,\"2263\":1,\"2307\":1,\"2308\":2,\"2309\":1}}],[\"allowed\",{\"1\":{\"61\":1,\"616\":1,\"823\":1,\"1046\":1,\"1223\":1,\"1416\":1,\"1488\":1,\"1615\":1,\"1796\":1,\"1884\":1,\"2011\":1,\"2103\":1,\"2230\":1}}],[\"allow\",{\"0\":{\"48\":1,\"50\":1,\"125\":1,\"148\":1,\"172\":1,\"204\":1,\"234\":1,\"264\":1,\"310\":1,\"356\":1,\"701\":1,\"924\":1},\"1\":{\"44\":1,\"49\":8,\"50\":1,\"63\":1,\"68\":1,\"70\":2,\"73\":3,\"74\":1,\"90\":1,\"95\":1,\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"125\":2,\"126\":5,\"128\":2,\"137\":1,\"142\":1,\"148\":2,\"149\":5,\"151\":2,\"160\":1,\"165\":1,\"171\":1,\"172\":2,\"173\":5,\"175\":2,\"184\":1,\"189\":1,\"192\":1,\"193\":2,\"203\":1,\"204\":1,\"205\":4,\"207\":5,\"209\":1,\"220\":1,\"225\":1,\"234\":1,\"235\":4,\"237\":3,\"239\":1,\"250\":1,\"255\":1,\"264\":1,\"265\":4,\"267\":3,\"269\":1,\"280\":1,\"285\":1,\"310\":1,\"311\":4,\"313\":3,\"315\":1,\"326\":1,\"331\":1,\"356\":1,\"357\":4,\"359\":3,\"361\":1,\"372\":1,\"377\":1,\"409\":1,\"432\":1,\"486\":3,\"487\":1,\"560\":1,\"583\":1,\"617\":1,\"639\":3,\"640\":1,\"701\":1,\"702\":4,\"704\":3,\"706\":1,\"717\":1,\"722\":1,\"804\":1,\"824\":1,\"846\":3,\"847\":1,\"924\":1,\"925\":4,\"927\":3,\"929\":1,\"940\":1,\"945\":1,\"1027\":1,\"1047\":1,\"1069\":3,\"1070\":1,\"1188\":1,\"1224\":1,\"1246\":3,\"1247\":1,\"1381\":1,\"1417\":1,\"1439\":3,\"1440\":1,\"1571\":1,\"1616\":1,\"1641\":3,\"1642\":1,\"1777\":1,\"1797\":1,\"1819\":3,\"1820\":1,\"1967\":1,\"2012\":1,\"2037\":3,\"2038\":1,\"2186\":1,\"2231\":1,\"2256\":3,\"2257\":1}}],[\"allowlist\",{\"1\":{\"31\":3,\"35\":1,\"119\":1,\"122\":1,\"144\":1,\"147\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"209\":1,\"230\":1,\"233\":1,\"239\":1,\"260\":1,\"263\":1,\"269\":1,\"306\":1,\"309\":1,\"315\":1,\"336\":1,\"339\":1,\"361\":1,\"697\":1,\"700\":1,\"706\":1,\"904\":1,\"907\":1}}],[\"allows\",{\"1\":{\"24\":1,\"89\":1,\"90\":1,\"618\":1,\"825\":1,\"1048\":1,\"1225\":1,\"1418\":1,\"1490\":1,\"1617\":1,\"1798\":1,\"1886\":1,\"2013\":1,\"2105\":1,\"2232\":1}}],[\"aller\",{\"1\":{\"29\":1}}],[\"already\",{\"1\":{\"26\":1,\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"226\":1,\"242\":1,\"256\":1,\"272\":1,\"286\":1,\"318\":1,\"332\":1,\"364\":1,\"378\":1,\"436\":1,\"587\":1,\"709\":1,\"723\":1,\"808\":1,\"932\":1,\"946\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"also\",{\"1\":{\"10\":1,\"52\":1,\"63\":1,\"95\":1,\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"328\":2,\"374\":2,\"382\":1,\"466\":1,\"617\":1,\"674\":2,\"719\":2,\"824\":1,\"881\":2,\"942\":2,\"1047\":1,\"1104\":2,\"1224\":1,\"1281\":2,\"1417\":1,\"1474\":2,\"1586\":2,\"1616\":1,\"1677\":2,\"1797\":1,\"1854\":2,\"1982\":2,\"2012\":1,\"2073\":2,\"2201\":2,\"2231\":1,\"2292\":2}}],[\"adhere\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"admin\",{\"1\":{\"617\":1,\"618\":4,\"824\":1,\"825\":4,\"1047\":1,\"1048\":4,\"1224\":1,\"1225\":4,\"1417\":1,\"1418\":4,\"1482\":1,\"1488\":1,\"1490\":5,\"1616\":1,\"1617\":4,\"1797\":1,\"1798\":4,\"1878\":1,\"1884\":1,\"1886\":5,\"2012\":1,\"2013\":4,\"2097\":1,\"2103\":1,\"2105\":5,\"2231\":1,\"2232\":4}}],[\"admins\",{\"1\":{\"137\":1,\"160\":1,\"184\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"618\":2,\"717\":1,\"825\":2,\"940\":1,\"1048\":2,\"1225\":2,\"1418\":2,\"1490\":3,\"1617\":2,\"1798\":2,\"1886\":3,\"2013\":2,\"2105\":3,\"2232\":2}}],[\"administrator\",{\"1\":{\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1,\"1490\":1,\"1886\":1,\"2105\":1}}],[\"administrators\",{\"1\":{\"73\":1,\"618\":2,\"825\":2,\"1048\":2,\"1225\":2,\"1418\":2,\"1482\":1,\"1490\":2,\"1617\":2,\"1798\":2,\"1878\":1,\"1886\":2,\"2013\":2,\"2097\":1,\"2105\":2,\"2232\":2}}],[\"administration\",{\"1\":{\"126\":1,\"149\":1,\"173\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"925\":1}}],[\"administrative\",{\"1\":{\"81\":1}}],[\"advanced\",{\"1\":{\"76\":1}}],[\"advancing\",{\"1\":{\"27\":1,\"89\":1}}],[\"adds\",{\"1\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"adduser\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1}}],[\"addgroup\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1}}],[\"add\",{\"1\":{\"126\":1,\"137\":8,\"138\":5,\"149\":1,\"160\":7,\"161\":5,\"173\":1,\"184\":7,\"185\":5,\"205\":1,\"220\":7,\"221\":5,\"250\":7,\"251\":5,\"280\":7,\"281\":5,\"326\":7,\"327\":5,\"372\":7,\"373\":5,\"717\":7,\"718\":5,\"931\":1,\"940\":7,\"941\":5}}],[\"addressing\",{\"1\":{\"84\":1}}],[\"addresses\",{\"1\":{\"81\":1,\"422\":1,\"427\":1,\"428\":1,\"573\":1,\"578\":1,\"579\":1,\"613\":2,\"618\":2,\"791\":1,\"796\":1,\"797\":1,\"820\":2,\"825\":2,\"1014\":1,\"1019\":1,\"1020\":1,\"1043\":2,\"1048\":2,\"1175\":1,\"1180\":1,\"1181\":1,\"1220\":2,\"1225\":2,\"1368\":1,\"1373\":1,\"1374\":1,\"1413\":2,\"1418\":2,\"1485\":2,\"1490\":2,\"1558\":1,\"1563\":1,\"1564\":1,\"1612\":2,\"1617\":2,\"1764\":1,\"1769\":1,\"1770\":1,\"1793\":2,\"1798\":2,\"1881\":2,\"1886\":2,\"1954\":1,\"1959\":1,\"1960\":1,\"2008\":2,\"2013\":2,\"2100\":2,\"2105\":2,\"2173\":1,\"2178\":1,\"2179\":1,\"2227\":2,\"2232\":2}}],[\"address\",{\"1\":{\"81\":1,\"89\":1,\"97\":1,\"99\":3,\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"303\":1,\"312\":1,\"353\":1,\"358\":1,\"387\":1,\"408\":1,\"416\":1,\"478\":1,\"485\":1,\"498\":1,\"538\":1,\"559\":1,\"567\":1,\"595\":1,\"631\":1,\"638\":1,\"694\":1,\"703\":1,\"756\":1,\"778\":1,\"785\":1,\"838\":1,\"845\":1,\"901\":1,\"909\":1,\"926\":1,\"979\":1,\"1001\":1,\"1008\":1,\"1061\":1,\"1068\":1,\"1140\":1,\"1162\":1,\"1169\":1,\"1201\":1,\"1238\":1,\"1245\":1,\"1289\":1,\"1333\":1,\"1355\":1,\"1362\":1,\"1394\":1,\"1431\":1,\"1438\":1,\"1520\":1,\"1545\":1,\"1552\":1,\"1577\":1,\"1593\":1,\"1630\":1,\"1640\":1,\"1685\":1,\"1729\":1,\"1751\":1,\"1758\":1,\"1811\":1,\"1818\":1,\"1862\":1,\"1916\":1,\"1941\":1,\"1948\":1,\"1973\":1,\"1989\":1,\"2026\":1,\"2036\":1,\"2081\":1,\"2135\":1,\"2160\":1,\"2167\":1,\"2192\":1,\"2208\":1,\"2245\":1,\"2255\":1,\"2300\":1}}],[\"addition\",{\"1\":{\"59\":1,\"73\":2,\"77\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"additional\",{\"0\":{\"56\":1,\"64\":1,\"677\":1,\"884\":1,\"1107\":1,\"1284\":1,\"1477\":1,\"1588\":1,\"1680\":1,\"1857\":1,\"1984\":1,\"2076\":1,\"2203\":1,\"2295\":1},\"1\":{\"18\":1,\"55\":1,\"64\":2,\"76\":1,\"137\":4,\"138\":1,\"160\":3,\"161\":1,\"184\":3,\"185\":1,\"220\":3,\"221\":1,\"226\":1,\"250\":3,\"251\":1,\"256\":1,\"280\":3,\"281\":1,\"286\":1,\"326\":3,\"327\":1,\"332\":1,\"372\":3,\"373\":1,\"378\":1,\"382\":1,\"466\":1,\"610\":2,\"677\":1,\"717\":3,\"718\":1,\"723\":1,\"802\":1,\"817\":2,\"884\":1,\"940\":3,\"941\":1,\"946\":1,\"1025\":1,\"1040\":2,\"1107\":1,\"1186\":1,\"1217\":2,\"1284\":1,\"1379\":1,\"1410\":2,\"1477\":1,\"1482\":1,\"1569\":1,\"1588\":1,\"1609\":2,\"1680\":1,\"1775\":1,\"1790\":2,\"1857\":1,\"1878\":1,\"1965\":1,\"1984\":1,\"2005\":2,\"2076\":1,\"2097\":1,\"2184\":1,\"2203\":1,\"2224\":2,\"2295\":1}}],[\"additionally\",{\"1\":{\"7\":1,\"119\":1,\"144\":1,\"194\":1,\"198\":1,\"230\":1,\"260\":1,\"306\":1,\"336\":1,\"697\":1,\"904\":1}}],[\"added\",{\"1\":{\"54\":1,\"126\":1,\"149\":1,\"173\":1,\"193\":1,\"205\":1,\"235\":1,\"265\":1,\"311\":1,\"357\":1,\"702\":1,\"803\":1,\"925\":1,\"1026\":1,\"1187\":1,\"1380\":1,\"1570\":1,\"1776\":1,\"1966\":1,\"2185\":1}}],[\"adaptable\",{\"1\":{\"20\":1,\"24\":1}}],[\"adapt\",{\"1\":{\"10\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"attributes\",{\"1\":{\"59\":1}}],[\"at\",{\"1\":{\"1\":2,\"10\":1,\"13\":1,\"26\":1,\"27\":1,\"61\":1,\"62\":1,\"63\":1,\"67\":1,\"91\":1,\"99\":2,\"102\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"119\":1,\"122\":1,\"123\":1,\"126\":1,\"128\":2,\"129\":1,\"137\":1,\"138\":1,\"140\":1,\"143\":1,\"144\":1,\"147\":1,\"149\":1,\"151\":2,\"152\":1,\"160\":1,\"161\":1,\"163\":1,\"166\":1,\"170\":1,\"173\":1,\"175\":2,\"176\":1,\"184\":1,\"185\":1,\"187\":1,\"190\":1,\"192\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"202\":1,\"205\":1,\"207\":2,\"212\":1,\"220\":1,\"221\":1,\"223\":1,\"226\":1,\"230\":1,\"233\":1,\"235\":1,\"237\":1,\"242\":1,\"250\":1,\"251\":1,\"253\":1,\"256\":1,\"260\":1,\"263\":1,\"265\":1,\"267\":1,\"272\":1,\"280\":1,\"281\":1,\"283\":1,\"286\":1,\"303\":2,\"306\":1,\"309\":1,\"311\":1,\"313\":1,\"318\":1,\"326\":1,\"327\":1,\"329\":1,\"332\":1,\"336\":1,\"339\":1,\"353\":2,\"357\":1,\"359\":1,\"364\":1,\"372\":1,\"373\":1,\"375\":1,\"378\":1,\"427\":1,\"578\":1,\"675\":1,\"694\":2,\"697\":1,\"700\":1,\"702\":1,\"704\":1,\"709\":1,\"717\":1,\"718\":1,\"720\":1,\"723\":1,\"796\":1,\"882\":1,\"901\":2,\"904\":1,\"907\":1,\"915\":2,\"925\":1,\"927\":1,\"932\":1,\"940\":1,\"941\":1,\"943\":1,\"946\":1,\"1019\":1,\"1105\":1,\"1180\":1,\"1207\":2,\"1282\":1,\"1295\":2,\"1373\":1,\"1400\":2,\"1475\":1,\"1563\":1,\"1587\":1,\"1599\":2,\"1678\":1,\"1691\":2,\"1769\":1,\"1855\":1,\"1868\":2,\"1959\":1,\"1983\":1,\"1995\":2,\"2074\":1,\"2087\":2,\"2178\":1,\"2202\":1,\"2214\":2,\"2293\":1,\"2306\":2}}],[\"award\",{\"1\":{\"1\":2}}],[\"ask\",{\"1\":{\"98\":1,\"301\":2,\"351\":2,\"692\":2,\"899\":2}}],[\"aspects\",{\"1\":{\"58\":1,\"80\":1,\"81\":1}}],[\"assign\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"assigning\",{\"1\":{\"610\":1,\"817\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"assist\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"assistance\",{\"1\":{\"27\":1}}],[\"assuming\",{\"1\":{\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"326\":1,\"327\":1,\"372\":1,\"373\":1,\"717\":1,\"718\":1,\"940\":1,\"941\":1}}],[\"assurance\",{\"1\":{\"10\":1}}],[\"as\",{\"0\":{\"2\":2,\"51\":2},\"1\":{\"0\":1,\"1\":2,\"4\":2,\"10\":2,\"21\":2,\"41\":1,\"49\":2,\"53\":2,\"54\":1,\"55\":2,\"58\":4,\"59\":4,\"62\":4,\"63\":5,\"64\":1,\"66\":1,\"67\":1,\"74\":1,\"77\":1,\"80\":6,\"81\":5,\"82\":2,\"84\":2,\"88\":1,\"90\":2,\"91\":2,\"97\":1,\"100\":2,\"126\":1,\"136\":8,\"137\":2,\"138\":1,\"149\":1,\"159\":8,\"160\":2,\"161\":1,\"173\":1,\"183\":8,\"184\":2,\"185\":1,\"192\":1,\"193\":1,\"205\":1,\"219\":8,\"220\":2,\"221\":1,\"226\":4,\"235\":1,\"249\":8,\"250\":2,\"251\":1,\"256\":4,\"265\":1,\"279\":8,\"280\":2,\"281\":1,\"286\":4,\"294\":1,\"299\":1,\"301\":6,\"303\":1,\"311\":1,\"325\":8,\"326\":2,\"327\":1,\"332\":4,\"344\":1,\"349\":1,\"351\":6,\"353\":1,\"357\":1,\"371\":8,\"372\":2,\"373\":1,\"378\":4,\"398\":1,\"414\":1,\"419\":1,\"452\":1,\"468\":1,\"520\":1,\"549\":1,\"565\":1,\"570\":1,\"610\":2,\"621\":1,\"643\":1,\"659\":1,\"674\":2,\"685\":1,\"690\":1,\"692\":6,\"694\":1,\"702\":1,\"716\":8,\"717\":2,\"718\":1,\"723\":4,\"738\":1,\"768\":1,\"783\":1,\"788\":1,\"817\":2,\"828\":1,\"850\":1,\"866\":1,\"881\":2,\"892\":1,\"897\":1,\"899\":6,\"901\":1,\"915\":1,\"925\":1,\"939\":8,\"940\":2,\"941\":1,\"946\":4,\"961\":1,\"991\":1,\"1006\":1,\"1011\":1,\"1040\":2,\"1051\":1,\"1073\":1,\"1089\":1,\"1104\":2,\"1122\":1,\"1152\":1,\"1167\":1,\"1172\":1,\"1207\":1,\"1217\":2,\"1228\":1,\"1250\":1,\"1266\":1,\"1281\":2,\"1295\":1,\"1315\":1,\"1345\":1,\"1360\":1,\"1365\":1,\"1400\":1,\"1410\":2,\"1421\":1,\"1443\":1,\"1459\":1,\"1474\":2,\"1482\":3,\"1502\":1,\"1535\":1,\"1550\":1,\"1555\":1,\"1578\":1,\"1599\":1,\"1609\":3,\"1620\":1,\"1645\":1,\"1662\":1,\"1677\":2,\"1691\":1,\"1711\":1,\"1741\":1,\"1756\":1,\"1761\":1,\"1790\":2,\"1801\":1,\"1823\":1,\"1839\":1,\"1854\":2,\"1868\":1,\"1878\":3,\"1898\":1,\"1931\":1,\"1946\":1,\"1951\":1,\"1974\":1,\"1995\":1,\"2005\":3,\"2016\":1,\"2041\":1,\"2058\":1,\"2073\":2,\"2087\":1,\"2097\":3,\"2117\":1,\"2150\":1,\"2165\":1,\"2170\":1,\"2193\":1,\"2214\":1,\"2224\":3,\"2235\":1,\"2260\":1,\"2277\":1,\"2292\":2,\"2306\":1}}],[\"acknowledge\",{\"1\":{\"100\":1}}],[\"acknowledgement\",{\"1\":{\"100\":1}}],[\"actual\",{\"1\":{\"294\":1,\"344\":1,\"419\":1,\"570\":1,\"685\":1,\"788\":1,\"892\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1}}],[\"action\",{\"1\":{\"101\":1}}],[\"actions\",{\"1\":{\"49\":1}}],[\"activated\",{\"1\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1}}],[\"activity\",{\"1\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1}}],[\"activitydefinition\",{\"1\":{\"61\":4,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"actively\",{\"1\":{\"73\":1}}],[\"acts\",{\"1\":{\"53\":1,\"77\":1}}],[\"acquisition\",{\"1\":{\"14\":1}}],[\"accurate\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"accidental\",{\"1\":{\"101\":1}}],[\"accepts\",{\"1\":{\"675\":1,\"882\":1,\"1105\":1,\"1282\":1,\"1475\":1,\"1587\":1,\"1678\":1,\"1855\":1,\"1983\":1,\"2074\":1,\"2202\":1,\"2293\":1}}],[\"acceptable\",{\"1\":{\"505\":1,\"602\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1}}],[\"accept\",{\"1\":{\"73\":1}}],[\"accessing\",{\"1\":{\"76\":2,\"77\":1,\"99\":1,\"610\":1,\"677\":1,\"817\":1,\"884\":1,\"1040\":1,\"1107\":1,\"1217\":1,\"1284\":1,\"1410\":1,\"1477\":1,\"1588\":1,\"1609\":1,\"1680\":1,\"1790\":1,\"1857\":1,\"1984\":1,\"2005\":1,\"2076\":1,\"2203\":1,\"2224\":1,\"2295\":1}}],[\"accessible\",{\"1\":{\"0\":1,\"52\":2,\"53\":1,\"63\":2,\"81\":1,\"134\":2,\"157\":2,\"169\":1,\"181\":2,\"193\":1,\"217\":2,\"229\":1,\"247\":2,\"259\":1,\"277\":2,\"289\":1,\"323\":2,\"335\":1,\"369\":2,\"381\":1,\"610\":1,\"714\":2,\"726\":1,\"817\":1,\"937\":2,\"949\":1,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":1,\"1609\":1,\"1790\":1,\"1878\":1,\"2005\":1,\"2097\":1,\"2224\":1}}],[\"accessed\",{\"1\":{\"20\":1,\"55\":1}}],[\"access\",{\"0\":{\"25\":1,\"134\":1,\"157\":1,\"181\":1,\"217\":1,\"247\":1,\"277\":1,\"323\":1,\"369\":1,\"609\":1,\"714\":1,\"816\":1,\"937\":1,\"1039\":1,\"1216\":1,\"1409\":1,\"1481\":1,\"1608\":1,\"1789\":1,\"1877\":1,\"2004\":1,\"2096\":1,\"2223\":1},\"1\":{\"0\":2,\"6\":1,\"25\":1,\"49\":1,\"54\":1,\"63\":2,\"101\":1,\"127\":1,\"128\":1,\"134\":2,\"137\":2,\"150\":1,\"151\":1,\"157\":2,\"160\":3,\"165\":1,\"174\":1,\"175\":1,\"181\":2,\"184\":3,\"189\":1,\"192\":1,\"206\":1,\"207\":1,\"217\":2,\"220\":3,\"225\":1,\"236\":1,\"237\":1,\"247\":2,\"250\":3,\"255\":1,\"266\":1,\"267\":1,\"277\":2,\"280\":3,\"285\":1,\"312\":1,\"313\":1,\"323\":2,\"326\":3,\"331\":2,\"358\":1,\"359\":1,\"369\":2,\"372\":3,\"377\":1,\"385\":1,\"386\":1,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"476\":1,\"477\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"536\":1,\"537\":1,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"610\":3,\"613\":2,\"614\":1,\"616\":1,\"618\":3,\"629\":1,\"630\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"643\":1,\"674\":2,\"680\":1,\"703\":1,\"704\":1,\"714\":2,\"717\":3,\"722\":2,\"754\":1,\"755\":1,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"817\":3,\"820\":2,\"821\":1,\"823\":1,\"825\":3,\"836\":1,\"837\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"850\":1,\"881\":2,\"887\":1,\"926\":1,\"927\":1,\"937\":2,\"940\":3,\"945\":2,\"977\":1,\"978\":1,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"1040\":3,\"1043\":2,\"1044\":1,\"1046\":1,\"1048\":3,\"1059\":1,\"1060\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1073\":1,\"1104\":2,\"1110\":1,\"1138\":1,\"1139\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1217\":3,\"1220\":2,\"1221\":1,\"1223\":1,\"1225\":3,\"1236\":1,\"1237\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1250\":1,\"1281\":2,\"1287\":1,\"1331\":1,\"1332\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1410\":3,\"1413\":2,\"1414\":1,\"1416\":1,\"1418\":3,\"1429\":1,\"1430\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1443\":1,\"1474\":2,\"1480\":1,\"1482\":3,\"1485\":2,\"1486\":1,\"1488\":1,\"1490\":3,\"1518\":1,\"1519\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1578\":1,\"1586\":2,\"1591\":1,\"1609\":3,\"1612\":2,\"1613\":1,\"1615\":1,\"1617\":3,\"1628\":1,\"1629\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1645\":1,\"1677\":2,\"1683\":1,\"1727\":1,\"1728\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1790\":3,\"1793\":2,\"1794\":1,\"1796\":1,\"1798\":3,\"1809\":1,\"1810\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1823\":1,\"1854\":2,\"1860\":1,\"1878\":3,\"1881\":2,\"1882\":1,\"1884\":1,\"1886\":3,\"1914\":1,\"1915\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"1974\":1,\"1982\":2,\"1987\":1,\"2005\":3,\"2008\":2,\"2009\":1,\"2011\":1,\"2013\":3,\"2024\":1,\"2025\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2041\":1,\"2073\":2,\"2079\":1,\"2097\":3,\"2100\":2,\"2101\":1,\"2103\":1,\"2105\":3,\"2133\":1,\"2134\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2193\":1,\"2201\":2,\"2206\":1,\"2224\":3,\"2227\":2,\"2228\":1,\"2230\":1,\"2232\":3,\"2243\":1,\"2244\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1,\"2260\":1,\"2292\":2,\"2298\":1}}],[\"accordance\",{\"1\":{\"101\":1}}],[\"according\",{\"1\":{\"10\":1,\"89\":1,\"95\":1,\"143\":1,\"166\":1,\"190\":1,\"226\":3,\"256\":3,\"286\":3,\"293\":1,\"305\":2,\"332\":3,\"343\":1,\"355\":2,\"378\":3,\"684\":1,\"696\":2,\"723\":3,\"891\":1,\"903\":2,\"946\":3}}],[\"accomplished\",{\"1\":{\"64\":1}}],[\"across\",{\"1\":{\"0\":1,\"20\":1,\"21\":2,\"23\":1,\"62\":2,\"63\":1,\"80\":1,\"81\":1,\"89\":2}}],[\"aims\",{\"1\":{\"11\":1,\"21\":1}}],[\"aim\",{\"1\":{\"0\":1,\"10\":1,\"62\":2,\"91\":1}}],[\"aiming\",{\"1\":{\"0\":1,\"62\":1}}],[\"anonymized\",{\"1\":{\"302\":1,\"352\":1,\"693\":1,\"900\":1}}],[\"another\",{\"1\":{\"53\":1,\"58\":1,\"61\":1,\"486\":1,\"639\":1,\"804\":1,\"846\":1,\"1027\":1,\"1069\":1,\"1188\":1,\"1246\":1,\"1381\":1,\"1439\":1,\"1571\":1,\"1641\":1,\"1777\":1,\"1819\":1,\"1967\":1,\"2037\":1,\"2186\":1,\"2256\":1}}],[\"answering\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"answer\",{\"1\":{\"89\":1}}],[\"analysis\",{\"1\":{\"81\":1}}],[\"analyses\",{\"1\":{\"0\":1,\"23\":1}}],[\"anwendungen\",{\"0\":{\"36\":1}}],[\"anwendung\",{\"1\":{\"29\":1}}],[\"anymore\",{\"1\":{\"436\":1,\"587\":1,\"808\":1,\"1031\":1,\"1192\":1,\"1385\":1,\"1575\":1,\"1781\":1,\"1971\":1,\"2190\":1}}],[\"any\",{\"1\":{\"20\":1,\"27\":1,\"63\":1,\"66\":1,\"70\":1,\"71\":1,\"90\":1,\"97\":1,\"99\":1,\"102\":1,\"139\":2,\"162\":2,\"186\":2,\"222\":2,\"252\":2,\"282\":2,\"290\":1,\"300\":1,\"303\":1,\"305\":2,\"328\":2,\"340\":1,\"350\":1,\"353\":1,\"355\":2,\"374\":2,\"610\":1,\"681\":1,\"691\":1,\"694\":1,\"696\":2,\"719\":2,\"817\":1,\"888\":1,\"898\":1,\"901\":1,\"903\":2,\"942\":2,\"1040\":1,\"1217\":1,\"1410\":1,\"1482\":3,\"1489\":1,\"1609\":2,\"1790\":1,\"1878\":3,\"1885\":1,\"2005\":2,\"2097\":3,\"2104\":1,\"2224\":2}}],[\"anyone\",{\"1\":{\"5\":1}}],[\"an\",{\"1\":{\"1\":2,\"6\":1,\"31\":1,\"49\":1,\"50\":1,\"52\":2,\"53\":1,\"59\":2,\"61\":1,\"62\":1,\"63\":3,\"64\":3,\"66\":1,\"67\":1,\"73\":2,\"81\":2,\"82\":1,\"99\":1,\"125\":2,\"126\":2,\"128\":1,\"129\":2,\"140\":1,\"148\":2,\"149\":2,\"151\":1,\"152\":2,\"163\":1,\"172\":2,\"173\":2,\"175\":1,\"176\":2,\"187\":1,\"205\":1,\"207\":1,\"208\":1,\"212\":1,\"223\":1,\"235\":1,\"237\":1,\"238\":1,\"242\":1,\"253\":1,\"265\":1,\"267\":1,\"268\":1,\"272\":1,\"283\":1,\"300\":2,\"303\":2,\"305\":3,\"311\":1,\"313\":1,\"314\":1,\"318\":1,\"329\":1,\"350\":2,\"353\":2,\"355\":3,\"357\":1,\"359\":1,\"360\":1,\"364\":1,\"375\":1,\"418\":1,\"419\":1,\"486\":1,\"569\":1,\"570\":1,\"610\":2,\"618\":1,\"639\":1,\"643\":1,\"691\":2,\"694\":2,\"696\":3,\"702\":1,\"704\":1,\"705\":1,\"709\":1,\"720\":1,\"787\":1,\"788\":1,\"817\":2,\"825\":1,\"846\":1,\"898\":2,\"901\":2,\"903\":3,\"925\":1,\"927\":1,\"929\":1,\"930\":1,\"932\":1,\"943\":1,\"1010\":1,\"1011\":1,\"1040\":2,\"1048\":1,\"1069\":1,\"1171\":1,\"1172\":1,\"1217\":2,\"1225\":1,\"1246\":1,\"1364\":1,\"1365\":1,\"1410\":2,\"1418\":1,\"1439\":1,\"1482\":2,\"1490\":1,\"1554\":1,\"1555\":1,\"1609\":2,\"1617\":1,\"1641\":1,\"1760\":1,\"1761\":1,\"1790\":2,\"1798\":1,\"1819\":1,\"1878\":2,\"1886\":1,\"1950\":1,\"1951\":1,\"2005\":2,\"2013\":1,\"2037\":1,\"2097\":2,\"2105\":1,\"2169\":1,\"2170\":1,\"2224\":2,\"2232\":1,\"2256\":1}}],[\"annually\",{\"1\":{\"1\":1}}],[\"and\",{\"0\":{\"2\":1,\"11\":1,\"22\":1,\"25\":1,\"38\":1,\"51\":1,\"57\":1,\"61\":1,\"63\":1,\"614\":1,\"615\":1,\"821\":1,\"822\":1,\"1044\":1,\"1045\":1,\"1221\":1,\"1222\":1,\"1414\":1,\"1415\":1,\"1486\":1,\"1487\":1,\"1613\":1,\"1614\":1,\"1794\":1,\"1795\":1,\"1882\":1,\"1883\":1,\"2009\":1,\"2010\":1,\"2101\":1,\"2102\":1,\"2228\":1,\"2229\":1},\"1\":{\"0\":10,\"1\":1,\"4\":1,\"5\":1,\"10\":8,\"11\":4,\"13\":5,\"14\":3,\"15\":2,\"20\":5,\"21\":4,\"23\":3,\"24\":1,\"25\":3,\"26\":2,\"27\":1,\"28\":1,\"39\":3,\"42\":2,\"49\":4,\"52\":4,\"53\":2,\"54\":7,\"55\":1,\"57\":3,\"58\":9,\"59\":4,\"60\":4,\"61\":8,\"62\":18,\"63\":9,\"66\":1,\"67\":1,\"70\":1,\"73\":3,\"74\":7,\"76\":1,\"80\":7,\"81\":13,\"82\":2,\"84\":3,\"88\":3,\"89\":1,\"91\":1,\"92\":2,\"95\":4,\"97\":2,\"98\":2,\"99\":6,\"100\":4,\"102\":1,\"105\":1,\"106\":2,\"107\":1,\"108\":2,\"109\":1,\"110\":2,\"111\":1,\"112\":2,\"113\":1,\"114\":2,\"115\":1,\"116\":2,\"117\":1,\"118\":2,\"122\":1,\"123\":1,\"124\":2,\"126\":1,\"129\":2,\"132\":1,\"134\":3,\"137\":14,\"138\":11,\"139\":7,\"143\":3,\"147\":1,\"149\":1,\"152\":2,\"155\":1,\"157\":3,\"160\":14,\"161\":11,\"162\":7,\"166\":3,\"167\":1,\"170\":1,\"171\":2,\"173\":1,\"176\":2,\"179\":1,\"181\":3,\"184\":14,\"185\":11,\"186\":7,\"190\":3,\"191\":1,\"192\":1,\"193\":3,\"197\":1,\"201\":1,\"202\":1,\"203\":2,\"205\":1,\"207\":1,\"212\":1,\"215\":1,\"217\":3,\"220\":14,\"221\":11,\"222\":7,\"226\":10,\"227\":1,\"233\":1,\"235\":1,\"237\":1,\"242\":1,\"245\":1,\"247\":3,\"250\":14,\"251\":11,\"252\":7,\"256\":10,\"257\":1,\"263\":1,\"265\":1,\"267\":1,\"272\":1,\"275\":1,\"277\":3,\"280\":14,\"281\":11,\"282\":7,\"286\":10,\"287\":1,\"290\":2,\"291\":2,\"293\":3,\"296\":1,\"298\":1,\"300\":2,\"301\":5,\"302\":3,\"303\":8,\"304\":2,\"305\":20,\"309\":1,\"311\":1,\"313\":1,\"318\":1,\"321\":1,\"323\":3,\"326\":14,\"327\":11,\"328\":7,\"332\":10,\"333\":1,\"339\":1,\"340\":2,\"341\":2,\"343\":3,\"346\":1,\"348\":1,\"350\":2,\"351\":5,\"352\":3,\"353\":8,\"354\":2,\"355\":20,\"357\":1,\"359\":1,\"364\":1,\"367\":1,\"369\":3,\"372\":14,\"373\":11,\"374\":7,\"378\":10,\"379\":1,\"397\":1,\"402\":1,\"405\":1,\"406\":1,\"425\":1,\"445\":1,\"446\":1,\"458\":1,\"470\":1,\"473\":1,\"504\":1,\"506\":1,\"513\":1,\"514\":1,\"526\":1,\"548\":1,\"553\":1,\"556\":1,\"557\":1,\"576\":1,\"601\":1,\"603\":1,\"610\":5,\"613\":2,\"614\":3,\"616\":2,\"617\":2,\"618\":1,\"623\":1,\"626\":1,\"652\":1,\"653\":1,\"665\":1,\"674\":1,\"675\":1,\"676\":1,\"681\":2,\"682\":2,\"684\":3,\"687\":1,\"689\":1,\"691\":2,\"692\":5,\"693\":3,\"694\":8,\"695\":2,\"696\":20,\"700\":1,\"702\":1,\"704\":1,\"709\":1,\"712\":1,\"714\":3,\"717\":14,\"718\":11,\"719\":7,\"723\":10,\"724\":1,\"731\":1,\"732\":1,\"744\":1,\"767\":1,\"772\":1,\"775\":1,\"776\":1,\"794\":1,\"817\":5,\"820\":2,\"821\":3,\"823\":2,\"824\":2,\"825\":1,\"830\":1,\"833\":1,\"859\":1,\"860\":1,\"872\":1,\"881\":1,\"882\":1,\"883\":1,\"888\":2,\"889\":2,\"891\":3,\"894\":1,\"896\":1,\"898\":2,\"899\":5,\"900\":3,\"901\":8,\"902\":2,\"903\":20,\"907\":1,\"916\":1,\"918\":1,\"925\":1,\"927\":1,\"928\":1,\"929\":2,\"932\":1,\"935\":1,\"937\":3,\"940\":14,\"941\":11,\"942\":7,\"946\":10,\"947\":1,\"954\":1,\"955\":1,\"967\":1,\"990\":1,\"995\":1,\"998\":1,\"999\":1,\"1017\":1,\"1040\":5,\"1043\":2,\"1044\":3,\"1046\":2,\"1047\":2,\"1048\":1,\"1053\":1,\"1056\":1,\"1082\":1,\"1083\":1,\"1095\":1,\"1104\":1,\"1105\":1,\"1106\":1,\"1115\":1,\"1116\":1,\"1128\":1,\"1151\":1,\"1156\":1,\"1159\":1,\"1160\":1,\"1178\":1,\"1208\":1,\"1210\":1,\"1217\":5,\"1220\":2,\"1221\":3,\"1223\":2,\"1224\":2,\"1225\":1,\"1230\":1,\"1233\":1,\"1259\":1,\"1260\":1,\"1272\":1,\"1281\":1,\"1282\":1,\"1283\":1,\"1296\":1,\"1298\":1,\"1308\":1,\"1309\":1,\"1321\":1,\"1344\":1,\"1349\":1,\"1352\":1,\"1353\":1,\"1371\":1,\"1401\":1,\"1403\":1,\"1410\":5,\"1413\":2,\"1414\":3,\"1416\":2,\"1417\":2,\"1418\":1,\"1423\":1,\"1426\":1,\"1452\":1,\"1453\":1,\"1465\":1,\"1474\":1,\"1475\":1,\"1476\":1,\"1482\":3,\"1485\":2,\"1486\":3,\"1490\":2,\"1495\":1,\"1496\":1,\"1508\":1,\"1534\":1,\"1539\":1,\"1542\":1,\"1543\":1,\"1561\":1,\"1580\":2,\"1587\":1,\"1600\":1,\"1602\":1,\"1609\":5,\"1612\":2,\"1613\":3,\"1615\":2,\"1616\":2,\"1617\":1,\"1622\":1,\"1625\":1,\"1647\":2,\"1655\":1,\"1656\":1,\"1668\":1,\"1677\":1,\"1678\":1,\"1679\":1,\"1692\":1,\"1694\":1,\"1704\":1,\"1705\":1,\"1717\":1,\"1740\":1,\"1745\":1,\"1748\":1,\"1749\":1,\"1767\":1,\"1790\":5,\"1793\":2,\"1794\":3,\"1796\":2,\"1797\":2,\"1798\":1,\"1803\":1,\"1806\":1,\"1832\":1,\"1833\":1,\"1845\":1,\"1854\":1,\"1855\":1,\"1856\":1,\"1869\":1,\"1871\":1,\"1878\":3,\"1881\":2,\"1882\":3,\"1886\":2,\"1891\":1,\"1892\":1,\"1904\":1,\"1930\":1,\"1935\":1,\"1938\":1,\"1939\":1,\"1957\":1,\"1976\":2,\"1983\":1,\"1996\":1,\"1998\":1,\"2005\":5,\"2008\":2,\"2009\":3,\"2011\":2,\"2012\":2,\"2013\":1,\"2018\":1,\"2021\":1,\"2043\":2,\"2051\":1,\"2052\":1,\"2064\":1,\"2073\":1,\"2074\":1,\"2075\":1,\"2088\":1,\"2090\":1,\"2097\":3,\"2100\":2,\"2101\":3,\"2105\":2,\"2110\":1,\"2111\":1,\"2123\":1,\"2149\":1,\"2154\":1,\"2157\":1,\"2158\":1,\"2176\":1,\"2195\":2,\"2202\":1,\"2215\":1,\"2217\":1,\"2224\":5,\"2227\":2,\"2228\":3,\"2230\":2,\"2231\":2,\"2232\":1,\"2237\":1,\"2240\":1,\"2262\":2,\"2270\":1,\"2271\":1,\"2283\":1,\"2292\":1,\"2293\":1,\"2294\":1,\"2307\":1,\"2309\":1}}],[\"a\",{\"0\":{\"99\":1,\"119\":1,\"141\":1,\"144\":1,\"164\":1,\"188\":1,\"194\":1,\"198\":1,\"224\":1,\"230\":1,\"254\":1,\"260\":1,\"284\":1,\"306\":1,\"330\":1,\"336\":1,\"376\":1,\"697\":1,\"721\":1,\"904\":1,\"944\":1},\"1\":{\"0\":4,\"1\":2,\"8\":1,\"10\":2,\"11\":1,\"13\":1,\"21\":1,\"23\":2,\"24\":1,\"25\":1,\"27\":1,\"39\":4,\"41\":1,\"42\":1,\"49\":4,\"52\":6,\"53\":2,\"54\":1,\"55\":4,\"57\":1,\"58\":1,\"59\":5,\"60\":6,\"61\":9,\"62\":4,\"63\":5,\"64\":1,\"66\":3,\"67\":2,\"68\":1,\"69\":3,\"70\":1,\"71\":1,\"74\":4,\"76\":1,\"80\":2,\"81\":1,\"83\":2,\"88\":2,\"89\":3,\"90\":1,\"91\":1,\"92\":1,\"95\":2,\"99\":4,\"100\":1,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"119\":2,\"121\":1,\"122\":2,\"123\":2,\"126\":2,\"127\":1,\"128\":1,\"133\":1,\"134\":4,\"136\":1,\"137\":8,\"138\":7,\"139\":1,\"143\":2,\"144\":2,\"146\":1,\"147\":2,\"149\":2,\"150\":1,\"151\":1,\"156\":1,\"157\":4,\"159\":1,\"160\":6,\"161\":7,\"162\":1,\"166\":2,\"168\":1,\"169\":4,\"170\":2,\"173\":2,\"174\":1,\"175\":1,\"180\":1,\"181\":4,\"183\":1,\"184\":6,\"185\":7,\"186\":1,\"190\":2,\"192\":1,\"193\":5,\"194\":2,\"196\":1,\"197\":2,\"198\":2,\"200\":1,\"201\":2,\"202\":2,\"205\":2,\"206\":1,\"207\":1,\"216\":1,\"217\":4,\"219\":1,\"220\":6,\"221\":7,\"222\":1,\"226\":3,\"228\":1,\"229\":4,\"230\":2,\"232\":1,\"233\":2,\"235\":2,\"236\":1,\"237\":3,\"246\":1,\"247\":4,\"249\":1,\"250\":6,\"251\":7,\"252\":1,\"256\":3,\"258\":1,\"259\":4,\"260\":2,\"262\":1,\"263\":2,\"265\":2,\"266\":1,\"267\":3,\"276\":1,\"277\":4,\"279\":1,\"280\":6,\"281\":7,\"282\":1,\"286\":3,\"288\":1,\"289\":4,\"290\":1,\"291\":1,\"300\":3,\"301\":2,\"303\":7,\"304\":4,\"305\":7,\"306\":2,\"308\":1,\"309\":2,\"311\":2,\"312\":1,\"313\":3,\"322\":1,\"323\":4,\"325\":1,\"326\":6,\"327\":7,\"328\":1,\"332\":3,\"334\":1,\"335\":4,\"336\":2,\"338\":1,\"339\":2,\"340\":1,\"341\":1,\"350\":3,\"351\":2,\"353\":7,\"354\":4,\"355\":7,\"357\":2,\"358\":1,\"359\":3,\"368\":1,\"369\":4,\"371\":1,\"372\":6,\"373\":7,\"374\":1,\"378\":3,\"380\":1,\"381\":4,\"383\":1,\"390\":1,\"400\":1,\"401\":1,\"403\":2,\"404\":3,\"410\":1,\"411\":1,\"424\":1,\"433\":1,\"434\":1,\"439\":1,\"470\":2,\"471\":3,\"474\":1,\"483\":1,\"493\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"534\":1,\"541\":1,\"551\":1,\"552\":1,\"554\":2,\"555\":3,\"561\":1,\"562\":1,\"575\":1,\"584\":1,\"585\":1,\"590\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"610\":10,\"611\":2,\"617\":3,\"618\":2,\"623\":2,\"624\":3,\"627\":1,\"636\":1,\"643\":1,\"647\":1,\"677\":2,\"681\":1,\"682\":1,\"691\":3,\"692\":2,\"694\":7,\"695\":4,\"696\":7,\"697\":2,\"699\":1,\"700\":2,\"702\":2,\"703\":1,\"704\":3,\"713\":1,\"714\":4,\"716\":1,\"717\":6,\"718\":7,\"719\":1,\"723\":3,\"725\":1,\"726\":4,\"752\":1,\"759\":1,\"770\":1,\"771\":1,\"773\":2,\"774\":3,\"779\":1,\"780\":1,\"793\":1,\"805\":1,\"806\":1,\"809\":1,\"812\":1,\"817\":10,\"818\":2,\"824\":3,\"825\":2,\"830\":2,\"831\":3,\"834\":1,\"843\":1,\"854\":1,\"884\":2,\"888\":1,\"889\":1,\"898\":3,\"899\":2,\"901\":7,\"902\":4,\"903\":7,\"904\":2,\"906\":1,\"907\":2,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"925\":2,\"926\":1,\"927\":3,\"930\":1,\"936\":1,\"937\":4,\"939\":1,\"940\":6,\"941\":7,\"942\":1,\"946\":3,\"948\":1,\"949\":4,\"975\":1,\"982\":1,\"993\":1,\"994\":1,\"996\":2,\"997\":3,\"1002\":1,\"1003\":1,\"1016\":1,\"1028\":1,\"1029\":1,\"1032\":1,\"1035\":1,\"1040\":10,\"1041\":2,\"1047\":3,\"1048\":2,\"1053\":2,\"1054\":3,\"1057\":1,\"1066\":1,\"1077\":1,\"1107\":2,\"1136\":1,\"1143\":1,\"1154\":1,\"1155\":1,\"1157\":2,\"1158\":3,\"1163\":1,\"1164\":1,\"1177\":1,\"1189\":1,\"1190\":1,\"1193\":1,\"1196\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1217\":10,\"1218\":2,\"1224\":3,\"1225\":2,\"1230\":2,\"1231\":3,\"1234\":1,\"1243\":1,\"1254\":1,\"1284\":2,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1329\":1,\"1336\":1,\"1347\":1,\"1348\":1,\"1350\":2,\"1351\":3,\"1356\":1,\"1357\":1,\"1370\":1,\"1382\":1,\"1383\":1,\"1386\":1,\"1389\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1410\":10,\"1411\":2,\"1417\":3,\"1418\":2,\"1423\":2,\"1424\":3,\"1427\":1,\"1436\":1,\"1447\":1,\"1477\":2,\"1482\":8,\"1483\":2,\"1490\":2,\"1516\":1,\"1523\":1,\"1537\":1,\"1538\":1,\"1540\":2,\"1541\":3,\"1546\":1,\"1547\":1,\"1560\":1,\"1572\":1,\"1573\":1,\"1576\":1,\"1580\":1,\"1583\":1,\"1588\":2,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1609\":10,\"1610\":2,\"1616\":3,\"1617\":2,\"1622\":2,\"1623\":3,\"1626\":1,\"1635\":1,\"1647\":1,\"1650\":1,\"1680\":2,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1725\":1,\"1732\":1,\"1743\":1,\"1744\":1,\"1746\":2,\"1747\":3,\"1752\":1,\"1753\":1,\"1766\":1,\"1778\":1,\"1779\":1,\"1782\":1,\"1785\":1,\"1790\":10,\"1791\":2,\"1797\":3,\"1798\":2,\"1803\":2,\"1804\":3,\"1807\":1,\"1816\":1,\"1827\":1,\"1857\":2,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1878\":8,\"1879\":2,\"1886\":2,\"1912\":1,\"1919\":1,\"1933\":1,\"1934\":1,\"1936\":2,\"1937\":3,\"1942\":1,\"1943\":1,\"1956\":1,\"1968\":1,\"1969\":1,\"1972\":1,\"1976\":1,\"1979\":1,\"1984\":2,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"2005\":10,\"2006\":2,\"2012\":3,\"2013\":2,\"2018\":2,\"2019\":3,\"2022\":1,\"2031\":1,\"2043\":1,\"2046\":1,\"2076\":2,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2097\":8,\"2098\":2,\"2105\":2,\"2131\":1,\"2138\":1,\"2152\":1,\"2153\":1,\"2155\":2,\"2156\":3,\"2161\":1,\"2162\":1,\"2175\":1,\"2187\":1,\"2188\":1,\"2191\":1,\"2195\":1,\"2198\":1,\"2203\":2,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2224\":10,\"2225\":2,\"2231\":3,\"2232\":2,\"2237\":2,\"2238\":3,\"2241\":1,\"2250\":1,\"2262\":1,\"2265\":1,\"2295\":2,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1}}],[\"dts\",{\"1\":{\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"dth\",{\"1\":{\"55\":1}}],[\"dn\",{\"0\":{\"505\":1,\"602\":1,\"917\":1,\"1209\":1,\"1297\":1,\"1402\":1,\"1601\":1,\"1693\":1,\"1870\":1,\"1997\":1,\"2089\":1,\"2216\":1,\"2308\":1},\"1\":{\"505\":1,\"602\":1,\"613\":1,\"820\":1,\"917\":1,\"1043\":1,\"1209\":1,\"1220\":1,\"1297\":1,\"1402\":1,\"1413\":1,\"1485\":1,\"1601\":1,\"1612\":1,\"1693\":1,\"1793\":1,\"1870\":1,\"1881\":1,\"1997\":1,\"2008\":1,\"2089\":1,\"2100\":1,\"2216\":1,\"2227\":1,\"2308\":1}}],[\"dns\",{\"1\":{\"76\":1}}],[\"dgpg\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"d\",{\"1\":{\"74\":1,\"76\":1,\"77\":1,\"132\":1,\"133\":1,\"137\":1,\"138\":1,\"155\":1,\"156\":1,\"160\":1,\"161\":1,\"168\":1,\"169\":1,\"179\":1,\"180\":1,\"184\":1,\"185\":1,\"192\":1,\"193\":1,\"215\":1,\"216\":1,\"220\":1,\"221\":1,\"226\":1,\"228\":1,\"229\":1,\"245\":1,\"246\":1,\"250\":1,\"251\":1,\"256\":1,\"258\":1,\"259\":1,\"275\":1,\"276\":1,\"280\":1,\"281\":1,\"286\":1,\"288\":1,\"289\":1,\"305\":1,\"321\":1,\"322\":1,\"326\":1,\"327\":1,\"332\":1,\"334\":1,\"335\":1,\"355\":1,\"367\":1,\"368\":1,\"372\":1,\"373\":1,\"378\":1,\"380\":1,\"381\":1,\"696\":1,\"712\":1,\"713\":1,\"717\":1,\"718\":1,\"723\":1,\"725\":1,\"726\":1,\"903\":1,\"935\":1,\"936\":1,\"940\":1,\"941\":1,\"946\":1,\"948\":1,\"949\":1}}],[\"dfn\",{\"1\":{\"74\":3,\"76\":3,\"77\":3,\"133\":4,\"137\":3,\"156\":4,\"160\":2,\"180\":4,\"184\":2,\"216\":4,\"220\":2,\"246\":4,\"250\":2,\"276\":4,\"280\":2,\"322\":4,\"326\":2,\"368\":4,\"372\":2,\"713\":4,\"717\":2,\"936\":4,\"940\":2}}],[\"dbstatement\",{\"0\":{\"1528\":1,\"1638\":1,\"1924\":1,\"2034\":1,\"2143\":1,\"2253\":1},\"1\":{\"1528\":1,\"1638\":1,\"1924\":1,\"2034\":1,\"2143\":1,\"2253\":1}}],[\"db\",{\"0\":{\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"387\":1,\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"538\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"756\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"979\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1},\"1\":{\"63\":3,\"137\":3,\"138\":3,\"160\":3,\"161\":3,\"184\":3,\"185\":3,\"220\":3,\"221\":3,\"250\":3,\"251\":3,\"280\":3,\"281\":3,\"326\":3,\"327\":3,\"372\":3,\"373\":3,\"383\":2,\"384\":1,\"385\":3,\"386\":1,\"387\":2,\"388\":1,\"389\":3,\"390\":2,\"391\":1,\"392\":3,\"393\":1,\"474\":2,\"475\":1,\"476\":3,\"477\":1,\"478\":2,\"479\":1,\"480\":3,\"481\":1,\"482\":3,\"483\":2,\"484\":1,\"534\":2,\"535\":1,\"536\":3,\"537\":1,\"538\":2,\"539\":1,\"540\":3,\"541\":2,\"542\":1,\"543\":3,\"544\":1,\"627\":2,\"628\":1,\"629\":3,\"630\":1,\"631\":2,\"632\":1,\"633\":3,\"634\":1,\"635\":3,\"636\":2,\"637\":1,\"717\":3,\"718\":3,\"752\":2,\"753\":1,\"754\":3,\"755\":1,\"756\":2,\"757\":1,\"758\":3,\"759\":2,\"760\":1,\"761\":3,\"762\":1,\"834\":2,\"835\":1,\"836\":3,\"837\":1,\"838\":2,\"839\":1,\"840\":3,\"841\":1,\"842\":3,\"843\":2,\"844\":1,\"940\":3,\"941\":3,\"975\":2,\"976\":1,\"977\":3,\"978\":1,\"979\":2,\"980\":1,\"981\":3,\"982\":2,\"983\":1,\"984\":3,\"985\":1,\"1057\":2,\"1058\":1,\"1059\":3,\"1060\":1,\"1061\":2,\"1062\":1,\"1063\":3,\"1064\":1,\"1065\":3,\"1066\":2,\"1067\":1,\"1136\":2,\"1137\":1,\"1138\":3,\"1139\":1,\"1140\":2,\"1141\":1,\"1142\":3,\"1143\":2,\"1144\":1,\"1145\":3,\"1146\":1,\"1234\":2,\"1235\":1,\"1236\":3,\"1237\":1,\"1238\":2,\"1239\":1,\"1240\":3,\"1241\":1,\"1242\":3,\"1243\":2,\"1244\":1,\"1329\":2,\"1330\":1,\"1331\":3,\"1332\":1,\"1333\":2,\"1334\":1,\"1335\":3,\"1336\":2,\"1337\":1,\"1338\":3,\"1339\":1,\"1427\":2,\"1428\":1,\"1429\":3,\"1430\":1,\"1431\":2,\"1432\":1,\"1433\":3,\"1434\":1,\"1435\":3,\"1436\":2,\"1437\":1,\"1516\":2,\"1517\":1,\"1518\":3,\"1519\":1,\"1520\":2,\"1521\":1,\"1522\":3,\"1523\":2,\"1524\":1,\"1525\":3,\"1526\":1,\"1528\":1,\"1626\":2,\"1627\":1,\"1628\":3,\"1629\":1,\"1630\":2,\"1631\":1,\"1632\":3,\"1633\":1,\"1634\":3,\"1635\":2,\"1636\":1,\"1638\":1,\"1725\":2,\"1726\":1,\"1727\":3,\"1728\":1,\"1729\":2,\"1730\":1,\"1731\":3,\"1732\":2,\"1733\":1,\"1734\":3,\"1735\":1,\"1807\":2,\"1808\":1,\"1809\":3,\"1810\":1,\"1811\":2,\"1812\":1,\"1813\":3,\"1814\":1,\"1815\":3,\"1816\":2,\"1817\":1,\"1912\":2,\"1913\":1,\"1914\":3,\"1915\":1,\"1916\":2,\"1917\":1,\"1918\":3,\"1919\":2,\"1920\":1,\"1921\":3,\"1922\":1,\"1924\":1,\"2022\":2,\"2023\":1,\"2024\":3,\"2025\":1,\"2026\":2,\"2027\":1,\"2028\":3,\"2029\":1,\"2030\":3,\"2031\":2,\"2032\":1,\"2034\":1,\"2131\":2,\"2132\":1,\"2133\":3,\"2134\":1,\"2135\":2,\"2136\":1,\"2137\":3,\"2138\":2,\"2139\":1,\"2140\":3,\"2141\":1,\"2143\":1,\"2241\":2,\"2242\":1,\"2243\":3,\"2244\":1,\"2245\":2,\"2246\":1,\"2247\":3,\"2248\":1,\"2249\":3,\"2250\":2,\"2251\":1,\"2253\":1}}],[\"dmu=data\",{\"1\":{\"62\":1}}],[\"dmz\",{\"0\":{\"56\":1,\"64\":1},\"1\":{\"52\":1,\"64\":1,\"73\":1}}],[\"dmsen\",{\"1\":{\"31\":2}}],[\"dms\",{\"1\":{\"31\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"during\",{\"1\":{\"71\":1,\"138\":3,\"161\":3,\"185\":3,\"221\":3,\"251\":3,\"281\":3,\"302\":1,\"327\":3,\"352\":1,\"373\":3,\"394\":1,\"395\":1,\"396\":1,\"432\":1,\"433\":1,\"434\":1,\"436\":1,\"505\":1,\"545\":1,\"546\":1,\"547\":1,\"583\":1,\"584\":1,\"585\":1,\"587\":1,\"602\":1,\"693\":1,\"718\":3,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"804\":1,\"805\":1,\"806\":1,\"808\":1,\"900\":1,\"917\":1,\"941\":3,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1031\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1192\":1,\"1209\":1,\"1297\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1385\":1,\"1402\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1575\":1,\"1601\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1693\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1781\":1,\"1870\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1971\":1,\"1997\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2089\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2190\":1,\"2216\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2308\":1}}],[\"durchgeführt\",{\"1\":{\"32\":1}}],[\"durchzuführen\",{\"1\":{\"31\":1}}],[\"dugas\",{\"1\":{\"39\":1}}],[\"dabei\",{\"1\":{\"32\":1}}],[\"dazu\",{\"1\":{\"31\":1}}],[\"dafür\",{\"1\":{\"31\":1}}],[\"dass\",{\"1\":{\"31\":1}}],[\"das\",{\"1\":{\"30\":2}}],[\"datenausleitung\",{\"1\":{\"32\":1}}],[\"date\",{\"0\":{\"6\":1},\"1\":{\"63\":2,\"95\":1}}],[\"datasharingframework\",{\"1\":{\"168\":4,\"169\":2,\"192\":4,\"193\":2,\"209\":2,\"228\":4,\"229\":2,\"239\":2,\"258\":4,\"259\":2,\"269\":2,\"288\":4,\"289\":2,\"315\":2,\"334\":4,\"335\":2,\"361\":2,\"380\":4,\"381\":2,\"678\":1,\"706\":2,\"725\":4,\"726\":2,\"885\":1,\"948\":4,\"949\":2,\"1108\":1,\"1285\":1,\"1478\":1,\"1589\":1,\"1681\":1,\"1858\":1,\"1985\":1,\"2077\":1,\"2204\":1,\"2296\":1}}],[\"datasets\",{\"1\":{\"91\":1}}],[\"database\",{\"1\":{\"63\":2,\"137\":1,\"138\":1,\"160\":1,\"161\":1,\"184\":1,\"185\":1,\"220\":1,\"221\":1,\"250\":1,\"251\":1,\"280\":1,\"281\":1,\"298\":1,\"326\":1,\"327\":1,\"348\":1,\"372\":1,\"373\":1,\"385\":2,\"386\":2,\"387\":2,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"476\":2,\"477\":2,\"478\":2,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"536\":2,\"537\":2,\"538\":2,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"629\":2,\"630\":2,\"631\":2,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"689\":1,\"717\":1,\"718\":1,\"754\":2,\"755\":2,\"756\":2,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"836\":2,\"837\":2,\"838\":2,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"896\":1,\"940\":1,\"941\":1,\"977\":2,\"978\":2,\"979\":2,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"1059\":2,\"1060\":2,\"1061\":2,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1138\":2,\"1139\":2,\"1140\":2,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1236\":2,\"1237\":2,\"1238\":2,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1331\":2,\"1332\":2,\"1333\":2,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1429\":2,\"1430\":2,\"1431\":2,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1518\":2,\"1519\":2,\"1520\":2,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1628\":2,\"1629\":2,\"1630\":2,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1727\":2,\"1728\":2,\"1729\":2,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1809\":2,\"1810\":2,\"1811\":2,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1914\":2,\"1915\":2,\"1916\":2,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"2024\":2,\"2025\":2,\"2026\":2,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2133\":2,\"2134\":2,\"2135\":2,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2243\":2,\"2244\":2,\"2245\":2,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1}}],[\"data\",{\"0\":{\"0\":1,\"10\":1,\"23\":1,\"24\":1,\"37\":1,\"92\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1},\"1\":{\"0\":7,\"1\":1,\"10\":3,\"11\":1,\"12\":1,\"14\":4,\"20\":3,\"21\":4,\"23\":3,\"24\":3,\"25\":2,\"26\":1,\"27\":2,\"29\":4,\"30\":1,\"32\":3,\"35\":2,\"37\":1,\"39\":6,\"41\":1,\"42\":2,\"49\":1,\"52\":1,\"53\":1,\"54\":2,\"55\":6,\"58\":6,\"59\":3,\"61\":1,\"62\":11,\"63\":2,\"73\":1,\"80\":1,\"81\":6,\"82\":2,\"88\":4,\"89\":7,\"90\":3,\"91\":2,\"92\":4,\"97\":1,\"98\":1,\"99\":1,\"101\":1,\"102\":1,\"105\":2,\"107\":2,\"109\":2,\"111\":2,\"113\":2,\"115\":2,\"117\":2,\"123\":2,\"170\":2,\"202\":2,\"270\":2,\"290\":2,\"291\":1,\"302\":8,\"303\":2,\"316\":2,\"340\":2,\"341\":1,\"352\":8,\"353\":2,\"362\":2,\"681\":2,\"682\":1,\"693\":8,\"694\":2,\"707\":4,\"888\":2,\"889\":1,\"900\":8,\"901\":2,\"929\":2,\"931\":4}}],[\"d37q\",{\"1\":{\"29\":1}}],[\"drives\",{\"1\":{\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"drug\",{\"1\":{\"88\":1}}],[\"drops\",{\"1\":{\"53\":1}}],[\"dr\",{\"1\":{\"18\":1}}],[\"diversification\",{\"1\":{\"291\":1,\"341\":1,\"682\":1,\"889\":1}}],[\"divide\",{\"1\":{\"58\":1}}],[\"dialog\",{\"1\":{\"237\":1,\"267\":1,\"313\":1,\"359\":1,\"704\":1,\"927\":1}}],[\"diagnoses\",{\"1\":{\"88\":1}}],[\"diagramm\",{\"1\":{\"63\":1,\"64\":1}}],[\"diagram\",{\"1\":{\"52\":1}}],[\"directroy\",{\"0\":{\"435\":1,\"586\":1,\"807\":1,\"1030\":1,\"1191\":1,\"1384\":1,\"1574\":1,\"1780\":1,\"1970\":1,\"2189\":1},\"1\":{\"435\":1,\"586\":1,\"807\":1,\"1030\":1,\"1191\":1,\"1384\":1,\"1574\":1,\"1780\":1,\"1970\":1,\"2189\":1}}],[\"direct\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"303\":1,\"332\":1,\"353\":1,\"378\":1,\"694\":1,\"723\":1,\"901\":1,\"946\":1}}],[\"directories\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"226\":1,\"252\":1,\"256\":1,\"282\":1,\"286\":1,\"328\":1,\"332\":1,\"374\":1,\"378\":1,\"719\":1,\"723\":1,\"942\":1,\"946\":1}}],[\"directory\",{\"1\":{\"137\":1,\"138\":1,\"139\":1,\"160\":1,\"161\":1,\"162\":1,\"168\":1,\"169\":1,\"184\":1,\"185\":1,\"186\":1,\"192\":1,\"193\":1,\"220\":1,\"221\":1,\"222\":1,\"228\":1,\"229\":1,\"250\":1,\"251\":1,\"252\":1,\"258\":1,\"259\":1,\"280\":1,\"281\":1,\"282\":1,\"288\":1,\"289\":1,\"326\":1,\"327\":1,\"328\":1,\"334\":1,\"335\":1,\"372\":1,\"373\":1,\"374\":1,\"380\":1,\"381\":1,\"435\":2,\"586\":2,\"717\":1,\"718\":1,\"719\":1,\"725\":1,\"726\":1,\"807\":2,\"940\":1,\"941\":1,\"942\":1,\"948\":1,\"949\":1,\"1030\":2,\"1191\":2,\"1384\":2,\"1574\":2,\"1780\":2,\"1970\":2,\"2189\":2}}],[\"directly\",{\"1\":{\"27\":1,\"55\":1,\"291\":1,\"303\":1,\"341\":1,\"353\":1,\"682\":1,\"694\":1,\"889\":1,\"901\":1}}],[\"diligently\",{\"1\":{\"100\":1}}],[\"distinguish\",{\"1\":{\"1580\":1,\"1647\":1,\"1976\":1,\"2043\":1,\"2195\":1,\"2262\":1}}],[\"distributed\",{\"0\":{\"23\":1},\"1\":{\"0\":1,\"20\":1,\"23\":1,\"39\":5,\"42\":2,\"52\":1,\"61\":1,\"62\":2,\"74\":1,\"80\":2,\"81\":3,\"84\":2,\"89\":1,\"126\":2,\"149\":2,\"173\":2,\"205\":2,\"235\":2,\"265\":2,\"311\":2,\"357\":2,\"702\":2,\"925\":2}}],[\"distribute\",{\"1\":{\"0\":1,\"62\":1}}],[\"disable\",{\"1\":{\"490\":1,\"644\":1,\"851\":1,\"1074\":1,\"1251\":1,\"1444\":1,\"1579\":1,\"1646\":1,\"1824\":1,\"1975\":1,\"2042\":1,\"2194\":1,\"2261\":1}}],[\"displayed\",{\"1\":{\"419\":1,\"570\":1,\"788\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1555\":1,\"1761\":1,\"1951\":1,\"2170\":1}}],[\"discussions\",{\"1\":{\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"disclose\",{\"1\":{\"99\":1}}],[\"disclosure\",{\"0\":{\"96\":1,\"98\":1},\"1\":{\"98\":2}}],[\"discovered\",{\"1\":{\"97\":1}}],[\"difference\",{\"1\":{\"290\":1,\"340\":1,\"681\":1,\"888\":1}}],[\"different\",{\"1\":{\"21\":1,\"23\":1,\"49\":2,\"54\":1,\"58\":2,\"60\":1,\"61\":1,\"62\":1,\"66\":1,\"68\":1,\"76\":1,\"80\":1,\"81\":1,\"129\":1,\"152\":1,\"176\":1,\"207\":1,\"212\":1,\"237\":1,\"242\":1,\"267\":1,\"272\":1,\"313\":1,\"318\":1,\"359\":1,\"364\":1,\"390\":1,\"483\":1,\"541\":1,\"636\":1,\"704\":1,\"709\":1,\"759\":1,\"843\":1,\"927\":1,\"932\":1,\"982\":1,\"1066\":1,\"1143\":1,\"1243\":1,\"1336\":1,\"1436\":1,\"1523\":1,\"1635\":1,\"1732\":1,\"1816\":1,\"1919\":1,\"2031\":1,\"2138\":1,\"2250\":1}}],[\"difficulties\",{\"1\":{\"84\":1}}],[\"dizen\",{\"1\":{\"31\":1}}],[\"diz\",{\"1\":{\"29\":1}}],[\"die\",{\"1\":{\"29\":3,\"31\":4,\"32\":1}}],[\"diesem\",{\"1\":{\"30\":1,\"31\":1}}],[\"diese\",{\"1\":{\"29\":1}}],[\"dics\",{\"1\":{\"62\":4}}],[\"dic1fhirstore\",{\"1\":{\"37\":1}}],[\"dic\",{\"1\":{\"10\":1,\"55\":3,\"62\":1,\"92\":1,\"617\":1,\"824\":1,\"1047\":1,\"1224\":1,\"1417\":1,\"1616\":1,\"1797\":1,\"2012\":1,\"2231\":1}}],[\"digitally\",{\"1\":{\"62\":1}}],[\"digital\",{\"1\":{\"10\":1,\"13\":1}}],[\"domains\",{\"1\":{\"437\":1,\"439\":1,\"491\":1,\"493\":1,\"588\":1,\"590\":1,\"645\":1,\"647\":1,\"810\":1,\"812\":1,\"852\":1,\"854\":1,\"1033\":1,\"1035\":1,\"1075\":1,\"1077\":1,\"1194\":1,\"1196\":1,\"1252\":1,\"1254\":1,\"1387\":1,\"1389\":1,\"1445\":1,\"1447\":1,\"1581\":1,\"1583\":1,\"1648\":1,\"1650\":1,\"1783\":1,\"1785\":1,\"1825\":1,\"1827\":1,\"1977\":1,\"1979\":1,\"2044\":1,\"2046\":1,\"2196\":1,\"2198\":1,\"2263\":1,\"2265\":1}}],[\"down\",{\"1\":{\"143\":1,\"166\":1,\"190\":1,\"226\":1,\"256\":1,\"286\":1,\"332\":1,\"378\":1,\"723\":1,\"946\":1}}],[\"downwards\",{\"1\":{\"106\":1,\"108\":1,\"110\":1,\"112\":1,\"114\":1,\"116\":1,\"118\":1,\"124\":1,\"171\":1,\"203\":1}}],[\"downloaded\",{\"1\":{\"293\":2,\"343\":2,\"684\":2,\"891\":2}}],[\"download\",{\"1\":{\"31\":1,\"63\":2,\"132\":2,\"137\":3,\"138\":5,\"155\":2,\"160\":3,\"161\":5,\"179\":2,\"184\":3,\"185\":5,\"209\":1,\"215\":2,\"220\":3,\"221\":5,\"239\":1,\"245\":2,\"250\":3,\"251\":5,\"269\":1,\"275\":2,\"280\":3,\"281\":5,\"315\":1,\"321\":2,\"326\":3,\"327\":5,\"361\":1,\"367\":2,\"372\":3,\"373\":5,\"706\":1,\"712\":2,\"717\":3,\"718\":5,\"931\":2,\"935\":2,\"940\":3,\"941\":5}}],[\"does\",{\"1\":{\"63\":1,\"299\":1,\"349\":1,\"419\":1,\"570\":1,\"690\":1,\"788\":1,\"897\":1,\"1011\":1,\"1172\":1,\"1365\":1,\"1489\":1,\"1555\":1,\"1761\":1,\"1885\":1,\"1951\":1,\"2104\":1,\"2170\":1}}],[\"docs\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"docker\",{\"0\":{\"132\":2,\"155\":2,\"179\":2,\"215\":2,\"245\":2,\"275\":2,\"298\":1,\"321\":2,\"348\":1,\"367\":2,\"689\":1,\"712\":2,\"896\":1,\"935\":2},\"1\":{\"63\":1,\"132\":14,\"137\":14,\"138\":8,\"139\":2,\"155\":14,\"160\":13,\"161\":8,\"162\":2,\"167\":1,\"168\":3,\"169\":3,\"179\":14,\"184\":13,\"185\":8,\"186\":2,\"191\":1,\"192\":4,\"193\":4,\"215\":14,\"220\":13,\"221\":8,\"222\":2,\"227\":1,\"228\":3,\"229\":3,\"245\":14,\"250\":13,\"251\":8,\"252\":2,\"257\":1,\"258\":3,\"259\":3,\"275\":14,\"280\":13,\"281\":8,\"282\":2,\"287\":1,\"288\":3,\"289\":3,\"298\":1,\"321\":14,\"326\":13,\"327\":8,\"328\":2,\"333\":1,\"334\":3,\"335\":3,\"348\":1,\"367\":14,\"372\":13,\"373\":8,\"374\":2,\"379\":1,\"380\":3,\"381\":3,\"385\":1,\"387\":2,\"389\":1,\"392\":1,\"397\":1,\"398\":1,\"399\":1,\"406\":1,\"413\":1,\"414\":1,\"415\":1,\"420\":1,\"425\":1,\"426\":1,\"429\":1,\"438\":1,\"442\":1,\"443\":1,\"451\":1,\"452\":1,\"453\":1,\"456\":1,\"458\":1,\"463\":2,\"465\":1,\"467\":1,\"468\":1,\"469\":1,\"472\":1,\"476\":1,\"478\":2,\"480\":1,\"482\":1,\"492\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"510\":1,\"511\":1,\"519\":1,\"520\":1,\"521\":1,\"524\":1,\"526\":1,\"531\":2,\"533\":1,\"536\":1,\"538\":2,\"540\":1,\"543\":1,\"548\":1,\"549\":1,\"550\":1,\"557\":1,\"564\":1,\"565\":1,\"566\":1,\"571\":1,\"576\":1,\"577\":1,\"580\":1,\"589\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"620\":1,\"621\":1,\"622\":1,\"625\":1,\"629\":1,\"631\":2,\"633\":1,\"635\":1,\"646\":1,\"649\":1,\"650\":1,\"658\":1,\"659\":1,\"660\":1,\"663\":1,\"665\":1,\"670\":2,\"672\":1,\"689\":1,\"712\":14,\"717\":13,\"718\":8,\"719\":2,\"724\":1,\"725\":3,\"726\":3,\"728\":1,\"729\":1,\"737\":1,\"738\":1,\"739\":1,\"742\":1,\"744\":1,\"749\":2,\"751\":1,\"754\":1,\"756\":2,\"758\":1,\"761\":1,\"767\":1,\"768\":1,\"769\":1,\"776\":1,\"782\":1,\"783\":1,\"784\":1,\"789\":1,\"794\":1,\"795\":1,\"798\":1,\"811\":1,\"827\":1,\"828\":1,\"829\":1,\"832\":1,\"836\":1,\"838\":2,\"840\":1,\"842\":1,\"853\":1,\"856\":1,\"857\":1,\"865\":1,\"866\":1,\"867\":1,\"870\":1,\"872\":1,\"877\":2,\"879\":1,\"896\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"931\":2,\"935\":14,\"940\":13,\"941\":8,\"942\":2,\"947\":1,\"948\":3,\"949\":3,\"951\":1,\"952\":1,\"960\":1,\"961\":1,\"962\":1,\"965\":1,\"967\":1,\"972\":2,\"974\":1,\"977\":1,\"979\":2,\"981\":1,\"984\":1,\"990\":1,\"991\":1,\"992\":1,\"999\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1012\":1,\"1017\":1,\"1018\":1,\"1021\":1,\"1034\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1055\":1,\"1059\":1,\"1061\":2,\"1063\":1,\"1065\":1,\"1076\":1,\"1079\":1,\"1080\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1093\":1,\"1095\":1,\"1100\":2,\"1102\":1,\"1112\":1,\"1113\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1126\":1,\"1128\":1,\"1133\":2,\"1135\":1,\"1138\":1,\"1140\":2,\"1142\":1,\"1145\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1160\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1173\":1,\"1178\":1,\"1179\":1,\"1182\":1,\"1195\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1232\":1,\"1236\":1,\"1238\":2,\"1240\":1,\"1242\":1,\"1253\":1,\"1256\":1,\"1257\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1270\":1,\"1272\":1,\"1277\":2,\"1279\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1305\":1,\"1306\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1319\":1,\"1321\":1,\"1326\":2,\"1328\":1,\"1331\":1,\"1333\":2,\"1335\":1,\"1338\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1353\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1366\":1,\"1371\":1,\"1372\":1,\"1375\":1,\"1388\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1425\":1,\"1429\":1,\"1431\":2,\"1433\":1,\"1435\":1,\"1446\":1,\"1449\":1,\"1450\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1463\":1,\"1465\":1,\"1470\":2,\"1472\":1,\"1492\":1,\"1493\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1506\":1,\"1508\":1,\"1513\":2,\"1515\":1,\"1518\":1,\"1520\":2,\"1522\":1,\"1525\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1543\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1556\":1,\"1561\":1,\"1562\":1,\"1565\":1,\"1582\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1624\":1,\"1628\":1,\"1630\":2,\"1632\":1,\"1634\":1,\"1649\":1,\"1652\":1,\"1653\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1666\":1,\"1668\":1,\"1673\":2,\"1675\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1701\":1,\"1702\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1715\":1,\"1717\":1,\"1722\":2,\"1724\":1,\"1727\":1,\"1729\":2,\"1731\":1,\"1734\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1749\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1762\":1,\"1767\":1,\"1768\":1,\"1771\":1,\"1784\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1805\":1,\"1809\":1,\"1811\":2,\"1813\":1,\"1815\":1,\"1826\":1,\"1829\":1,\"1830\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1843\":1,\"1845\":1,\"1850\":2,\"1852\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1888\":1,\"1889\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1902\":1,\"1904\":1,\"1909\":2,\"1911\":1,\"1914\":1,\"1916\":2,\"1918\":1,\"1921\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1939\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1952\":1,\"1957\":1,\"1958\":1,\"1961\":1,\"1978\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2020\":1,\"2024\":1,\"2026\":2,\"2028\":1,\"2030\":1,\"2045\":1,\"2048\":1,\"2049\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2062\":1,\"2064\":1,\"2069\":2,\"2071\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2107\":1,\"2108\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2121\":1,\"2123\":1,\"2128\":2,\"2130\":1,\"2133\":1,\"2135\":2,\"2137\":1,\"2140\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2158\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2171\":1,\"2176\":1,\"2177\":1,\"2180\":1,\"2197\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2239\":1,\"2243\":1,\"2245\":2,\"2247\":1,\"2249\":1,\"2264\":1,\"2267\":1,\"2268\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2281\":1,\"2283\":1,\"2288\":2,\"2290\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1}}],[\"documented\",{\"1\":{\"129\":1,\"152\":1,\"176\":1,\"212\":1,\"242\":1,\"272\":1,\"318\":1,\"364\":1,\"709\":1,\"932\":1}}],[\"documentreference\",{\"1\":{\"61\":1}}],[\"documentation\",{\"0\":{\"43\":1,\"303\":1,\"353\":1,\"694\":1,\"901\":1},\"1\":{\"7\":1,\"28\":1,\"44\":1,\"60\":1,\"119\":1,\"122\":1,\"125\":1,\"129\":1,\"134\":1,\"144\":1,\"147\":1,\"148\":1,\"152\":1,\"157\":1,\"172\":1,\"176\":1,\"181\":1,\"192\":1,\"194\":1,\"197\":1,\"198\":1,\"201\":1,\"212\":1,\"217\":1,\"226\":1,\"230\":1,\"233\":1,\"242\":1,\"247\":1,\"256\":1,\"260\":1,\"263\":1,\"272\":1,\"277\":1,\"286\":1,\"303\":7,\"305\":6,\"306\":1,\"309\":1,\"318\":1,\"323\":1,\"332\":1,\"336\":1,\"339\":1,\"353\":7,\"355\":6,\"364\":1,\"369\":1,\"378\":1,\"694\":7,\"696\":6,\"697\":1,\"700\":1,\"709\":1,\"714\":1,\"723\":1,\"901\":7,\"903\":6,\"904\":1,\"907\":1,\"932\":1,\"937\":1,\"946\":1}}],[\"do\",{\"1\":{\"49\":2,\"61\":4,\"99\":3,\"143\":4,\"166\":4,\"190\":4,\"226\":3,\"256\":3,\"286\":3,\"332\":3,\"378\":3,\"439\":1,\"493\":1,\"590\":1,\"647\":1,\"723\":3,\"812\":1,\"854\":1,\"946\":3,\"1035\":1,\"1077\":1,\"1196\":1,\"1254\":1,\"1389\":1,\"1447\":1,\"1583\":1,\"1650\":1,\"1785\":1,\"1827\":1,\"1979\":1,\"2046\":1,\"2198\":1,\"2265\":1}}],[\"done\",{\"1\":{\"61\":2}}],[\"don\",{\"1\":{\"27\":1,\"61\":1,\"137\":1,\"192\":1,\"303\":1,\"353\":1,\"387\":1,\"435\":1,\"478\":1,\"486\":1,\"538\":1,\"586\":1,\"631\":1,\"639\":1,\"694\":1,\"756\":1,\"807\":1,\"838\":1,\"846\":1,\"901\":1,\"979\":1,\"1030\":1,\"1061\":1,\"1069\":1,\"1140\":1,\"1191\":1,\"1238\":1,\"1246\":1,\"1333\":1,\"1384\":1,\"1431\":1,\"1439\":1,\"1520\":1,\"1574\":1,\"1630\":1,\"1641\":1,\"1729\":1,\"1780\":1,\"1811\":1,\"1819\":1,\"1916\":1,\"1970\":1,\"2026\":1,\"2037\":1,\"2135\":1,\"2189\":1,\"2245\":1,\"2256\":1}}],[\"doi\",{\"1\":{\"1\":1,\"39\":9}}],[\"depending\",{\"1\":{\"432\":1,\"583\":1,\"804\":1,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1}}],[\"deploying\",{\"1\":{\"929\":1}}],[\"deploy\",{\"1\":{\"66\":1,\"432\":1,\"583\":1,\"804\":1,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1}}],[\"deployment\",{\"0\":{\"26\":1,\"55\":1,\"931\":1},\"1\":{\"55\":1,\"92\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1}}],[\"deployed\",{\"1\":{\"20\":1,\"26\":1,\"54\":1,\"55\":1,\"66\":1,\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"436\":2,\"587\":2,\"703\":1,\"808\":2,\"926\":1,\"1031\":2,\"1192\":2,\"1385\":2,\"1575\":2,\"1781\":2,\"1971\":2,\"2190\":2}}],[\"decrypt\",{\"1\":{\"399\":1,\"415\":1,\"426\":1,\"453\":1,\"469\":1,\"521\":1,\"550\":1,\"566\":1,\"577\":1,\"622\":1,\"660\":1,\"739\":1,\"769\":1,\"784\":1,\"795\":1,\"829\":1,\"867\":1,\"962\":1,\"992\":1,\"1007\":1,\"1018\":1,\"1052\":1,\"1090\":1,\"1123\":1,\"1153\":1,\"1168\":1,\"1179\":1,\"1229\":1,\"1267\":1,\"1316\":1,\"1346\":1,\"1361\":1,\"1372\":1,\"1422\":1,\"1460\":1,\"1503\":1,\"1536\":1,\"1551\":1,\"1562\":1,\"1621\":1,\"1663\":1,\"1712\":1,\"1742\":1,\"1757\":1,\"1768\":1,\"1802\":1,\"1840\":1,\"1899\":1,\"1932\":1,\"1947\":1,\"1958\":1,\"2017\":1,\"2059\":1,\"2118\":1,\"2151\":1,\"2166\":1,\"2177\":1,\"2236\":1,\"2278\":1}}],[\"deciding\",{\"1\":{\"63\":1}}],[\"decision\",{\"1\":{\"0\":1,\"63\":1,\"82\":1}}],[\"determine\",{\"1\":{\"299\":1,\"349\":1,\"690\":1,\"897\":1}}],[\"detailled\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"detailed\",{\"1\":{\"80\":1,\"99\":1,\"305\":2,\"355\":2,\"696\":2,\"903\":2}}],[\"detail\",{\"1\":{\"53\":1}}],[\"details\",{\"1\":{\"31\":1,\"32\":1,\"57\":1,\"127\":1,\"150\":1,\"174\":1,\"206\":1,\"236\":1,\"266\":1,\"312\":1,\"358\":1,\"703\":1,\"926\":1,\"929\":1}}],[\"debugging\",{\"1\":{\"139\":1,\"162\":1,\"186\":1,\"222\":1,\"252\":1,\"282\":1,\"328\":1,\"374\":1,\"719\":1,\"942\":1}}],[\"debug\",{\"0\":{\"394\":1,\"395\":1,\"396\":1,\"545\":1,\"546\":1,\"547\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2252\":1,\"2253\":1,\"2254\":1},\"1\":{\"138\":1,\"161\":1,\"185\":1,\"221\":1,\"251\":1,\"281\":1,\"327\":1,\"373\":1,\"394\":3,\"395\":3,\"396\":3,\"419\":2,\"545\":3,\"546\":3,\"547\":3,\"570\":2,\"718\":1,\"763\":3,\"764\":3,\"765\":3,\"766\":3,\"788\":2,\"941\":1,\"986\":3,\"987\":3,\"988\":3,\"989\":3,\"1011\":2,\"1147\":3,\"1148\":3,\"1149\":3,\"1150\":3,\"1172\":2,\"1340\":3,\"1341\":3,\"1342\":3,\"1343\":3,\"1365\":2,\"1527\":3,\"1528\":3,\"1529\":3,\"1530\":3,\"1531\":3,\"1532\":3,\"1533\":3,\"1555\":2,\"1637\":3,\"1638\":3,\"1639\":3,\"1736\":3,\"1737\":3,\"1738\":3,\"1739\":3,\"1761\":2,\"1923\":3,\"1924\":3,\"1925\":3,\"1926\":3,\"1927\":3,\"1928\":3,\"1929\":3,\"1951\":2,\"2033\":3,\"2034\":3,\"2035\":3,\"2142\":3,\"2143\":3,\"2144\":3,\"2145\":3,\"2146\":3,\"2147\":3,\"2148\":3,\"2170\":2,\"2252\":3,\"2253\":3,\"2254\":3}}],[\"deb\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"dearmor\",{\"1\":{\"132\":1,\"155\":1,\"179\":1,\"215\":1,\"245\":1,\"275\":1,\"321\":1,\"367\":1,\"712\":1,\"935\":1}}],[\"delve\",{\"1\":{\"81\":1}}],[\"delivery\",{\"1\":{\"80\":1,\"81\":1}}],[\"deletes\",{\"1\":{\"481\":1,\"482\":1,\"483\":1,\"634\":1,\"635\":1,\"636\":1,\"841\":1,\"842\":1,\"843\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2248\":1,\"2249\":1,\"2250\":1}}],[\"delete\",{\"0\":{\"481\":1,\"482\":2,\"483\":1,\"634\":1,\"635\":2,\"636\":1,\"841\":1,\"842\":2,\"843\":1,\"1064\":1,\"1065\":2,\"1066\":1,\"1241\":1,\"1242\":2,\"1243\":1,\"1434\":1,\"1435\":2,\"1436\":1,\"1633\":1,\"1634\":2,\"1635\":1,\"1814\":1,\"1815\":2,\"1816\":1,\"2029\":1,\"2030\":2,\"2031\":1,\"2248\":1,\"2249\":2,\"2250\":1},\"1\":{\"137\":1,\"160\":1,\"184\":1,\"193\":1,\"220\":1,\"250\":1,\"280\":1,\"326\":1,\"372\":1,\"481\":2,\"482\":3,\"483\":2,\"616\":2,\"618\":2,\"634\":2,\"635\":3,\"636\":2,\"717\":1,\"823\":2,\"825\":2,\"841\":2,\"842\":3,\"843\":2,\"940\":1,\"1046\":2,\"1048\":2,\"1064\":2,\"1065\":3,\"1066\":2,\"1223\":2,\"1225\":2,\"1241\":2,\"1242\":3,\"1243\":2,\"1416\":2,\"1418\":2,\"1434\":2,\"1435\":3,\"1436\":2,\"1615\":2,\"1617\":2,\"1633\":2,\"1634\":3,\"1635\":2,\"1796\":2,\"1798\":2,\"1814\":2,\"1815\":3,\"1816\":2,\"2011\":2,\"2013\":2,\"2029\":2,\"2030\":3,\"2031\":2,\"2230\":2,\"2232\":2,\"2248\":2,\"2249\":3,\"2250\":2}}],[\"deleted\",{\"1\":{\"54\":1}}],[\"delegates\",{\"1\":{\"915\":1,\"1207\":1,\"1295\":1,\"1400\":1,\"1599\":1,\"1691\":1,\"1868\":1,\"1995\":1,\"2087\":1,\"2214\":1,\"2306\":1}}],[\"delegate\",{\"1\":{\"63\":1}}],[\"definition\",{\"1\":{\"192\":1,\"193\":1}}],[\"define\",{\"1\":{\"616\":1,\"823\":1,\"1046\":1,\"1223\":1,\"1416\":1,\"1488\":1,\"1615\":1,\"1796\":1,\"1884\":1,\"2011\":1,\"2103\":1,\"2230\":1}}],[\"defines\",{\"1\":{\"49\":1,\"58\":2,\"618\":2,\"825\":2,\"1048\":2,\"1225\":2,\"1418\":2,\"1490\":2,\"1617\":2,\"1798\":2,\"1886\":2,\"2013\":2,\"2105\":2,\"2232\":2}}],[\"defined\",{\"1\":{\"11\":1,\"73\":1,\"192\":1,\"193\":1,\"617\":1,\"643\":1,\"824\":1,\"850\":1,\"1047\":1,\"1073\":1,\"1224\":1,\"1250\":1,\"1417\":1,\"1443\":1,\"1578\":1,\"1616\":1,\"1645\":1,\"1797\":1,\"1823\":1,\"1974\":1,\"2012\":1,\"2041\":1,\"2193\":1,\"2231\":1,\"2260\":1}}],[\"default\",{\"1\":{\"69\":1,\"133\":1,\"139\":1,\"156\":1,\"162\":1,\"180\":1,\"186\":1,\"192\":1,\"216\":1,\"222\":1,\"246\":1,\"252\":1,\"276\":1,\"282\":1,\"322\":1,\"328\":1,\"368\":1,\"374\":1,\"383\":1,\"384\":2,\"386\":1,\"388\":1,\"390\":1,\"391\":1,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"400\":2,\"401\":2,\"402\":1,\"403\":2,\"404\":2,\"405\":1,\"407\":1,\"410\":1,\"411\":1,\"412\":1,\"418\":1,\"419\":1,\"421\":1,\"423\":1,\"424\":1,\"431\":1,\"433\":1,\"434\":1,\"435\":1,\"442\":2,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"454\":1,\"455\":1,\"463\":2,\"464\":1,\"465\":1,\"470\":2,\"471\":2,\"473\":1,\"474\":1,\"475\":2,\"477\":1,\"479\":1,\"481\":1,\"483\":1,\"484\":1,\"486\":1,\"488\":1,\"490\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"510\":2,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"522\":1,\"523\":1,\"531\":2,\"532\":1,\"533\":1,\"534\":1,\"535\":2,\"537\":1,\"539\":1,\"541\":1,\"542\":1,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"551\":2,\"552\":2,\"553\":1,\"554\":2,\"555\":2,\"556\":1,\"558\":1,\"561\":1,\"562\":1,\"563\":1,\"569\":1,\"570\":1,\"572\":1,\"574\":1,\"575\":1,\"582\":1,\"584\":1,\"585\":1,\"586\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"606\":1,\"623\":2,\"624\":2,\"626\":1,\"627\":1,\"628\":2,\"630\":1,\"632\":1,\"634\":1,\"636\":1,\"637\":1,\"639\":1,\"642\":1,\"644\":1,\"649\":2,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"661\":1,\"662\":1,\"670\":2,\"671\":1,\"672\":1,\"674\":2,\"677\":1,\"713\":1,\"719\":1,\"728\":2,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"740\":1,\"741\":1,\"749\":2,\"750\":1,\"751\":1,\"752\":1,\"753\":2,\"755\":1,\"757\":1,\"759\":1,\"760\":1,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"770\":2,\"771\":2,\"772\":1,\"773\":2,\"774\":2,\"775\":1,\"777\":1,\"779\":1,\"780\":1,\"781\":1,\"787\":1,\"788\":1,\"790\":1,\"792\":1,\"793\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"805\":1,\"806\":1,\"807\":1,\"809\":1,\"830\":2,\"831\":2,\"833\":1,\"834\":1,\"835\":2,\"837\":1,\"839\":1,\"841\":1,\"843\":1,\"844\":1,\"846\":1,\"849\":1,\"851\":1,\"856\":2,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"868\":1,\"869\":1,\"877\":2,\"878\":1,\"879\":1,\"881\":2,\"884\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"921\":1,\"936\":1,\"942\":1,\"951\":2,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"963\":1,\"964\":1,\"972\":2,\"973\":1,\"974\":1,\"975\":1,\"976\":2,\"978\":1,\"980\":1,\"982\":1,\"983\":1,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"993\":2,\"994\":2,\"995\":1,\"996\":2,\"997\":2,\"998\":1,\"1000\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1010\":1,\"1011\":1,\"1013\":1,\"1015\":1,\"1016\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1032\":1,\"1053\":2,\"1054\":2,\"1056\":1,\"1057\":1,\"1058\":2,\"1060\":1,\"1062\":1,\"1064\":1,\"1066\":1,\"1067\":1,\"1069\":1,\"1072\":1,\"1074\":1,\"1079\":2,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1091\":1,\"1092\":1,\"1100\":2,\"1101\":1,\"1102\":1,\"1104\":2,\"1107\":1,\"1112\":2,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1124\":1,\"1125\":1,\"1133\":2,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":2,\"1139\":1,\"1141\":1,\"1143\":1,\"1144\":1,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1154\":2,\"1155\":2,\"1156\":1,\"1157\":2,\"1158\":2,\"1159\":1,\"1161\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1171\":1,\"1172\":1,\"1174\":1,\"1176\":1,\"1177\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1193\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1213\":1,\"1230\":2,\"1231\":2,\"1233\":1,\"1234\":1,\"1235\":2,\"1237\":1,\"1239\":1,\"1241\":1,\"1243\":1,\"1244\":1,\"1246\":1,\"1249\":1,\"1251\":1,\"1256\":2,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1268\":1,\"1269\":1,\"1277\":2,\"1278\":1,\"1279\":1,\"1281\":2,\"1284\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1301\":1,\"1305\":2,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1317\":1,\"1318\":1,\"1326\":2,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":2,\"1332\":1,\"1334\":1,\"1336\":1,\"1337\":1,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1347\":2,\"1348\":2,\"1349\":1,\"1350\":2,\"1351\":2,\"1352\":1,\"1354\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1364\":1,\"1365\":1,\"1367\":1,\"1369\":1,\"1370\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1386\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1406\":1,\"1423\":2,\"1424\":2,\"1426\":1,\"1427\":1,\"1428\":2,\"1430\":1,\"1432\":1,\"1434\":1,\"1436\":1,\"1437\":1,\"1439\":1,\"1442\":1,\"1444\":1,\"1449\":2,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1461\":1,\"1462\":1,\"1470\":2,\"1471\":1,\"1472\":1,\"1474\":2,\"1477\":1,\"1492\":2,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1504\":1,\"1505\":1,\"1513\":2,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":2,\"1519\":1,\"1521\":1,\"1523\":1,\"1524\":1,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1537\":2,\"1538\":2,\"1539\":1,\"1540\":2,\"1541\":2,\"1542\":1,\"1544\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1554\":1,\"1555\":1,\"1557\":1,\"1559\":1,\"1560\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1576\":1,\"1577\":1,\"1579\":1,\"1586\":2,\"1588\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1605\":1,\"1622\":2,\"1623\":2,\"1625\":1,\"1626\":1,\"1627\":2,\"1629\":1,\"1631\":1,\"1633\":1,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1641\":1,\"1644\":1,\"1646\":1,\"1652\":2,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1664\":1,\"1665\":1,\"1673\":2,\"1674\":1,\"1675\":1,\"1677\":2,\"1680\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1697\":1,\"1701\":2,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1713\":1,\"1714\":1,\"1722\":2,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":2,\"1728\":1,\"1730\":1,\"1732\":1,\"1733\":1,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1743\":2,\"1744\":2,\"1745\":1,\"1746\":2,\"1747\":2,\"1748\":1,\"1750\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1760\":1,\"1761\":1,\"1763\":1,\"1765\":1,\"1766\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1782\":1,\"1803\":2,\"1804\":2,\"1806\":1,\"1807\":1,\"1808\":2,\"1810\":1,\"1812\":1,\"1814\":1,\"1816\":1,\"1817\":1,\"1819\":1,\"1822\":1,\"1824\":1,\"1829\":2,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1841\":1,\"1842\":1,\"1850\":2,\"1851\":1,\"1852\":1,\"1854\":2,\"1857\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1874\":1,\"1888\":2,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1900\":1,\"1901\":1,\"1909\":2,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":2,\"1915\":1,\"1917\":1,\"1919\":1,\"1920\":1,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1933\":2,\"1934\":2,\"1935\":1,\"1936\":2,\"1937\":2,\"1938\":1,\"1940\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1950\":1,\"1951\":1,\"1953\":1,\"1955\":1,\"1956\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1972\":1,\"1973\":1,\"1975\":1,\"1982\":2,\"1984\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"2001\":1,\"2018\":2,\"2019\":2,\"2021\":1,\"2022\":1,\"2023\":2,\"2025\":1,\"2027\":1,\"2029\":1,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2037\":1,\"2040\":1,\"2042\":1,\"2048\":2,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2060\":1,\"2061\":1,\"2069\":2,\"2070\":1,\"2071\":1,\"2073\":2,\"2076\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2093\":1,\"2107\":2,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2119\":1,\"2120\":1,\"2128\":2,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":2,\"2134\":1,\"2136\":1,\"2138\":1,\"2139\":1,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2152\":2,\"2153\":2,\"2154\":1,\"2155\":2,\"2156\":2,\"2157\":1,\"2159\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2169\":1,\"2170\":1,\"2172\":1,\"2174\":1,\"2175\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2191\":1,\"2192\":1,\"2194\":1,\"2201\":2,\"2203\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2220\":1,\"2237\":2,\"2238\":2,\"2240\":1,\"2241\":1,\"2242\":2,\"2244\":1,\"2246\":1,\"2248\":1,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2256\":1,\"2259\":1,\"2261\":1,\"2267\":2,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2279\":1,\"2280\":1,\"2288\":2,\"2289\":1,\"2290\":1,\"2292\":2,\"2295\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1,\"2312\":1}}],[\"dedicated\",{\"1\":{\"63\":1}}],[\"deeper\",{\"1\":{\"57\":1}}],[\"demilitarised\",{\"1\":{\"52\":1}}],[\"demonstrate\",{\"1\":{\"80\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"demonstrating\",{\"1\":{\"26\":1}}],[\"demo\",{\"1\":{\"37\":1}}],[\"demodaten\",{\"0\":{\"37\":1}}],[\"dem\",{\"1\":{\"30\":1,\"31\":1}}],[\"deny\",{\"1\":{\"137\":2,\"160\":2,\"184\":2,\"220\":2,\"250\":2,\"280\":2,\"326\":2,\"372\":2,\"717\":2,\"940\":2}}],[\"den\",{\"1\":{\"29\":2,\"31\":1,\"37\":1}}],[\"dev\",{\"0\":{\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"387\":1,\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":2,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":2,\"439\":1,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":2,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"469\":2,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":2,\"493\":1,\"494\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":2,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"538\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":2,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":2,\"590\":1,\"591\":1,\"620\":1,\"621\":1,\"622\":2,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":2,\"647\":1,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":2,\"670\":1,\"671\":1,\"672\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":2,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"756\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":2,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":2,\"812\":1,\"813\":1,\"827\":1,\"828\":1,\"829\":2,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":2,\"854\":1,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":2,\"877\":1,\"878\":1,\"879\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":2,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"979\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":2,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":2,\"1035\":1,\"1036\":1,\"1050\":1,\"1051\":1,\"1052\":2,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":2,\"1077\":1,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":2,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":2,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":2,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":2,\"1196\":1,\"1197\":1,\"1227\":1,\"1228\":1,\"1229\":2,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":2,\"1254\":1,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":2,\"1277\":1,\"1278\":1,\"1279\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":2,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":2,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":2,\"1389\":1,\"1390\":1,\"1420\":1,\"1421\":1,\"1422\":2,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":2,\"1447\":1,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":2,\"1470\":1,\"1471\":1,\"1472\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":2,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":2,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":2,\"1583\":1,\"1584\":1,\"1619\":1,\"1620\":1,\"1621\":2,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":2,\"1650\":1,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":2,\"1673\":1,\"1674\":1,\"1675\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":2,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":2,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":2,\"1785\":1,\"1786\":1,\"1800\":1,\"1801\":1,\"1802\":2,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":2,\"1827\":1,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":2,\"1850\":1,\"1851\":1,\"1852\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":2,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":2,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":2,\"1979\":1,\"1980\":1,\"2015\":1,\"2016\":1,\"2017\":2,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":2,\"2046\":1,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":2,\"2069\":1,\"2070\":1,\"2071\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":2,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":2,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":2,\"2198\":1,\"2199\":1,\"2234\":1,\"2235\":1,\"2236\":2,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":2,\"2265\":1,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":2,\"2288\":1,\"2289\":1,\"2290\":1},\"1\":{\"29\":1,\"103\":1,\"132\":1,\"137\":7,\"138\":4,\"155\":1,\"160\":6,\"161\":4,\"179\":1,\"184\":6,\"185\":4,\"192\":3,\"193\":1,\"215\":1,\"220\":6,\"221\":4,\"226\":1,\"245\":1,\"250\":6,\"251\":3,\"256\":1,\"275\":1,\"280\":6,\"281\":3,\"286\":1,\"321\":1,\"326\":6,\"327\":3,\"332\":1,\"367\":1,\"372\":6,\"373\":3,\"378\":1,\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"387\":1,\"388\":1,\"389\":2,\"390\":2,\"391\":1,\"392\":2,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":3,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":2,\"414\":4,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":3,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":2,\"430\":2,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":2,\"439\":2,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":4,\"446\":4,\"447\":1,\"448\":2,\"449\":2,\"450\":2,\"451\":1,\"452\":3,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":3,\"469\":2,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":2,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":2,\"493\":2,\"494\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":4,\"514\":4,\"515\":1,\"516\":2,\"517\":2,\"518\":2,\"519\":1,\"520\":3,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"538\":1,\"539\":1,\"540\":2,\"541\":2,\"542\":1,\"543\":2,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":3,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":2,\"565\":4,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":3,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":2,\"581\":2,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":2,\"590\":2,\"591\":1,\"610\":4,\"617\":1,\"618\":5,\"620\":1,\"621\":3,\"622\":2,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":2,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":2,\"647\":2,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":4,\"653\":4,\"654\":1,\"655\":2,\"656\":2,\"657\":2,\"658\":1,\"659\":3,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"671\":1,\"672\":1,\"675\":7,\"676\":2,\"677\":2,\"678\":7,\"712\":1,\"717\":6,\"718\":3,\"723\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":4,\"732\":4,\"733\":1,\"734\":2,\"735\":2,\"736\":2,\"737\":1,\"738\":3,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"756\":1,\"757\":1,\"758\":2,\"759\":2,\"760\":1,\"761\":2,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":3,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":2,\"783\":4,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":3,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":2,\"799\":2,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":2,\"812\":2,\"813\":1,\"817\":4,\"824\":1,\"825\":5,\"827\":1,\"828\":3,\"829\":2,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":2,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":2,\"854\":2,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":4,\"860\":4,\"861\":1,\"862\":2,\"863\":2,\"864\":2,\"865\":1,\"866\":3,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"878\":1,\"879\":1,\"882\":7,\"883\":2,\"884\":2,\"885\":7,\"935\":1,\"940\":6,\"941\":3,\"946\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":4,\"955\":4,\"956\":1,\"957\":2,\"958\":2,\"959\":2,\"960\":1,\"961\":3,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"979\":1,\"980\":1,\"981\":2,\"982\":2,\"983\":1,\"984\":2,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":3,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":2,\"1006\":4,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":3,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":2,\"1022\":2,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":2,\"1035\":2,\"1036\":1,\"1040\":4,\"1047\":1,\"1048\":5,\"1050\":1,\"1051\":3,\"1052\":2,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":2,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":2,\"1077\":2,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":4,\"1083\":4,\"1084\":1,\"1085\":2,\"1086\":2,\"1087\":2,\"1088\":1,\"1089\":3,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1105\":7,\"1106\":2,\"1107\":2,\"1108\":7,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":4,\"1116\":4,\"1117\":1,\"1118\":2,\"1119\":2,\"1120\":2,\"1121\":1,\"1122\":3,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":2,\"1144\":1,\"1145\":2,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":3,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":2,\"1167\":4,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":3,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":2,\"1183\":2,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":2,\"1196\":2,\"1197\":1,\"1217\":4,\"1224\":1,\"1225\":5,\"1227\":1,\"1228\":3,\"1229\":2,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":2,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":2,\"1254\":2,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":4,\"1260\":4,\"1261\":1,\"1262\":2,\"1263\":2,\"1264\":2,\"1265\":1,\"1266\":3,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1282\":7,\"1283\":2,\"1284\":2,\"1285\":7,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":4,\"1309\":4,\"1310\":1,\"1311\":2,\"1312\":2,\"1313\":2,\"1314\":1,\"1315\":3,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":2,\"1337\":1,\"1338\":2,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":3,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":2,\"1360\":4,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":3,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":2,\"1376\":2,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":2,\"1389\":2,\"1390\":1,\"1410\":4,\"1417\":1,\"1418\":5,\"1420\":1,\"1421\":3,\"1422\":2,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":2,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":2,\"1447\":2,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":4,\"1453\":4,\"1454\":1,\"1455\":2,\"1456\":2,\"1457\":2,\"1458\":1,\"1459\":3,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1475\":7,\"1476\":2,\"1477\":2,\"1478\":7,\"1482\":3,\"1490\":3,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":4,\"1496\":4,\"1497\":1,\"1498\":2,\"1499\":2,\"1500\":2,\"1501\":1,\"1502\":3,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":2,\"1524\":1,\"1525\":2,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":3,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":2,\"1550\":4,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":3,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":2,\"1566\":2,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":3,\"1581\":1,\"1582\":2,\"1583\":2,\"1584\":1,\"1587\":7,\"1588\":2,\"1589\":7,\"1609\":4,\"1616\":1,\"1617\":5,\"1619\":1,\"1620\":3,\"1621\":2,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":2,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":3,\"1648\":1,\"1649\":2,\"1650\":2,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":4,\"1656\":4,\"1657\":1,\"1658\":2,\"1659\":2,\"1660\":2,\"1661\":1,\"1662\":3,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1678\":7,\"1679\":2,\"1680\":2,\"1681\":7,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":4,\"1705\":4,\"1706\":1,\"1707\":2,\"1708\":2,\"1709\":2,\"1710\":1,\"1711\":3,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":2,\"1733\":1,\"1734\":2,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":3,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":2,\"1756\":4,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":3,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":2,\"1772\":2,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":2,\"1785\":2,\"1786\":1,\"1790\":4,\"1797\":1,\"1798\":5,\"1800\":1,\"1801\":3,\"1802\":2,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":2,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":2,\"1827\":2,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":4,\"1833\":4,\"1834\":1,\"1835\":2,\"1836\":2,\"1837\":2,\"1838\":1,\"1839\":3,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1855\":7,\"1856\":2,\"1857\":2,\"1858\":7,\"1878\":3,\"1886\":3,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":4,\"1892\":4,\"1893\":1,\"1894\":2,\"1895\":2,\"1896\":2,\"1897\":1,\"1898\":3,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":2,\"1920\":1,\"1921\":2,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":3,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":2,\"1946\":4,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":3,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":2,\"1962\":2,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":3,\"1977\":1,\"1978\":2,\"1979\":2,\"1980\":1,\"1983\":7,\"1984\":2,\"1985\":7,\"2005\":4,\"2012\":1,\"2013\":5,\"2015\":1,\"2016\":3,\"2017\":2,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":2,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":3,\"2044\":1,\"2045\":2,\"2046\":2,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":4,\"2052\":4,\"2053\":1,\"2054\":2,\"2055\":2,\"2056\":2,\"2057\":1,\"2058\":3,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2074\":7,\"2075\":2,\"2076\":2,\"2077\":7,\"2097\":3,\"2105\":3,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":4,\"2111\":4,\"2112\":1,\"2113\":2,\"2114\":2,\"2115\":2,\"2116\":1,\"2117\":3,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":2,\"2139\":1,\"2140\":2,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":3,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":2,\"2165\":4,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":3,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":2,\"2181\":2,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":3,\"2196\":1,\"2197\":2,\"2198\":2,\"2199\":1,\"2202\":7,\"2203\":2,\"2204\":7,\"2224\":4,\"2231\":1,\"2232\":5,\"2234\":1,\"2235\":3,\"2236\":2,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":2,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":3,\"2263\":1,\"2264\":2,\"2265\":2,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":4,\"2271\":4,\"2272\":1,\"2273\":2,\"2274\":2,\"2275\":2,\"2276\":1,\"2277\":3,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2289\":1,\"2290\":1,\"2293\":7,\"2294\":2,\"2295\":2,\"2296\":7}}],[\"developer\",{\"1\":{\"304\":1,\"354\":1,\"695\":1,\"902\":1}}],[\"developers\",{\"1\":{\"59\":1,\"80\":1,\"81\":1,\"82\":1,\"301\":1,\"351\":1,\"692\":1,\"899\":1}}],[\"developed\",{\"1\":{\"11\":1,\"62\":1,\"73\":1,\"81\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"170\":1,\"202\":1}}],[\"develop\",{\"0\":{\"120\":1,\"145\":1,\"195\":1,\"199\":1,\"231\":1,\"261\":1,\"307\":1,\"337\":1,\"698\":1,\"905\":1},\"1\":{\"7\":1,\"10\":1,\"37\":1,\"294\":1,\"305\":2,\"344\":1,\"355\":2,\"685\":1,\"696\":2,\"892\":1,\"903\":2}}],[\"developments\",{\"1\":{\"81\":1}}],[\"development\",{\"0\":{\"11\":1,\"78\":1,\"302\":1,\"352\":1,\"693\":1,\"900\":1},\"1\":{\"7\":1,\"10\":3,\"11\":2,\"12\":1,\"13\":1,\"97\":1,\"301\":1,\"302\":3,\"305\":2,\"351\":1,\"352\":3,\"355\":2,\"394\":1,\"395\":1,\"396\":1,\"490\":1,\"545\":1,\"546\":1,\"547\":1,\"644\":1,\"692\":1,\"693\":3,\"696\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"851\":1,\"899\":1,\"900\":3,\"903\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"1074\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1251\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1444\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1579\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1646\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1824\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1975\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2042\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2194\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2261\":1}}],[\"desire\",{\"1\":{\"300\":1,\"350\":1,\"691\":1,\"898\":1}}],[\"desired\",{\"1\":{\"100\":1}}],[\"design\",{\"0\":{\"72\":1},\"1\":{\"60\":1,\"73\":1,\"84\":1}}],[\"designed\",{\"1\":{\"21\":1,\"24\":1,\"80\":1}}],[\"despite\",{\"1\":{\"97\":1}}],[\"description\",{\"1\":{\"61\":1,\"99\":1,\"383\":1,\"384\":1,\"385\":1,\"386\":1,\"387\":1,\"388\":1,\"389\":1,\"390\":1,\"391\":1,\"392\":1,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":1,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":1,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":1,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":1,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":1,\"439\":1,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":1,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"469\":1,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":1,\"477\":1,\"478\":1,\"479\":1,\"480\":1,\"481\":1,\"482\":1,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":1,\"493\":1,\"494\":1,\"498\":1,\"499\":1,\"500\":1,\"501\":1,\"502\":1,\"503\":1,\"504\":1,\"505\":1,\"506\":1,\"507\":1,\"508\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":1,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":1,\"537\":1,\"538\":1,\"539\":1,\"540\":1,\"541\":1,\"542\":1,\"543\":1,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":1,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":1,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":1,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":1,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":1,\"590\":1,\"591\":1,\"595\":1,\"596\":1,\"597\":1,\"598\":1,\"599\":1,\"600\":1,\"601\":1,\"602\":1,\"603\":1,\"604\":1,\"605\":1,\"606\":1,\"620\":1,\"621\":1,\"622\":1,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":1,\"630\":1,\"631\":1,\"632\":1,\"633\":1,\"634\":1,\"635\":1,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":1,\"647\":1,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":1,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"671\":1,\"672\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":1,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":1,\"755\":1,\"756\":1,\"757\":1,\"758\":1,\"759\":1,\"760\":1,\"761\":1,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":1,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":1,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":1,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":1,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":1,\"812\":1,\"813\":1,\"827\":1,\"828\":1,\"829\":1,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":1,\"837\":1,\"838\":1,\"839\":1,\"840\":1,\"841\":1,\"842\":1,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":1,\"854\":1,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":1,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"878\":1,\"879\":1,\"909\":1,\"910\":1,\"911\":1,\"912\":1,\"913\":1,\"914\":1,\"915\":1,\"916\":1,\"917\":1,\"918\":1,\"919\":1,\"920\":1,\"921\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":1,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":1,\"978\":1,\"979\":1,\"980\":1,\"981\":1,\"982\":1,\"983\":1,\"984\":1,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":1,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":1,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":1,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":1,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":1,\"1035\":1,\"1036\":1,\"1050\":1,\"1051\":1,\"1052\":1,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":1,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":1,\"1064\":1,\"1065\":1,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":1,\"1077\":1,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":1,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":1,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":1,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":1,\"1143\":1,\"1144\":1,\"1145\":1,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":1,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":1,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":1,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":1,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":1,\"1196\":1,\"1197\":1,\"1201\":1,\"1202\":1,\"1203\":1,\"1204\":1,\"1205\":1,\"1206\":1,\"1207\":1,\"1208\":1,\"1209\":1,\"1210\":1,\"1211\":1,\"1212\":1,\"1213\":1,\"1227\":1,\"1228\":1,\"1229\":1,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":1,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":1,\"1241\":1,\"1242\":1,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":1,\"1254\":1,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":1,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1289\":1,\"1290\":1,\"1291\":1,\"1292\":1,\"1293\":1,\"1294\":1,\"1295\":1,\"1296\":1,\"1297\":1,\"1298\":1,\"1299\":1,\"1300\":1,\"1301\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":1,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":1,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":1,\"1336\":1,\"1337\":1,\"1338\":1,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":1,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":1,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":1,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":1,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":1,\"1389\":1,\"1390\":1,\"1394\":1,\"1395\":1,\"1396\":1,\"1397\":1,\"1398\":1,\"1399\":1,\"1400\":1,\"1401\":1,\"1402\":1,\"1403\":1,\"1404\":1,\"1405\":1,\"1406\":1,\"1420\":1,\"1421\":1,\"1422\":1,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":1,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":1,\"1434\":1,\"1435\":1,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":1,\"1447\":1,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":1,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":1,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":1,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":1,\"1523\":1,\"1524\":1,\"1525\":1,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":1,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":1,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":1,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":1,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":1,\"1583\":1,\"1584\":1,\"1593\":1,\"1594\":1,\"1595\":1,\"1596\":1,\"1597\":1,\"1598\":1,\"1599\":1,\"1600\":1,\"1601\":1,\"1602\":1,\"1603\":1,\"1604\":1,\"1605\":1,\"1619\":1,\"1620\":1,\"1621\":1,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":1,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":1,\"1633\":1,\"1634\":1,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":1,\"1650\":1,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":1,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1685\":1,\"1686\":1,\"1687\":1,\"1688\":1,\"1689\":1,\"1690\":1,\"1691\":1,\"1692\":1,\"1693\":1,\"1694\":1,\"1695\":1,\"1696\":1,\"1697\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":1,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":1,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":1,\"1732\":1,\"1733\":1,\"1734\":1,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":1,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":1,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":1,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":1,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":1,\"1785\":1,\"1786\":1,\"1800\":1,\"1801\":1,\"1802\":1,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":1,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":1,\"1814\":1,\"1815\":1,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":1,\"1827\":1,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":1,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1862\":1,\"1863\":1,\"1864\":1,\"1865\":1,\"1866\":1,\"1867\":1,\"1868\":1,\"1869\":1,\"1870\":1,\"1871\":1,\"1872\":1,\"1873\":1,\"1874\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":1,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":1,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":1,\"1919\":1,\"1920\":1,\"1921\":1,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":1,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":1,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":1,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":1,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":1,\"1979\":1,\"1980\":1,\"1989\":1,\"1990\":1,\"1991\":1,\"1992\":1,\"1993\":1,\"1994\":1,\"1995\":1,\"1996\":1,\"1997\":1,\"1998\":1,\"1999\":1,\"2000\":1,\"2001\":1,\"2015\":1,\"2016\":1,\"2017\":1,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":1,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":1,\"2029\":1,\"2030\":1,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":1,\"2046\":1,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":1,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2081\":1,\"2082\":1,\"2083\":1,\"2084\":1,\"2085\":1,\"2086\":1,\"2087\":1,\"2088\":1,\"2089\":1,\"2090\":1,\"2091\":1,\"2092\":1,\"2093\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":1,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":1,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":1,\"2138\":1,\"2139\":1,\"2140\":1,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":1,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":1,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":1,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":1,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":1,\"2198\":1,\"2199\":1,\"2208\":1,\"2209\":1,\"2210\":1,\"2211\":1,\"2212\":1,\"2213\":1,\"2214\":1,\"2215\":1,\"2216\":1,\"2217\":1,\"2218\":1,\"2219\":1,\"2220\":1,\"2234\":1,\"2235\":1,\"2236\":1,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":1,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":1,\"2248\":1,\"2249\":1,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":1,\"2265\":1,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":1,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2289\":1,\"2290\":1,\"2300\":1,\"2301\":1,\"2302\":1,\"2303\":1,\"2304\":1,\"2305\":1,\"2306\":1,\"2307\":1,\"2308\":1,\"2309\":1,\"2310\":1,\"2311\":1,\"2312\":1}}],[\"described\",{\"1\":{\"95\":1}}],[\"describe\",{\"1\":{\"57\":1,\"59\":1,\"95\":1,\"305\":1,\"355\":1,\"696\":1,\"903\":1}}],[\"des\",{\"1\":{\"29\":4,\"31\":1,\"32\":2,\"37\":1,\"103\":1}}],[\"der\",{\"1\":{\"29\":4,\"30\":2,\"31\":5,\"32\":2,\"37\":1,\"103\":2}}],[\"de\",{\"1\":{\"4\":1,\"27\":1,\"29\":1,\"31\":2,\"37\":1,\"80\":1,\"99\":1,\"102\":1,\"127\":2,\"128\":1,\"137\":5,\"138\":3,\"140\":1,\"150\":2,\"151\":1,\"160\":5,\"161\":3,\"163\":1,\"169\":1,\"174\":2,\"175\":1,\"184\":5,\"185\":3,\"187\":1,\"193\":1,\"206\":2,\"207\":1,\"220\":5,\"221\":3,\"223\":1,\"229\":1,\"236\":2,\"237\":1,\"250\":5,\"251\":2,\"253\":1,\"259\":1,\"266\":2,\"267\":1,\"280\":5,\"281\":2,\"283\":1,\"289\":1,\"312\":2,\"313\":1,\"326\":5,\"327\":2,\"329\":1,\"335\":1,\"358\":2,\"359\":1,\"372\":5,\"373\":2,\"375\":1,\"381\":1,\"417\":1,\"568\":1,\"703\":2,\"704\":1,\"717\":5,\"718\":2,\"720\":1,\"726\":1,\"786\":1,\"926\":2,\"927\":1,\"940\":5,\"941\":2,\"943\":1,\"949\":1,\"1009\":1,\"1170\":1,\"1363\":1,\"1553\":1,\"1759\":1,\"1949\":1,\"2168\":1}}],[\"dsfdev\",{\"1\":{\"804\":1,\"1027\":1,\"1188\":1,\"1381\":1,\"1571\":1,\"1777\":1,\"1967\":1,\"2186\":1}}],[\"dsfs\",{\"1\":{\"29\":1,\"80\":1,\"81\":1}}],[\"dsf\",{\"0\":{\"10\":1,\"11\":1,\"20\":1,\"21\":1,\"27\":1,\"34\":1,\"53\":1,\"105\":1,\"107\":1,\"109\":1,\"111\":1,\"113\":1,\"115\":1,\"117\":1,\"123\":1,\"129\":1,\"137\":1,\"138\":1,\"141\":1,\"143\":1,\"152\":1,\"160\":1,\"161\":1,\"164\":1,\"166\":1,\"167\":1,\"168\":1,\"169\":1,\"170\":1,\"176\":1,\"184\":1,\"185\":1,\"188\":1,\"190\":1,\"191\":1,\"192\":1,\"193\":1,\"202\":1,\"212\":1,\"220\":1,\"221\":1,\"224\":1,\"226\":1,\"227\":1,\"228\":1,\"229\":1,\"242\":1,\"250\":1,\"251\":1,\"254\":1,\"256\":1,\"257\":1,\"258\":1,\"259\":1,\"272\":1,\"280\":1,\"281\":1,\"284\":1,\"286\":1,\"287\":1,\"288\":1,\"289\":1,\"302\":1,\"318\":1,\"326\":1,\"327\":1,\"330\":1,\"332\":1,\"333\":1,\"334\":1,\"335\":1,\"352\":1,\"364\":1,\"372\":1,\"373\":1,\"376\":1,\"378\":1,\"379\":1,\"380\":1,\"381\":1,\"383\":1,\"384\":1,\"385\":2,\"386\":1,\"387\":1,\"388\":1,\"389\":2,\"390\":1,\"391\":1,\"392\":2,\"393\":1,\"394\":1,\"395\":1,\"396\":1,\"397\":1,\"398\":1,\"399\":2,\"400\":1,\"401\":1,\"402\":1,\"403\":1,\"404\":1,\"405\":1,\"406\":1,\"407\":1,\"408\":1,\"409\":1,\"410\":1,\"411\":1,\"412\":1,\"413\":1,\"414\":1,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":2,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":1,\"430\":1,\"431\":1,\"432\":1,\"433\":1,\"434\":1,\"435\":1,\"436\":1,\"437\":1,\"438\":2,\"439\":1,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":1,\"446\":1,\"447\":1,\"448\":1,\"449\":1,\"450\":1,\"451\":1,\"452\":1,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":2,\"463\":1,\"464\":1,\"465\":1,\"467\":1,\"468\":1,\"469\":2,\"470\":1,\"471\":1,\"472\":1,\"473\":1,\"474\":1,\"475\":1,\"476\":2,\"477\":1,\"478\":1,\"479\":1,\"480\":2,\"481\":1,\"482\":2,\"483\":1,\"484\":1,\"485\":1,\"486\":1,\"487\":1,\"488\":1,\"489\":1,\"490\":1,\"491\":1,\"492\":2,\"493\":1,\"494\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":1,\"514\":1,\"515\":1,\"516\":1,\"517\":1,\"518\":1,\"519\":1,\"520\":1,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":2,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":2,\"537\":1,\"538\":1,\"539\":1,\"540\":2,\"541\":1,\"542\":1,\"543\":2,\"544\":1,\"545\":1,\"546\":1,\"547\":1,\"548\":1,\"549\":1,\"550\":2,\"551\":1,\"552\":1,\"553\":1,\"554\":1,\"555\":1,\"556\":1,\"557\":1,\"558\":1,\"559\":1,\"560\":1,\"561\":1,\"562\":1,\"563\":1,\"564\":1,\"565\":1,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":2,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":1,\"581\":1,\"582\":1,\"583\":1,\"584\":1,\"585\":1,\"586\":1,\"587\":1,\"588\":1,\"589\":2,\"590\":1,\"591\":1,\"615\":1,\"616\":1,\"620\":1,\"621\":1,\"622\":2,\"623\":1,\"624\":1,\"625\":1,\"626\":1,\"627\":1,\"628\":1,\"629\":2,\"630\":1,\"631\":1,\"632\":1,\"633\":2,\"634\":1,\"635\":2,\"636\":1,\"637\":1,\"638\":1,\"639\":1,\"640\":1,\"641\":1,\"642\":1,\"643\":1,\"644\":1,\"645\":1,\"646\":2,\"647\":1,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":1,\"653\":1,\"654\":1,\"655\":1,\"656\":1,\"657\":1,\"658\":1,\"659\":1,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":2,\"670\":1,\"671\":1,\"672\":1,\"693\":1,\"709\":1,\"717\":1,\"718\":1,\"721\":1,\"723\":1,\"724\":1,\"725\":1,\"726\":1,\"728\":1,\"729\":1,\"730\":1,\"731\":1,\"732\":1,\"733\":1,\"734\":1,\"735\":1,\"736\":1,\"737\":1,\"738\":1,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":2,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":2,\"755\":1,\"756\":1,\"757\":1,\"758\":2,\"759\":1,\"760\":1,\"761\":2,\"762\":1,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":1,\"768\":1,\"769\":2,\"770\":1,\"771\":1,\"772\":1,\"773\":1,\"774\":1,\"775\":1,\"776\":1,\"777\":1,\"778\":1,\"779\":1,\"780\":1,\"781\":1,\"782\":1,\"783\":1,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":2,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":1,\"799\":1,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":1,\"805\":1,\"806\":1,\"807\":1,\"808\":1,\"809\":1,\"810\":1,\"811\":2,\"812\":1,\"813\":1,\"822\":1,\"823\":1,\"827\":1,\"828\":1,\"829\":2,\"830\":1,\"831\":1,\"832\":1,\"833\":1,\"834\":1,\"835\":1,\"836\":2,\"837\":1,\"838\":1,\"839\":1,\"840\":2,\"841\":1,\"842\":2,\"843\":1,\"844\":1,\"845\":1,\"846\":1,\"847\":1,\"848\":1,\"849\":1,\"850\":1,\"851\":1,\"852\":1,\"853\":2,\"854\":1,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":1,\"860\":1,\"861\":1,\"862\":1,\"863\":1,\"864\":1,\"865\":1,\"866\":1,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":2,\"877\":1,\"878\":1,\"879\":1,\"900\":1,\"932\":1,\"940\":1,\"941\":1,\"944\":1,\"946\":1,\"947\":1,\"948\":1,\"949\":1,\"951\":1,\"952\":1,\"953\":1,\"954\":1,\"955\":1,\"956\":1,\"957\":1,\"958\":1,\"959\":1,\"960\":1,\"961\":1,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":2,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":2,\"978\":1,\"979\":1,\"980\":1,\"981\":2,\"982\":1,\"983\":1,\"984\":2,\"985\":1,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":1,\"991\":1,\"992\":2,\"993\":1,\"994\":1,\"995\":1,\"996\":1,\"997\":1,\"998\":1,\"999\":1,\"1000\":1,\"1001\":1,\"1002\":1,\"1003\":1,\"1004\":1,\"1005\":1,\"1006\":1,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":2,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":1,\"1022\":1,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":1,\"1028\":1,\"1029\":1,\"1030\":1,\"1031\":1,\"1032\":1,\"1033\":1,\"1034\":2,\"1035\":1,\"1036\":1,\"1045\":1,\"1046\":1,\"1050\":1,\"1051\":1,\"1052\":2,\"1053\":1,\"1054\":1,\"1055\":1,\"1056\":1,\"1057\":1,\"1058\":1,\"1059\":2,\"1060\":1,\"1061\":1,\"1062\":1,\"1063\":2,\"1064\":1,\"1065\":2,\"1066\":1,\"1067\":1,\"1068\":1,\"1069\":1,\"1070\":1,\"1071\":1,\"1072\":1,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":2,\"1077\":1,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":1,\"1083\":1,\"1084\":1,\"1085\":1,\"1086\":1,\"1087\":1,\"1088\":1,\"1089\":1,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":2,\"1100\":1,\"1101\":1,\"1102\":1,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":1,\"1116\":1,\"1117\":1,\"1118\":1,\"1119\":1,\"1120\":1,\"1121\":1,\"1122\":1,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":2,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":2,\"1139\":1,\"1140\":1,\"1141\":1,\"1142\":2,\"1143\":1,\"1144\":1,\"1145\":2,\"1146\":1,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":1,\"1152\":1,\"1153\":2,\"1154\":1,\"1155\":1,\"1156\":1,\"1157\":1,\"1158\":1,\"1159\":1,\"1160\":1,\"1161\":1,\"1162\":1,\"1163\":1,\"1164\":1,\"1165\":1,\"1166\":1,\"1167\":1,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":2,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":1,\"1183\":1,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":1,\"1189\":1,\"1190\":1,\"1191\":1,\"1192\":1,\"1193\":1,\"1194\":1,\"1195\":2,\"1196\":1,\"1197\":1,\"1222\":1,\"1223\":1,\"1227\":1,\"1228\":1,\"1229\":2,\"1230\":1,\"1231\":1,\"1232\":1,\"1233\":1,\"1234\":1,\"1235\":1,\"1236\":2,\"1237\":1,\"1238\":1,\"1239\":1,\"1240\":2,\"1241\":1,\"1242\":2,\"1243\":1,\"1244\":1,\"1245\":1,\"1246\":1,\"1247\":1,\"1248\":1,\"1249\":1,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":2,\"1254\":1,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":1,\"1260\":1,\"1261\":1,\"1262\":1,\"1263\":1,\"1264\":1,\"1265\":1,\"1266\":1,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":2,\"1277\":1,\"1278\":1,\"1279\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":1,\"1309\":1,\"1310\":1,\"1311\":1,\"1312\":1,\"1313\":1,\"1314\":1,\"1315\":1,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":2,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":2,\"1332\":1,\"1333\":1,\"1334\":1,\"1335\":2,\"1336\":1,\"1337\":1,\"1338\":2,\"1339\":1,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":1,\"1345\":1,\"1346\":2,\"1347\":1,\"1348\":1,\"1349\":1,\"1350\":1,\"1351\":1,\"1352\":1,\"1353\":1,\"1354\":1,\"1355\":1,\"1356\":1,\"1357\":1,\"1358\":1,\"1359\":1,\"1360\":1,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":2,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":1,\"1376\":1,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":1,\"1382\":1,\"1383\":1,\"1384\":1,\"1385\":1,\"1386\":1,\"1387\":1,\"1388\":2,\"1389\":1,\"1390\":1,\"1415\":1,\"1416\":1,\"1420\":1,\"1421\":1,\"1422\":2,\"1423\":1,\"1424\":1,\"1425\":1,\"1426\":1,\"1427\":1,\"1428\":1,\"1429\":2,\"1430\":1,\"1431\":1,\"1432\":1,\"1433\":2,\"1434\":1,\"1435\":2,\"1436\":1,\"1437\":1,\"1438\":1,\"1439\":1,\"1440\":1,\"1441\":1,\"1442\":1,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":2,\"1447\":1,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":1,\"1453\":1,\"1454\":1,\"1455\":1,\"1456\":1,\"1457\":1,\"1458\":1,\"1459\":1,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":2,\"1470\":1,\"1471\":1,\"1472\":1,\"1487\":1,\"1488\":1,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":1,\"1496\":1,\"1497\":1,\"1498\":1,\"1499\":1,\"1500\":1,\"1501\":1,\"1502\":1,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":2,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":2,\"1519\":1,\"1520\":1,\"1521\":1,\"1522\":2,\"1523\":1,\"1524\":1,\"1525\":2,\"1526\":1,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":1,\"1535\":1,\"1536\":2,\"1537\":1,\"1538\":1,\"1539\":1,\"1540\":1,\"1541\":1,\"1542\":1,\"1543\":1,\"1544\":1,\"1545\":1,\"1546\":1,\"1547\":1,\"1548\":1,\"1549\":1,\"1550\":1,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":2,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":1,\"1566\":1,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":1,\"1572\":1,\"1573\":1,\"1574\":1,\"1575\":1,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":2,\"1583\":1,\"1584\":1,\"1614\":1,\"1615\":1,\"1619\":1,\"1620\":1,\"1621\":2,\"1622\":1,\"1623\":1,\"1624\":1,\"1625\":1,\"1626\":1,\"1627\":1,\"1628\":2,\"1629\":1,\"1630\":1,\"1631\":1,\"1632\":2,\"1633\":1,\"1634\":2,\"1635\":1,\"1636\":1,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":1,\"1641\":1,\"1642\":1,\"1643\":1,\"1644\":1,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":2,\"1650\":1,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":1,\"1656\":1,\"1657\":1,\"1658\":1,\"1659\":1,\"1660\":1,\"1661\":1,\"1662\":1,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":2,\"1673\":1,\"1674\":1,\"1675\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":1,\"1705\":1,\"1706\":1,\"1707\":1,\"1708\":1,\"1709\":1,\"1710\":1,\"1711\":1,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":2,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":2,\"1728\":1,\"1729\":1,\"1730\":1,\"1731\":2,\"1732\":1,\"1733\":1,\"1734\":2,\"1735\":1,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":1,\"1741\":1,\"1742\":2,\"1743\":1,\"1744\":1,\"1745\":1,\"1746\":1,\"1747\":1,\"1748\":1,\"1749\":1,\"1750\":1,\"1751\":1,\"1752\":1,\"1753\":1,\"1754\":1,\"1755\":1,\"1756\":1,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":2,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":1,\"1772\":1,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":1,\"1778\":1,\"1779\":1,\"1780\":1,\"1781\":1,\"1782\":1,\"1783\":1,\"1784\":2,\"1785\":1,\"1786\":1,\"1795\":1,\"1796\":1,\"1800\":1,\"1801\":1,\"1802\":2,\"1803\":1,\"1804\":1,\"1805\":1,\"1806\":1,\"1807\":1,\"1808\":1,\"1809\":2,\"1810\":1,\"1811\":1,\"1812\":1,\"1813\":2,\"1814\":1,\"1815\":2,\"1816\":1,\"1817\":1,\"1818\":1,\"1819\":1,\"1820\":1,\"1821\":1,\"1822\":1,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":2,\"1827\":1,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":1,\"1833\":1,\"1834\":1,\"1835\":1,\"1836\":1,\"1837\":1,\"1838\":1,\"1839\":1,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":2,\"1850\":1,\"1851\":1,\"1852\":1,\"1883\":1,\"1884\":1,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":1,\"1892\":1,\"1893\":1,\"1894\":1,\"1895\":1,\"1896\":1,\"1897\":1,\"1898\":1,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":2,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":2,\"1915\":1,\"1916\":1,\"1917\":1,\"1918\":2,\"1919\":1,\"1920\":1,\"1921\":2,\"1922\":1,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":1,\"1931\":1,\"1932\":2,\"1933\":1,\"1934\":1,\"1935\":1,\"1936\":1,\"1937\":1,\"1938\":1,\"1939\":1,\"1940\":1,\"1941\":1,\"1942\":1,\"1943\":1,\"1944\":1,\"1945\":1,\"1946\":1,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":2,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":1,\"1962\":1,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":1,\"1968\":1,\"1969\":1,\"1970\":1,\"1971\":1,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":2,\"1979\":1,\"1980\":1,\"2010\":1,\"2011\":1,\"2015\":1,\"2016\":1,\"2017\":2,\"2018\":1,\"2019\":1,\"2020\":1,\"2021\":1,\"2022\":1,\"2023\":1,\"2024\":2,\"2025\":1,\"2026\":1,\"2027\":1,\"2028\":2,\"2029\":1,\"2030\":2,\"2031\":1,\"2032\":1,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":1,\"2037\":1,\"2038\":1,\"2039\":1,\"2040\":1,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":2,\"2046\":1,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":1,\"2052\":1,\"2053\":1,\"2054\":1,\"2055\":1,\"2056\":1,\"2057\":1,\"2058\":1,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":2,\"2069\":1,\"2070\":1,\"2071\":1,\"2102\":1,\"2103\":1,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":1,\"2111\":1,\"2112\":1,\"2113\":1,\"2114\":1,\"2115\":1,\"2116\":1,\"2117\":1,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":2,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":2,\"2134\":1,\"2135\":1,\"2136\":1,\"2137\":2,\"2138\":1,\"2139\":1,\"2140\":2,\"2141\":1,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":1,\"2150\":1,\"2151\":2,\"2152\":1,\"2153\":1,\"2154\":1,\"2155\":1,\"2156\":1,\"2157\":1,\"2158\":1,\"2159\":1,\"2160\":1,\"2161\":1,\"2162\":1,\"2163\":1,\"2164\":1,\"2165\":1,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":2,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":1,\"2181\":1,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":1,\"2187\":1,\"2188\":1,\"2189\":1,\"2190\":1,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":2,\"2198\":1,\"2199\":1,\"2229\":1,\"2230\":1,\"2234\":1,\"2235\":1,\"2236\":2,\"2237\":1,\"2238\":1,\"2239\":1,\"2240\":1,\"2241\":1,\"2242\":1,\"2243\":2,\"2244\":1,\"2245\":1,\"2246\":1,\"2247\":2,\"2248\":1,\"2249\":2,\"2250\":1,\"2251\":1,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":1,\"2256\":1,\"2257\":1,\"2258\":1,\"2259\":1,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":2,\"2265\":1,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":1,\"2271\":1,\"2272\":1,\"2273\":1,\"2274\":1,\"2275\":1,\"2276\":1,\"2277\":1,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":2,\"2288\":1,\"2289\":1,\"2290\":1},\"1\":{\"0\":4,\"4\":1,\"5\":1,\"7\":1,\"10\":10,\"11\":2,\"13\":1,\"20\":4,\"21\":2,\"23\":1,\"24\":1,\"25\":1,\"26\":1,\"27\":5,\"28\":1,\"29\":4,\"31\":1,\"35\":2,\"37\":3,\"41\":1,\"49\":1,\"52\":4,\"53\":4,\"54\":3,\"57\":2,\"60\":1,\"62\":6,\"66\":3,\"68\":1,\"73\":3,\"74\":1,\"80\":5,\"81\":6,\"84\":3,\"85\":1,\"88\":1,\"90\":2,\"91\":1,\"92\":1,\"95\":5,\"97\":1,\"99\":1,\"102\":1,\"103\":2,\"105\":6,\"107\":7,\"109\":7,\"111\":7,\"113\":7,\"115\":7,\"117\":7,\"119\":2,\"122\":3,\"123\":7,\"125\":1,\"126\":5,\"127\":1,\"128\":1,\"129\":5,\"131\":2,\"133\":2,\"134\":16,\"136\":3,\"137\":20,\"138\":18,\"142\":2,\"143\":12,\"144\":2,\"147\":3,\"148\":1,\"149\":5,\"150\":1,\"151\":1,\"152\":5,\"154\":2,\"156\":2,\"157\":16,\"159\":3,\"160\":17,\"161\":17,\"165\":2,\"166\":12,\"167\":2,\"168\":2,\"169\":10,\"170\":7,\"172\":1,\"173\":5,\"174\":1,\"175\":1,\"176\":5,\"178\":2,\"180\":2,\"181\":16,\"183\":3,\"184\":17,\"185\":17,\"189\":2,\"190\":12,\"191\":2,\"192\":6,\"193\":13,\"194\":2,\"197\":3,\"198\":2,\"201\":3,\"202\":7,\"205\":4,\"206\":1,\"207\":3,\"209\":2,\"210\":1,\"212\":3,\"214\":2,\"216\":2,\"217\":16,\"219\":3,\"220\":17,\"221\":17,\"225\":2,\"226\":14,\"227\":4,\"228\":2,\"229\":10,\"230\":2,\"233\":3,\"235\":4,\"236\":2,\"237\":1,\"239\":2,\"240\":1,\"242\":3,\"244\":2,\"246\":2,\"247\":16,\"249\":3,\"250\":17,\"251\":15,\"255\":2,\"256\":14,\"257\":3,\"258\":2,\"259\":10,\"260\":2,\"263\":3,\"265\":4,\"266\":2,\"267\":1,\"269\":2,\"270\":1,\"272\":3,\"274\":2,\"276\":2,\"277\":16,\"279\":3,\"280\":17,\"281\":15,\"285\":2,\"286\":14,\"287\":3,\"288\":2,\"289\":10,\"290\":2,\"291\":2,\"302\":1,\"305\":3,\"306\":3,\"309\":3,\"311\":4,\"312\":2,\"313\":1,\"315\":2,\"318\":3,\"320\":2,\"322\":2,\"323\":16,\"325\":3,\"326\":17,\"327\":15,\"331\":2,\"332\":14,\"333\":3,\"334\":2,\"335\":10,\"336\":3,\"339\":3,\"340\":2,\"341\":2,\"352\":1,\"355\":3,\"357\":4,\"358\":2,\"359\":1,\"361\":2,\"364\":3,\"366\":2,\"368\":2,\"369\":16,\"371\":3,\"372\":17,\"373\":15,\"377\":2,\"378\":14,\"379\":3,\"380\":2,\"381\":10,\"383\":1,\"384\":1,\"385\":3,\"386\":2,\"387\":2,\"388\":2,\"389\":3,\"390\":3,\"391\":2,\"392\":3,\"393\":2,\"394\":1,\"395\":1,\"396\":1,\"397\":2,\"398\":3,\"399\":2,\"400\":2,\"401\":2,\"402\":2,\"403\":2,\"404\":2,\"405\":2,\"406\":2,\"407\":2,\"408\":2,\"409\":1,\"410\":2,\"411\":2,\"412\":2,\"413\":2,\"414\":4,\"415\":2,\"416\":1,\"417\":1,\"418\":1,\"419\":1,\"420\":3,\"421\":1,\"422\":1,\"423\":1,\"424\":1,\"425\":1,\"426\":2,\"427\":1,\"428\":1,\"429\":2,\"430\":2,\"431\":1,\"432\":2,\"433\":2,\"434\":2,\"435\":3,\"436\":2,\"437\":1,\"438\":2,\"439\":2,\"440\":1,\"442\":1,\"443\":1,\"444\":1,\"445\":4,\"446\":4,\"447\":1,\"448\":2,\"449\":2,\"450\":2,\"451\":1,\"452\":3,\"453\":2,\"454\":1,\"455\":1,\"456\":1,\"457\":1,\"458\":1,\"459\":1,\"460\":1,\"461\":1,\"462\":1,\"463\":1,\"464\":1,\"465\":1,\"467\":2,\"468\":3,\"469\":2,\"470\":3,\"471\":2,\"472\":2,\"473\":2,\"474\":1,\"475\":1,\"476\":3,\"477\":2,\"478\":2,\"479\":2,\"480\":3,\"481\":2,\"482\":3,\"483\":3,\"484\":2,\"485\":2,\"486\":2,\"487\":1,\"488\":2,\"489\":1,\"490\":1,\"491\":1,\"492\":2,\"493\":2,\"494\":1,\"498\":1,\"499\":1,\"510\":1,\"511\":1,\"512\":1,\"513\":4,\"514\":4,\"515\":1,\"516\":2,\"517\":2,\"518\":2,\"519\":1,\"520\":3,\"521\":2,\"522\":1,\"523\":1,\"524\":1,\"525\":1,\"526\":1,\"527\":1,\"528\":1,\"529\":1,\"530\":1,\"531\":1,\"532\":1,\"533\":1,\"534\":1,\"535\":1,\"536\":3,\"537\":2,\"538\":2,\"539\":2,\"540\":3,\"541\":3,\"542\":2,\"543\":3,\"544\":2,\"545\":1,\"546\":1,\"547\":1,\"548\":2,\"549\":3,\"550\":2,\"551\":2,\"552\":2,\"553\":2,\"554\":2,\"555\":2,\"556\":2,\"557\":2,\"558\":2,\"559\":2,\"560\":1,\"561\":2,\"562\":2,\"563\":2,\"564\":2,\"565\":4,\"566\":2,\"567\":1,\"568\":1,\"569\":1,\"570\":1,\"571\":3,\"572\":1,\"573\":1,\"574\":1,\"575\":1,\"576\":1,\"577\":2,\"578\":1,\"579\":1,\"580\":2,\"581\":2,\"582\":1,\"583\":2,\"584\":2,\"585\":2,\"586\":3,\"587\":2,\"588\":1,\"589\":2,\"590\":2,\"591\":1,\"595\":1,\"596\":1,\"610\":8,\"616\":2,\"617\":4,\"618\":10,\"620\":2,\"621\":3,\"622\":2,\"623\":3,\"624\":2,\"625\":2,\"626\":2,\"627\":1,\"628\":1,\"629\":3,\"630\":2,\"631\":2,\"632\":2,\"633\":3,\"634\":2,\"635\":3,\"636\":3,\"637\":2,\"638\":2,\"639\":2,\"640\":1,\"641\":1,\"642\":2,\"643\":1,\"644\":1,\"645\":1,\"646\":2,\"647\":2,\"648\":1,\"649\":1,\"650\":1,\"651\":1,\"652\":4,\"653\":4,\"654\":1,\"655\":2,\"656\":2,\"657\":2,\"658\":1,\"659\":3,\"660\":2,\"661\":1,\"662\":1,\"663\":1,\"664\":1,\"665\":1,\"666\":1,\"667\":1,\"668\":1,\"669\":1,\"670\":1,\"671\":1,\"672\":1,\"674\":3,\"675\":8,\"676\":2,\"677\":3,\"678\":9,\"681\":2,\"682\":2,\"693\":1,\"696\":3,\"697\":3,\"700\":3,\"702\":4,\"703\":2,\"704\":1,\"706\":2,\"709\":3,\"711\":2,\"713\":2,\"714\":16,\"716\":3,\"717\":17,\"718\":15,\"722\":2,\"723\":14,\"724\":3,\"725\":2,\"726\":10,\"728\":1,\"729\":1,\"730\":1,\"731\":4,\"732\":4,\"733\":1,\"734\":2,\"735\":2,\"736\":2,\"737\":1,\"738\":3,\"739\":2,\"740\":1,\"741\":1,\"742\":1,\"743\":1,\"744\":1,\"745\":1,\"746\":1,\"747\":1,\"748\":1,\"749\":1,\"750\":1,\"751\":1,\"752\":1,\"753\":1,\"754\":3,\"755\":2,\"756\":2,\"757\":2,\"758\":3,\"759\":3,\"760\":2,\"761\":3,\"762\":2,\"763\":1,\"764\":1,\"765\":1,\"766\":1,\"767\":2,\"768\":3,\"769\":2,\"770\":2,\"771\":2,\"772\":2,\"773\":2,\"774\":2,\"775\":2,\"776\":2,\"777\":2,\"778\":2,\"779\":2,\"780\":2,\"781\":2,\"782\":2,\"783\":4,\"784\":2,\"785\":1,\"786\":1,\"787\":1,\"788\":1,\"789\":3,\"790\":1,\"791\":1,\"792\":1,\"793\":1,\"794\":1,\"795\":2,\"796\":1,\"797\":1,\"798\":2,\"799\":2,\"800\":1,\"801\":1,\"802\":1,\"803\":1,\"804\":2,\"805\":2,\"806\":2,\"807\":3,\"808\":2,\"809\":1,\"810\":1,\"811\":2,\"812\":2,\"813\":1,\"817\":8,\"823\":2,\"824\":4,\"825\":10,\"827\":2,\"828\":3,\"829\":2,\"830\":3,\"831\":2,\"832\":2,\"833\":2,\"834\":1,\"835\":1,\"836\":3,\"837\":2,\"838\":2,\"839\":2,\"840\":3,\"841\":2,\"842\":3,\"843\":3,\"844\":2,\"845\":2,\"846\":2,\"847\":1,\"848\":1,\"849\":2,\"850\":1,\"851\":1,\"852\":1,\"853\":2,\"854\":2,\"855\":1,\"856\":1,\"857\":1,\"858\":1,\"859\":4,\"860\":4,\"861\":1,\"862\":2,\"863\":2,\"864\":2,\"865\":1,\"866\":3,\"867\":2,\"868\":1,\"869\":1,\"870\":1,\"871\":1,\"872\":1,\"873\":1,\"874\":1,\"875\":1,\"876\":1,\"877\":1,\"878\":1,\"879\":1,\"881\":3,\"882\":8,\"883\":2,\"884\":3,\"885\":9,\"888\":2,\"889\":2,\"900\":1,\"903\":3,\"904\":3,\"907\":3,\"909\":1,\"910\":1,\"925\":4,\"926\":2,\"927\":1,\"929\":1,\"930\":1,\"931\":1,\"932\":3,\"934\":2,\"936\":2,\"937\":16,\"939\":3,\"940\":17,\"941\":15,\"945\":2,\"946\":14,\"947\":3,\"948\":2,\"949\":10,\"951\":1,\"952\":1,\"953\":1,\"954\":4,\"955\":4,\"956\":1,\"957\":2,\"958\":2,\"959\":2,\"960\":1,\"961\":3,\"962\":2,\"963\":1,\"964\":1,\"965\":1,\"966\":1,\"967\":1,\"968\":1,\"969\":1,\"970\":1,\"971\":1,\"972\":1,\"973\":1,\"974\":1,\"975\":1,\"976\":1,\"977\":3,\"978\":2,\"979\":2,\"980\":2,\"981\":3,\"982\":3,\"983\":2,\"984\":3,\"985\":2,\"986\":1,\"987\":1,\"988\":1,\"989\":1,\"990\":2,\"991\":3,\"992\":2,\"993\":2,\"994\":2,\"995\":2,\"996\":2,\"997\":2,\"998\":2,\"999\":2,\"1000\":2,\"1001\":2,\"1002\":2,\"1003\":2,\"1004\":2,\"1005\":2,\"1006\":4,\"1007\":2,\"1008\":1,\"1009\":1,\"1010\":1,\"1011\":1,\"1012\":3,\"1013\":1,\"1014\":1,\"1015\":1,\"1016\":1,\"1017\":1,\"1018\":2,\"1019\":1,\"1020\":1,\"1021\":2,\"1022\":2,\"1023\":1,\"1024\":1,\"1025\":1,\"1026\":1,\"1027\":2,\"1028\":2,\"1029\":2,\"1030\":3,\"1031\":2,\"1032\":1,\"1033\":1,\"1034\":2,\"1035\":2,\"1036\":1,\"1040\":8,\"1046\":2,\"1047\":4,\"1048\":10,\"1050\":2,\"1051\":3,\"1052\":2,\"1053\":3,\"1054\":2,\"1055\":2,\"1056\":2,\"1057\":1,\"1058\":1,\"1059\":3,\"1060\":2,\"1061\":2,\"1062\":2,\"1063\":3,\"1064\":2,\"1065\":3,\"1066\":3,\"1067\":2,\"1068\":2,\"1069\":2,\"1070\":1,\"1071\":1,\"1072\":2,\"1073\":1,\"1074\":1,\"1075\":1,\"1076\":2,\"1077\":2,\"1078\":1,\"1079\":1,\"1080\":1,\"1081\":1,\"1082\":4,\"1083\":4,\"1084\":1,\"1085\":2,\"1086\":2,\"1087\":2,\"1088\":1,\"1089\":3,\"1090\":2,\"1091\":1,\"1092\":1,\"1093\":1,\"1094\":1,\"1095\":1,\"1096\":1,\"1097\":1,\"1098\":1,\"1099\":1,\"1100\":1,\"1101\":1,\"1102\":1,\"1104\":3,\"1105\":8,\"1106\":2,\"1107\":3,\"1108\":9,\"1112\":1,\"1113\":1,\"1114\":1,\"1115\":4,\"1116\":4,\"1117\":1,\"1118\":2,\"1119\":2,\"1120\":2,\"1121\":1,\"1122\":3,\"1123\":2,\"1124\":1,\"1125\":1,\"1126\":1,\"1127\":1,\"1128\":1,\"1129\":1,\"1130\":1,\"1131\":1,\"1132\":1,\"1133\":1,\"1134\":1,\"1135\":1,\"1136\":1,\"1137\":1,\"1138\":3,\"1139\":2,\"1140\":2,\"1141\":2,\"1142\":3,\"1143\":3,\"1144\":2,\"1145\":3,\"1146\":2,\"1147\":1,\"1148\":1,\"1149\":1,\"1150\":1,\"1151\":2,\"1152\":3,\"1153\":2,\"1154\":2,\"1155\":2,\"1156\":2,\"1157\":2,\"1158\":2,\"1159\":2,\"1160\":2,\"1161\":2,\"1162\":2,\"1163\":2,\"1164\":2,\"1165\":2,\"1166\":2,\"1167\":4,\"1168\":2,\"1169\":1,\"1170\":1,\"1171\":1,\"1172\":1,\"1173\":3,\"1174\":1,\"1175\":1,\"1176\":1,\"1177\":1,\"1178\":1,\"1179\":2,\"1180\":1,\"1181\":1,\"1182\":2,\"1183\":2,\"1184\":1,\"1185\":1,\"1186\":1,\"1187\":1,\"1188\":2,\"1189\":2,\"1190\":2,\"1191\":3,\"1192\":2,\"1193\":1,\"1194\":1,\"1195\":2,\"1196\":2,\"1197\":1,\"1201\":1,\"1202\":1,\"1217\":8,\"1223\":2,\"1224\":4,\"1225\":10,\"1227\":2,\"1228\":3,\"1229\":2,\"1230\":3,\"1231\":2,\"1232\":2,\"1233\":2,\"1234\":1,\"1235\":1,\"1236\":3,\"1237\":2,\"1238\":2,\"1239\":2,\"1240\":3,\"1241\":2,\"1242\":3,\"1243\":3,\"1244\":2,\"1245\":2,\"1246\":2,\"1247\":1,\"1248\":1,\"1249\":2,\"1250\":1,\"1251\":1,\"1252\":1,\"1253\":2,\"1254\":2,\"1255\":1,\"1256\":1,\"1257\":1,\"1258\":1,\"1259\":4,\"1260\":4,\"1261\":1,\"1262\":2,\"1263\":2,\"1264\":2,\"1265\":1,\"1266\":3,\"1267\":2,\"1268\":1,\"1269\":1,\"1270\":1,\"1271\":1,\"1272\":1,\"1273\":1,\"1274\":1,\"1275\":1,\"1276\":1,\"1277\":1,\"1278\":1,\"1279\":1,\"1281\":3,\"1282\":8,\"1283\":2,\"1284\":3,\"1285\":9,\"1289\":1,\"1290\":1,\"1305\":1,\"1306\":1,\"1307\":1,\"1308\":4,\"1309\":4,\"1310\":1,\"1311\":2,\"1312\":2,\"1313\":2,\"1314\":1,\"1315\":3,\"1316\":2,\"1317\":1,\"1318\":1,\"1319\":1,\"1320\":1,\"1321\":1,\"1322\":1,\"1323\":1,\"1324\":1,\"1325\":1,\"1326\":1,\"1327\":1,\"1328\":1,\"1329\":1,\"1330\":1,\"1331\":3,\"1332\":2,\"1333\":2,\"1334\":2,\"1335\":3,\"1336\":3,\"1337\":2,\"1338\":3,\"1339\":2,\"1340\":1,\"1341\":1,\"1342\":1,\"1343\":1,\"1344\":2,\"1345\":3,\"1346\":2,\"1347\":2,\"1348\":2,\"1349\":2,\"1350\":2,\"1351\":2,\"1352\":2,\"1353\":2,\"1354\":2,\"1355\":2,\"1356\":2,\"1357\":2,\"1358\":2,\"1359\":2,\"1360\":4,\"1361\":2,\"1362\":1,\"1363\":1,\"1364\":1,\"1365\":1,\"1366\":3,\"1367\":1,\"1368\":1,\"1369\":1,\"1370\":1,\"1371\":1,\"1372\":2,\"1373\":1,\"1374\":1,\"1375\":2,\"1376\":2,\"1377\":1,\"1378\":1,\"1379\":1,\"1380\":1,\"1381\":2,\"1382\":2,\"1383\":2,\"1384\":3,\"1385\":2,\"1386\":1,\"1387\":1,\"1388\":2,\"1389\":2,\"1390\":1,\"1394\":1,\"1395\":1,\"1410\":8,\"1416\":2,\"1417\":4,\"1418\":10,\"1420\":2,\"1421\":3,\"1422\":2,\"1423\":3,\"1424\":2,\"1425\":2,\"1426\":2,\"1427\":1,\"1428\":1,\"1429\":3,\"1430\":2,\"1431\":2,\"1432\":2,\"1433\":3,\"1434\":2,\"1435\":3,\"1436\":3,\"1437\":2,\"1438\":2,\"1439\":2,\"1440\":1,\"1441\":1,\"1442\":2,\"1443\":1,\"1444\":1,\"1445\":1,\"1446\":2,\"1447\":2,\"1448\":1,\"1449\":1,\"1450\":1,\"1451\":1,\"1452\":4,\"1453\":4,\"1454\":1,\"1455\":2,\"1456\":2,\"1457\":2,\"1458\":1,\"1459\":3,\"1460\":2,\"1461\":1,\"1462\":1,\"1463\":1,\"1464\":1,\"1465\":1,\"1466\":1,\"1467\":1,\"1468\":1,\"1469\":1,\"1470\":1,\"1471\":1,\"1472\":1,\"1474\":3,\"1475\":8,\"1476\":2,\"1477\":3,\"1478\":9,\"1482\":7,\"1488\":2,\"1490\":8,\"1492\":1,\"1493\":1,\"1494\":1,\"1495\":4,\"1496\":4,\"1497\":1,\"1498\":2,\"1499\":2,\"1500\":2,\"1501\":1,\"1502\":3,\"1503\":2,\"1504\":1,\"1505\":1,\"1506\":1,\"1507\":1,\"1508\":1,\"1509\":1,\"1510\":1,\"1511\":1,\"1512\":1,\"1513\":1,\"1514\":1,\"1515\":1,\"1516\":1,\"1517\":1,\"1518\":3,\"1519\":2,\"1520\":2,\"1521\":2,\"1522\":3,\"1523\":3,\"1524\":2,\"1525\":3,\"1526\":2,\"1527\":1,\"1528\":1,\"1529\":1,\"1530\":1,\"1531\":1,\"1532\":1,\"1533\":1,\"1534\":2,\"1535\":3,\"1536\":2,\"1537\":2,\"1538\":2,\"1539\":2,\"1540\":2,\"1541\":2,\"1542\":2,\"1543\":2,\"1544\":2,\"1545\":2,\"1546\":2,\"1547\":2,\"1548\":2,\"1549\":2,\"1550\":4,\"1551\":2,\"1552\":1,\"1553\":1,\"1554\":1,\"1555\":1,\"1556\":3,\"1557\":1,\"1558\":1,\"1559\":1,\"1560\":1,\"1561\":1,\"1562\":2,\"1563\":1,\"1564\":1,\"1565\":2,\"1566\":2,\"1567\":1,\"1568\":1,\"1569\":1,\"1570\":1,\"1571\":2,\"1572\":2,\"1573\":2,\"1574\":3,\"1575\":2,\"1576\":1,\"1577\":1,\"1578\":1,\"1579\":1,\"1580\":1,\"1581\":1,\"1582\":2,\"1583\":2,\"1584\":1,\"1586\":3,\"1587\":8,\"1588\":3,\"1589\":9,\"1593\":1,\"1594\":1,\"1609\":8,\"1615\":2,\"1616\":4,\"1617\":10,\"1619\":2,\"1620\":3,\"1621\":2,\"1622\":3,\"1623\":2,\"1624\":2,\"1625\":2,\"1626\":1,\"1627\":1,\"1628\":3,\"1629\":2,\"1630\":2,\"1631\":2,\"1632\":3,\"1633\":2,\"1634\":3,\"1635\":3,\"1636\":2,\"1637\":1,\"1638\":1,\"1639\":1,\"1640\":2,\"1641\":2,\"1642\":1,\"1643\":1,\"1644\":2,\"1645\":1,\"1646\":1,\"1647\":1,\"1648\":1,\"1649\":2,\"1650\":2,\"1651\":1,\"1652\":1,\"1653\":1,\"1654\":1,\"1655\":4,\"1656\":4,\"1657\":1,\"1658\":2,\"1659\":2,\"1660\":2,\"1661\":1,\"1662\":3,\"1663\":2,\"1664\":1,\"1665\":1,\"1666\":1,\"1667\":1,\"1668\":1,\"1669\":1,\"1670\":1,\"1671\":1,\"1672\":1,\"1673\":1,\"1674\":1,\"1675\":1,\"1677\":3,\"1678\":8,\"1679\":2,\"1680\":3,\"1681\":9,\"1685\":1,\"1686\":1,\"1701\":1,\"1702\":1,\"1703\":1,\"1704\":4,\"1705\":4,\"1706\":1,\"1707\":2,\"1708\":2,\"1709\":2,\"1710\":1,\"1711\":3,\"1712\":2,\"1713\":1,\"1714\":1,\"1715\":1,\"1716\":1,\"1717\":1,\"1718\":1,\"1719\":1,\"1720\":1,\"1721\":1,\"1722\":1,\"1723\":1,\"1724\":1,\"1725\":1,\"1726\":1,\"1727\":3,\"1728\":2,\"1729\":2,\"1730\":2,\"1731\":3,\"1732\":3,\"1733\":2,\"1734\":3,\"1735\":2,\"1736\":1,\"1737\":1,\"1738\":1,\"1739\":1,\"1740\":2,\"1741\":3,\"1742\":2,\"1743\":2,\"1744\":2,\"1745\":2,\"1746\":2,\"1747\":2,\"1748\":2,\"1749\":2,\"1750\":2,\"1751\":2,\"1752\":2,\"1753\":2,\"1754\":2,\"1755\":2,\"1756\":4,\"1757\":2,\"1758\":1,\"1759\":1,\"1760\":1,\"1761\":1,\"1762\":3,\"1763\":1,\"1764\":1,\"1765\":1,\"1766\":1,\"1767\":1,\"1768\":2,\"1769\":1,\"1770\":1,\"1771\":2,\"1772\":2,\"1773\":1,\"1774\":1,\"1775\":1,\"1776\":1,\"1777\":2,\"1778\":2,\"1779\":2,\"1780\":3,\"1781\":2,\"1782\":1,\"1783\":1,\"1784\":2,\"1785\":2,\"1786\":1,\"1790\":8,\"1796\":2,\"1797\":4,\"1798\":10,\"1800\":2,\"1801\":3,\"1802\":2,\"1803\":3,\"1804\":2,\"1805\":2,\"1806\":2,\"1807\":1,\"1808\":1,\"1809\":3,\"1810\":2,\"1811\":2,\"1812\":2,\"1813\":3,\"1814\":2,\"1815\":3,\"1816\":3,\"1817\":2,\"1818\":2,\"1819\":2,\"1820\":1,\"1821\":1,\"1822\":2,\"1823\":1,\"1824\":1,\"1825\":1,\"1826\":2,\"1827\":2,\"1828\":1,\"1829\":1,\"1830\":1,\"1831\":1,\"1832\":4,\"1833\":4,\"1834\":1,\"1835\":2,\"1836\":2,\"1837\":2,\"1838\":1,\"1839\":3,\"1840\":2,\"1841\":1,\"1842\":1,\"1843\":1,\"1844\":1,\"1845\":1,\"1846\":1,\"1847\":1,\"1848\":1,\"1849\":1,\"1850\":1,\"1851\":1,\"1852\":1,\"1854\":3,\"1855\":8,\"1856\":2,\"1857\":3,\"1858\":9,\"1862\":1,\"1863\":1,\"1878\":7,\"1884\":2,\"1886\":8,\"1888\":1,\"1889\":1,\"1890\":1,\"1891\":4,\"1892\":4,\"1893\":1,\"1894\":2,\"1895\":2,\"1896\":2,\"1897\":1,\"1898\":3,\"1899\":2,\"1900\":1,\"1901\":1,\"1902\":1,\"1903\":1,\"1904\":1,\"1905\":1,\"1906\":1,\"1907\":1,\"1908\":1,\"1909\":1,\"1910\":1,\"1911\":1,\"1912\":1,\"1913\":1,\"1914\":3,\"1915\":2,\"1916\":2,\"1917\":2,\"1918\":3,\"1919\":3,\"1920\":2,\"1921\":3,\"1922\":2,\"1923\":1,\"1924\":1,\"1925\":1,\"1926\":1,\"1927\":1,\"1928\":1,\"1929\":1,\"1930\":2,\"1931\":3,\"1932\":2,\"1933\":2,\"1934\":2,\"1935\":2,\"1936\":2,\"1937\":2,\"1938\":2,\"1939\":2,\"1940\":2,\"1941\":2,\"1942\":2,\"1943\":2,\"1944\":2,\"1945\":2,\"1946\":4,\"1947\":2,\"1948\":1,\"1949\":1,\"1950\":1,\"1951\":1,\"1952\":3,\"1953\":1,\"1954\":1,\"1955\":1,\"1956\":1,\"1957\":1,\"1958\":2,\"1959\":1,\"1960\":1,\"1961\":2,\"1962\":2,\"1963\":1,\"1964\":1,\"1965\":1,\"1966\":1,\"1967\":2,\"1968\":2,\"1969\":2,\"1970\":3,\"1971\":2,\"1972\":1,\"1973\":1,\"1974\":1,\"1975\":1,\"1976\":1,\"1977\":1,\"1978\":2,\"1979\":2,\"1980\":1,\"1982\":3,\"1983\":8,\"1984\":3,\"1985\":9,\"1989\":1,\"1990\":1,\"2005\":8,\"2011\":2,\"2012\":4,\"2013\":10,\"2015\":2,\"2016\":3,\"2017\":2,\"2018\":3,\"2019\":2,\"2020\":2,\"2021\":2,\"2022\":1,\"2023\":1,\"2024\":3,\"2025\":2,\"2026\":2,\"2027\":2,\"2028\":3,\"2029\":2,\"2030\":3,\"2031\":3,\"2032\":2,\"2033\":1,\"2034\":1,\"2035\":1,\"2036\":2,\"2037\":2,\"2038\":1,\"2039\":1,\"2040\":2,\"2041\":1,\"2042\":1,\"2043\":1,\"2044\":1,\"2045\":2,\"2046\":2,\"2047\":1,\"2048\":1,\"2049\":1,\"2050\":1,\"2051\":4,\"2052\":4,\"2053\":1,\"2054\":2,\"2055\":2,\"2056\":2,\"2057\":1,\"2058\":3,\"2059\":2,\"2060\":1,\"2061\":1,\"2062\":1,\"2063\":1,\"2064\":1,\"2065\":1,\"2066\":1,\"2067\":1,\"2068\":1,\"2069\":1,\"2070\":1,\"2071\":1,\"2073\":3,\"2074\":8,\"2075\":2,\"2076\":3,\"2077\":9,\"2081\":1,\"2082\":1,\"2097\":7,\"2103\":2,\"2105\":8,\"2107\":1,\"2108\":1,\"2109\":1,\"2110\":4,\"2111\":4,\"2112\":1,\"2113\":2,\"2114\":2,\"2115\":2,\"2116\":1,\"2117\":3,\"2118\":2,\"2119\":1,\"2120\":1,\"2121\":1,\"2122\":1,\"2123\":1,\"2124\":1,\"2125\":1,\"2126\":1,\"2127\":1,\"2128\":1,\"2129\":1,\"2130\":1,\"2131\":1,\"2132\":1,\"2133\":3,\"2134\":2,\"2135\":2,\"2136\":2,\"2137\":3,\"2138\":3,\"2139\":2,\"2140\":3,\"2141\":2,\"2142\":1,\"2143\":1,\"2144\":1,\"2145\":1,\"2146\":1,\"2147\":1,\"2148\":1,\"2149\":2,\"2150\":3,\"2151\":2,\"2152\":2,\"2153\":2,\"2154\":2,\"2155\":2,\"2156\":2,\"2157\":2,\"2158\":2,\"2159\":2,\"2160\":2,\"2161\":2,\"2162\":2,\"2163\":2,\"2164\":2,\"2165\":4,\"2166\":2,\"2167\":1,\"2168\":1,\"2169\":1,\"2170\":1,\"2171\":3,\"2172\":1,\"2173\":1,\"2174\":1,\"2175\":1,\"2176\":1,\"2177\":2,\"2178\":1,\"2179\":1,\"2180\":2,\"2181\":2,\"2182\":1,\"2183\":1,\"2184\":1,\"2185\":1,\"2186\":2,\"2187\":2,\"2188\":2,\"2189\":3,\"2190\":2,\"2191\":1,\"2192\":1,\"2193\":1,\"2194\":1,\"2195\":1,\"2196\":1,\"2197\":2,\"2198\":2,\"2199\":1,\"2201\":3,\"2202\":8,\"2203\":3,\"2204\":9,\"2208\":1,\"2209\":1,\"2224\":8,\"2230\":2,\"2231\":4,\"2232\":10,\"2234\":2,\"2235\":3,\"2236\":2,\"2237\":3,\"2238\":2,\"2239\":2,\"2240\":2,\"2241\":1,\"2242\":1,\"2243\":3,\"2244\":2,\"2245\":2,\"2246\":2,\"2247\":3,\"2248\":2,\"2249\":3,\"2250\":3,\"2251\":2,\"2252\":1,\"2253\":1,\"2254\":1,\"2255\":2,\"2256\":2,\"2257\":1,\"2258\":1,\"2259\":2,\"2260\":1,\"2261\":1,\"2262\":1,\"2263\":1,\"2264\":2,\"2265\":2,\"2266\":1,\"2267\":1,\"2268\":1,\"2269\":1,\"2270\":4,\"2271\":4,\"2272\":1,\"2273\":2,\"2274\":2,\"2275\":2,\"2276\":1,\"2277\":3,\"2278\":2,\"2279\":1,\"2280\":1,\"2281\":1,\"2282\":1,\"2283\":1,\"2284\":1,\"2285\":1,\"2286\":1,\"2287\":1,\"2288\":1,\"2289\":1,\"2290\":1,\"2292\":3,\"2293\":8,\"2294\":2,\"2295\":3,\"2296\":9,\"2300\":1,\"2301\":1}}]],\"serializationVersion\":2}"; \ No newline at end of file diff --git a/src/.vuepress/.temp/search-pro/store.js b/src/.vuepress/.temp/search-pro/store.js new file mode 100644 index 000000000..0d567f158 --- /dev/null +++ b/src/.vuepress/.temp/search-pro/store.js @@ -0,0 +1 @@ +export const store = ["/","/about/contact.html","/about/funding.html","/about/partner.html","/about/","/about/team.html","/community/","/for-you/","/for-you/learn.html","/hackathon/","/intro/publications.html","/intro/","/reference/","/introduction/","/research/","/intro/info/allowList.html","/intro/info/architecture.html","/intro/info/basics.html","/intro/info/introduction.html","/intro/info/networkSetup.html","/intro/info/process-plugins.html","/intro/info/security.html","/intro/tutorials/GMDS2022-dev.html","/intro/tutorials/MIE2023.html","/intro/tutorials/","/intro/tutorials/Talks.html","/intro/use-cases/feasibility.html","/intro/use-cases/num.html","/intro/use-cases/","/security/","/sprechstunde/","/use-cases/","/release/archive/v1.0.0/dsf-for-dev.html","/release/archive/v1.0.0/","/release/archive/v1.0.0/process-plugins-advanced.html","/release/archive/v1.1.0/dsf-for-dev.html","/release/archive/v1.1.0/","/release/archive/v1.1.0/process-plugins-advanced.html","/release/archive/v1.2.0/dsf-for-dev.html","/release/archive/v1.2.0/","/release/archive/v1.2.0/process-plugins-advanced.html","/release/archive/v1.3.0/dsf-for-dev.html","/release/archive/v1.3.0/","/release/archive/v1.3.0/process-plugins-advanced.html","/release/archive/v1.3.1/dsf-for-dev.html","/release/archive/v1.3.1/","/release/archive/v1.3.1/process-plugins-advanced.html","/release/archive/v1.3.2/dsf-for-dev.html","/release/archive/v1.3.2/","/release/archive/v1.3.2/process-plugins-advanced.html","/release/archive/v1.5.0/dsf-for-dev.html","/release/archive/v1.5.0/","/release/archive/v1.5.0/process-plugins-advanced.html","/release/archive/v1.0.0/develop/create.html","/release/archive/v1.0.0/develop/","/release/archive/v1.0.0/develop/upgrade-from-0.html","/release/archive/v1.4.0/dsf-for-dev.html","/release/archive/v1.4.0/","/release/archive/v1.4.0/process-plugins-advanced.html","/release/archive/v1.0.0/maintain/allowList-mgm.html","/release/archive/v1.0.0/maintain/install.html","/release/archive/v1.0.0/maintain/","/release/archive/v1.0.0/maintain/upgrade-from-0.html","/release/archive/v1.1.0/develop/create.html","/release/archive/v1.1.0/develop/","/release/archive/v1.1.0/develop/upgrade-from-0.html","/release/archive/v1.1.0/maintain/allowList-mgm.html","/release/archive/v1.1.0/maintain/install.html","/release/archive/v1.1.0/maintain/","/release/archive/v1.1.0/maintain/upgrade-from-0.html","/release/archive/v1.1.0/maintain/upgrade-from-1.html","/release/archive/v1.5.1/dsf-for-dev.html","/release/archive/v1.5.1/","/release/archive/v1.5.1/process-plugins-advanced.html","/release/archive/v1.2.0/maintain/allowList-mgm.html","/release/archive/v1.2.0/maintain/install.html","/release/archive/v1.2.0/maintain/","/release/archive/v1.2.0/maintain/upgrade-from-0.html","/release/archive/v1.2.0/maintain/upgrade-from-1.html","/release/archive/v1.2.0/develop/create.html","/release/archive/v1.2.0/develop/","/release/archive/v1.2.0/develop/upgrade-from-0.html","/release/archive/v1.3.0/develop/create.html","/release/archive/v1.3.0/develop/","/release/archive/v1.3.0/develop/upgrade-from-0.html","/release/archive/v1.5.2/dsf-for-dev.html","/release/archive/v1.5.2/","/release/archive/v1.5.2/process-plugins-advanced.html","/release/archive/v1.3.0/maintain/allowList-mgm.html","/release/archive/v1.3.0/maintain/install-plugins.html","/release/archive/v1.3.0/maintain/install.html","/release/archive/v1.3.0/maintain/","/release/archive/v1.3.0/maintain/upgrade-from-0.html","/release/archive/v1.3.0/maintain/upgrade-from-1.html","/release/archive/v1.3.1/develop/create.html","/release/archive/v1.3.1/develop/","/release/archive/v1.3.1/develop/upgrade-from-0.html","/release/archive/v1.3.1/maintain/allowList-mgm.html","/release/archive/v1.3.1/maintain/install-plugins.html","/release/archive/v1.3.1/maintain/install.html","/release/archive/v1.3.1/maintain/","/release/archive/v1.3.1/maintain/upgrade-from-0.html","/release/archive/v1.3.1/maintain/upgrade-from-1.html","/release/archive/v1.3.2/develop/create.html","/release/archive/v1.3.2/develop/","/release/archive/v1.3.2/develop/upgrade-from-0.html","/release/archive/v1.3.2/maintain/allowList-mgm.html","/release/archive/v1.3.2/maintain/install-plugins.html","/release/archive/v1.3.2/maintain/install.html","/release/archive/v1.3.2/maintain/","/release/archive/v1.3.2/maintain/upgrade-from-0.html","/release/archive/v1.3.2/maintain/upgrade-from-1.html","/release/archive/v1.5.0/contribute/code.html","/release/archive/v1.5.0/contribute/documentation.html","/release/archive/v1.5.0/contribute/","/release/archive/v1.5.0/develop/create.html","/release/archive/v1.5.0/develop/","/release/archive/v1.5.0/develop/upgrade-from-0.html","/release/archive/v1.5.0/maintain/allowList-mgm.html","/release/archive/v1.5.0/maintain/install-plugins.html","/release/archive/v1.5.0/maintain/install.html","/release/archive/v1.5.0/maintain/","/release/archive/v1.5.0/maintain/upgrade-from-0.html","/release/archive/v1.5.0/maintain/upgrade-from-1.html","/release/archive/v1.4.0/develop/create.html","/release/archive/v1.4.0/develop/","/release/archive/v1.4.0/develop/upgrade-from-0.html","/release/archive/v1.4.0/contribute/code.html","/release/archive/v1.4.0/contribute/documentation.html","/release/archive/v1.4.0/contribute/","/release/archive/v1.4.0/maintain/allowList-mgm.html","/release/archive/v1.4.0/maintain/install-plugins.html","/release/archive/v1.4.0/maintain/install.html","/release/archive/v1.4.0/maintain/","/release/archive/v1.4.0/maintain/upgrade-from-0.html","/release/archive/v1.4.0/maintain/upgrade-from-1.html","/release/archive/v1.0.0/maintain/configuration/bpe.html","/release/archive/v1.0.0/maintain/configuration/common.html","/release/archive/v1.0.0/maintain/configuration/fhir.html","/release/archive/v1.0.0/maintain/configuration/","/release/archive/v1.0.0/maintain/configuration/reverseproxy.html","/release/archive/v1.1.0/maintain/bpe/configuration.html","/release/archive/v1.1.0/maintain/bpe/","/release/archive/v1.1.0/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.1.0/maintain/fhir-reverse-proxy/","/release/archive/v1.1.0/maintain/fhir/access-control.html","/release/archive/v1.1.0/maintain/fhir/configuration.html","/release/archive/v1.1.0/maintain/fhir/oidc.html","/release/archive/v1.1.0/maintain/fhir/","/release/archive/v1.5.1/contribute/code.html","/release/archive/v1.5.1/contribute/documentation.html","/release/archive/v1.5.1/contribute/","/release/archive/v1.5.1/develop/create.html","/release/archive/v1.5.1/develop/","/release/archive/v1.5.1/develop/upgrade-from-0.html","/release/archive/v1.5.1/maintain/allowList-mgm.html","/release/archive/v1.5.1/maintain/install-plugins.html","/release/archive/v1.5.1/maintain/install.html","/release/archive/v1.5.1/maintain/","/release/archive/v1.5.1/maintain/upgrade-from-0.html","/release/archive/v1.5.1/maintain/upgrade-from-1.html","/release/archive/v1.2.0/maintain/bpe/configuration.html","/release/archive/v1.2.0/maintain/bpe/","/release/archive/v1.2.0/maintain/fhir/access-control.html","/release/archive/v1.2.0/maintain/fhir/configuration.html","/release/archive/v1.2.0/maintain/fhir/oidc.html","/release/archive/v1.2.0/maintain/fhir/","/release/archive/v1.5.2/contribute/code.html","/release/archive/v1.5.2/contribute/documentation.html","/release/archive/v1.5.2/contribute/","/release/archive/v1.5.2/develop/create.html","/release/archive/v1.5.2/develop/","/release/archive/v1.5.2/develop/upgrade-from-0.html","/release/archive/v1.2.0/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.2.0/maintain/fhir-reverse-proxy/","/release/archive/v1.5.2/maintain/allowList-mgm.html","/release/archive/v1.5.2/maintain/install-plugins.html","/release/archive/v1.5.2/maintain/install.html","/release/archive/v1.5.2/maintain/","/release/archive/v1.5.2/maintain/upgrade-from-0.html","/release/archive/v1.5.2/maintain/upgrade-from-1.html","/release/archive/v1.3.0/maintain/bpe/configuration.html","/release/archive/v1.3.0/maintain/bpe/","/release/archive/v1.3.0/maintain/fhir/access-control.html","/release/archive/v1.3.0/maintain/fhir/configuration.html","/release/archive/v1.3.0/maintain/fhir/oidc.html","/release/archive/v1.3.0/maintain/fhir/","/release/archive/v1.3.1/maintain/bpe/configuration.html","/release/archive/v1.3.1/maintain/bpe/","/release/archive/v1.3.0/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.3.0/maintain/fhir-reverse-proxy/","/release/archive/v1.3.1/maintain/fhir/access-control.html","/release/archive/v1.3.1/maintain/fhir/configuration.html","/release/archive/v1.3.1/maintain/fhir/oidc.html","/release/archive/v1.3.1/maintain/fhir/","/release/archive/v1.3.1/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.3.1/maintain/fhir-reverse-proxy/","/release/archive/v1.3.2/maintain/bpe/configuration.html","/release/archive/v1.3.2/maintain/bpe/","/release/archive/v1.3.2/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.3.2/maintain/fhir-reverse-proxy/","/release/archive/v1.3.2/maintain/fhir/access-control.html","/release/archive/v1.3.2/maintain/fhir/configuration.html","/release/archive/v1.3.2/maintain/fhir/oidc.html","/release/archive/v1.3.2/maintain/fhir/","/release/archive/v1.5.0/maintain/bpe/access-control.html","/release/archive/v1.5.0/maintain/bpe/configuration.html","/release/archive/v1.5.0/maintain/bpe/oidc.html","/release/archive/v1.5.0/maintain/bpe/","/release/archive/v1.5.0/maintain/bpe-reverse-proxy/configuration.html","/release/archive/v1.5.0/maintain/bpe-reverse-proxy/","/release/archive/v1.5.0/maintain/fhir/access-control.html","/release/archive/v1.5.0/maintain/fhir/configuration.html","/release/archive/v1.5.0/maintain/fhir/oidc.html","/release/archive/v1.5.0/maintain/fhir/","/release/archive/v1.5.0/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.5.0/maintain/fhir-reverse-proxy/","/release/archive/v1.4.0/maintain/bpe/configuration.html","/release/archive/v1.4.0/maintain/bpe/","/release/archive/v1.4.0/maintain/fhir/access-control.html","/release/archive/v1.4.0/maintain/fhir/configuration.html","/release/archive/v1.4.0/maintain/fhir/oidc.html","/release/archive/v1.4.0/maintain/fhir/","/release/archive/v1.4.0/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.4.0/maintain/fhir-reverse-proxy/","/release/archive/v1.5.1/maintain/bpe/access-control.html","/release/archive/v1.5.1/maintain/bpe/configuration.html","/release/archive/v1.5.1/maintain/bpe/oidc.html","/release/archive/v1.5.1/maintain/bpe/","/release/archive/v1.5.1/maintain/bpe-reverse-proxy/configuration.html","/release/archive/v1.5.1/maintain/bpe-reverse-proxy/","/release/archive/v1.5.1/maintain/fhir/access-control.html","/release/archive/v1.5.1/maintain/fhir/configuration.html","/release/archive/v1.5.1/maintain/fhir/oidc.html","/release/archive/v1.5.1/maintain/fhir/","/release/archive/v1.5.1/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.5.1/maintain/fhir-reverse-proxy/","/release/archive/v1.5.2/maintain/bpe/access-control.html","/release/archive/v1.5.2/maintain/bpe/configuration.html","/release/archive/v1.5.2/maintain/bpe/oidc.html","/release/archive/v1.5.2/maintain/bpe/","/release/archive/v1.5.2/maintain/bpe-reverse-proxy/configuration.html","/release/archive/v1.5.2/maintain/bpe-reverse-proxy/","/release/archive/v1.5.2/maintain/fhir/access-control.html","/release/archive/v1.5.2/maintain/fhir/configuration.html","/release/archive/v1.5.2/maintain/fhir/oidc.html","/release/archive/v1.5.2/maintain/fhir/","/release/archive/v1.5.2/maintain/fhir-reverse-proxy/configuration.html","/release/archive/v1.5.2/maintain/fhir-reverse-proxy/","/404.html","/intro/info/","/release/archive/","/release/"]; diff --git a/src/.vuepress/.temp/shiki/config.js b/src/.vuepress/.temp/shiki/config.js new file mode 100644 index 000000000..2d4c147ee --- /dev/null +++ b/src/.vuepress/.temp/shiki/config.js @@ -0,0 +1,2 @@ +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/highlighter-helper/lib/client/styles/base.css" +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-shiki/lib/client/styles/shiki.css" \ No newline at end of file diff --git a/src/.vuepress/.temp/theme-hope/config.js b/src/.vuepress/.temp/theme-hope/config.js new file mode 100644 index 000000000..f39ab1fcc --- /dev/null +++ b/src/.vuepress/.temp/theme-hope/config.js @@ -0,0 +1,51 @@ +import { defineClientConfig } from "vuepress/client"; +import { HopeIcon, Layout, NotFound, injectDarkmode, setupDarkmode, setupSidebarItems, scrollPromise } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/lib/bundle/export.js"; + +import { defineCatalogInfoGetter } from "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/plugin-catalog/lib/client/index.js" +import { h } from "vue" + +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/@vuepress/helper/lib/client/styles/normalize.css"; +import "D:/Studium AI/DSF/Repo/datasharingframework.github.io/node_modules/vuepress-theme-hope/lib/bundle/styles/all.scss"; + +defineCatalogInfoGetter((meta) => { + const title = meta.t; + const shouldIndex = meta.I !== false; + const icon = meta.i; + + return shouldIndex ? { + title, + content: icon ? () =>[h(HopeIcon, { icon }), title] : null, + order: meta.O, + index: meta.I, + } : null; +}); + +export default defineClientConfig({ + enhance: ({ app, router }) => { + const { scrollBehavior } = router.options; + + router.options.scrollBehavior = async (...args) => { + await scrollPromise.wait(); + + return scrollBehavior(...args); + }; + + // inject global properties + injectDarkmode(app); + + // provide HopeIcon as global component + app.component("HopeIcon", HopeIcon); + + + }, + setup: () => { + setupDarkmode(); + setupSidebarItems(); + + }, + layouts: { + Layout, + NotFound, + + } +}); \ No newline at end of file diff --git a/src/.vuepress/.temp/theme-hope/highlighter.scss b/src/.vuepress/.temp/theme-hope/highlighter.scss new file mode 100644 index 000000000..10d3872c8 --- /dev/null +++ b/src/.vuepress/.temp/theme-hope/highlighter.scss @@ -0,0 +1 @@ +$highlighter: "shiki"; diff --git a/src/.vuepress/.temp/theme-hope/sidebar.js b/src/.vuepress/.temp/theme-hope/sidebar.js new file mode 100644 index 000000000..25d64718e --- /dev/null +++ b/src/.vuepress/.temp/theme-hope/sidebar.js @@ -0,0 +1 @@ +export const sidebarData = {}; diff --git a/src/.vuepress/.temp/vite-root/index.html b/src/.vuepress/.temp/vite-root/index.html new file mode 100644 index 000000000..e29c9598c --- /dev/null +++ b/src/.vuepress/.temp/vite-root/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + </head> + <body> + <div id="app"></div> + <script type="module"> +import 'vuepress/client-app' +</script> +</body> +</html> From 2b28da9f56aa622afc660b09bb5a0d10d37144b6 Mon Sep 17 00:00:00 2001 From: Serap Aydin <saydin3@stud.hs-heilbronn.de> Date: Wed, 21 May 2025 13:29:22 +0200 Subject: [PATCH 13/42] =?UTF-8?q?-=20menu=20f=C3=BCr=20explore=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/.vuepress/theme.ts | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index cc161c46c..d5c7781c4 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -28,7 +28,7 @@ export default hopeTheme({ { text: "Explore", icon: "info", - children: ["/intro/info/introduction", "/intro/use-cases/", "/intro/research/", "/intro/tutorials/"], + children: ["/explore/concepts/introduction", "/explore/use-cases/", "/explore/publications/"], }, { text: "Security", @@ -110,9 +110,9 @@ export default hopeTheme({ { text: "Concepts", icon: "info", - prefix: "intro/", - link: "intro/", - children: ["info/introduction.md", "info/basics", "info/architecture", "info/security", "info/allowList", "info/process-plugins"], + prefix: "explore/", + link: "explore/", + children: ["concepts/introduction.md", "concepts/basics", "concepts/architecture", "concepts/security", "concepts/allow-list", "concepts/process-plugins"], }, { text: "Security", @@ -122,27 +122,21 @@ export default hopeTheme({ { text: "Use-Cases", icon: "any", - prefix: "intro/use-cases/", - link: "intro/use-cases/", + prefix: "explore/use-cases/", + link: "explore/use-cases/", children: ["feasibility", "num"], }, { - text: "Research", + text: "Publications", icon: "blog", - prefix: "intro/research/", - link: "/intro/research/", + prefix: "explore/publications/", + link: "/explore/publications/", children: ["publications", "awards"], }, - { - text: "Tutorials", - icon: "edit", - link: "/intro/tutorials/", - } ], "/hackathon": [], "/spring-school": [], "/news": [], - "/api-documentation": [], "/stable/": [ { text: "Home", From 1d7dead0f092e0722bcd9db6bc490946e18d099d Mon Sep 17 00:00:00 2001 From: Serap Aydin <saydin3@stud.hs-heilbronn.de> Date: Wed, 21 May 2025 14:32:06 +0200 Subject: [PATCH 14/42] =?UTF-8?q?-=20Men=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/.vuepress/theme.ts | 80 +++++++++++++++---- docs/src/process-development/api-v1/README.md | 5 ++ .../src/process-development/api-v1/concept.md | 4 +- .../{tutorials.md => tutorials/README.md} | 0 .../api-v2/tutorials/README.md | 0 5 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 docs/src/process-development/api-v1/README.md rename docs/src/process-development/api-v1/{tutorials.md => tutorials/README.md} (100%) create mode 100644 docs/src/process-development/api-v2/tutorials/README.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index d5c7781c4..9349c720a 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -38,14 +38,14 @@ export default hopeTheme({ ] }, { - text: "Get Started", - icon: "launch", - prefix: "/stable/", - children: [ + text: "Operations", + icon: "launch", + prefix: "/operations/", + children: [ { - text: "Guideline v1.7.1 (stable)", + text: "Operations", icon: "info", - children: ["index", "maintain/install", "maintain/upgrade-from-0", "maintain/allowList-mgm", "maintain/install-plugins", "develop/create", "contribute/"], + children: [ "get-started", "process-plugin-deployment"], } ] }, @@ -57,27 +57,38 @@ export default hopeTheme({ { text: "Process Developments", icon: "docs", - children: ["dsf-api-1/description", "dsf-api-2/README.md", "how-to/start-project", "process-plugin", "publishing", "tooling"], + children: ["api-v1/concept", "api-v2/README.md", "how-to/start-project", "process-plugin/", "publishing/publish-on-dsfhub"], } ] + }, + { + text: "DSF Development", + icon: "info", + link: "/dsf-development/", }, { - text: "About", + text: "Community", icon: "creative", - prefix: "/about/", + prefix: "/community/", children: [ { - text: "Learn More", + text: "About us", icon: "creative", - prefix: "learnmore/", - children: ["contact", "team", "partners", "public", "faq", "projectlist", "speakinghours"], + prefix: "about/", + children: ["contact", "team", "partners", "public", "faq", "projectlist"], }, { - text: "Community", + text: "Contribute", icon: "creative", - prefix: "community/", - children: ["community", "contribute"], + prefix: "contribute/", + children: ["contribute"], }, + { + text: "Events", + icon: "creative", + prefix: "events/", + children: ["tutorials/"], + }, "communications" , "dsf-ecosytem", "speakinghours" ], }, { @@ -1219,6 +1230,45 @@ export default hopeTheme({ link: "community/", children: ["community", "contribute", "code", "documentation"], }, + ], + "/process-development": [ + { + text: "api v1", + icon: "", + prefix: "api-v1/", + link: "api-v1/", + children: [ "concept", "tooling/", "tutorials/"], + }, + { + text: "api v2", + icon: "", + prefix: "api-v2/", + link: "api-v2/", + children: [ "description","implementation", "migration", "tooling/", "tutorials/",], + }, + { + text: "how-to", + icon: "creative", + prefix: "how-to/", + link: "how-to/", + children: ["start-project"], + }, + { + text: "process-plugin", + icon: "process", + prefix: "process-plugin/", + link: "process-plugin/", + children: ["best-practise", "create", "testing"], + }, + { + text: "publishing", + icon: "publish", + prefix: "publishing/", + link: "publishing/", + children: ["publish-on-dsfhub"], + }, + + ], "/oldstable/": [ { diff --git a/docs/src/process-development/api-v1/README.md b/docs/src/process-development/api-v1/README.md new file mode 100644 index 000000000..a32a01bf5 --- /dev/null +++ b/docs/src/process-development/api-v1/README.md @@ -0,0 +1,5 @@ +--- +title: API 1 +icon: code +--- +## Overview diff --git a/docs/src/process-development/api-v1/concept.md b/docs/src/process-development/api-v1/concept.md index 97f969164..f1a8be07d 100644 --- a/docs/src/process-development/api-v1/concept.md +++ b/docs/src/process-development/api-v1/concept.md @@ -1,6 +1,6 @@ --- -title: API 1 -icon: code +title: Concepts +icon: info --- ## API 1 Description diff --git a/docs/src/process-development/api-v1/tutorials.md b/docs/src/process-development/api-v1/tutorials/README.md similarity index 100% rename from docs/src/process-development/api-v1/tutorials.md rename to docs/src/process-development/api-v1/tutorials/README.md diff --git a/docs/src/process-development/api-v2/tutorials/README.md b/docs/src/process-development/api-v2/tutorials/README.md new file mode 100644 index 000000000..e69de29bb From 44d65300c9303a6a4d09a3fb1d882a3c280d98cb Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 16:01:00 +0200 Subject: [PATCH 15/42] fixed menus, etc --- docs/src/.vuepress/theme.ts | 117 ++++++------------ docs/src/community/README.md | 22 +--- docs/src/community/about/contact.md | 16 --- docs/src/community/communication.md | 20 +++ docs/src/community/communications.md | 0 docs/src/community/consultation-hours.md | 18 +++ docs/src/community/contribute/README.md | 39 ++++-- docs/src/community/contribute/contribute.md | 35 ------ docs/src/community/dsf-ecosystem.md | 0 docs/src/community/ecosystem.md | 27 ++++ docs/src/community/events/tutorials/README.md | 2 +- docs/src/community/speakinghours.md | 17 --- docs/src/community/{about => }/team.md | 0 docs/src/dsf-development/README.md | 5 + docs/src/operations/get-started.md | 6 +- docs/src/operations/old-versions.md | 11 ++ .../operations/process-plugin-deployment.md | 5 + docs/src/operations/v1/latest | 1 + .../operations/v1/v1.7.1/develop/README.md | 7 -- .../operations/v1/v1.7.1/develop/create.md | 14 --- .../v1/v1.7.1/develop/upgrade-from-0.md | 10 -- docs/src/operations/v1/v1.7.1/dsf-for-dev.md | 4 - docs/src/operations/v1/v1.7.1/index.md | 16 +-- .../v1/v1.7.1/process-plugins-advanced.md | 4 - docs/src/process-development/api-v1/README.md | 2 +- .../{process-plugin => api-v1}/create.md | 0 .../get-started.md} | 2 +- .../publishing/publish-on-dsfhub.md | 0 docs/src/process-development/api-v2/README.md | 2 +- .../best-practices.md} | 0 docs/src/process-development/api-v2/create.md | 10 ++ .../process-development/api-v2/get-started.md | 12 ++ .../api-v2/publishing/publish-on-dsfhub.md | 8 ++ .../{process-plugin => api-v2}/testing.md | 0 docs/src/sprechstunde/readme.md | 1 + 35 files changed, 206 insertions(+), 227 deletions(-) create mode 100644 docs/src/community/communication.md delete mode 100644 docs/src/community/communications.md create mode 100644 docs/src/community/consultation-hours.md delete mode 100644 docs/src/community/contribute/contribute.md delete mode 100644 docs/src/community/dsf-ecosystem.md create mode 100644 docs/src/community/ecosystem.md delete mode 100644 docs/src/community/speakinghours.md rename docs/src/community/{about => }/team.md (100%) create mode 100644 docs/src/operations/old-versions.md create mode 120000 docs/src/operations/v1/latest delete mode 100644 docs/src/operations/v1/v1.7.1/develop/README.md delete mode 100644 docs/src/operations/v1/v1.7.1/develop/create.md delete mode 100644 docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md delete mode 100644 docs/src/operations/v1/v1.7.1/dsf-for-dev.md delete mode 100644 docs/src/operations/v1/v1.7.1/process-plugins-advanced.md rename docs/src/process-development/{process-plugin => api-v1}/create.md (100%) rename docs/src/process-development/{how-to/start-project.md => api-v1/get-started.md} (84%) rename docs/src/process-development/{ => api-v1}/publishing/publish-on-dsfhub.md (100%) rename docs/src/process-development/{process-plugin/best-practise.md => api-v2/best-practices.md} (100%) create mode 100644 docs/src/process-development/api-v2/create.md create mode 100644 docs/src/process-development/api-v2/get-started.md create mode 100644 docs/src/process-development/api-v2/publishing/publish-on-dsfhub.md rename docs/src/process-development/{process-plugin => api-v2}/testing.md (100%) create mode 100644 docs/src/sprechstunde/readme.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 9349c720a..9301e7ee0 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -3,7 +3,7 @@ import { hopeTheme } from "vuepress-theme-hope"; export default hopeTheme({ author: { name: "DSF-Team", - url: "/about/learnmore/team.html", + url: "/community/team.html", }, iconAssets: "/assets/font/font.css", @@ -24,79 +24,54 @@ export default hopeTheme({ text: "Explore", icon: "info", prefix: "", - children: [ - { - text: "Explore", - icon: "info", - children: ["/explore/concepts/introduction", "/explore/use-cases/", "/explore/publications/"], - }, - { - text: "Security", - icon: "safe", - link: "/security/", - } - ] + children: ["/explore/concepts/introduction", "/explore/use-cases/", "/explore/publications/", "/security/"], }, { text: "Operations", icon: "launch", prefix: "/operations/", - children: [ - { - text: "Operations", - icon: "info", - children: [ "get-started", "process-plugin-deployment"], - } - ] + children: [ "get-started.md", "process-plugin-deployment.md", "old-versions.md"], }, { text: "Process Development", icon: "process", prefix: "/process-development/", children: [ - { - text: "Process Developments", - icon: "docs", - children: ["api-v1/concept", "api-v2/README.md", "how-to/start-project", "process-plugin/", "publishing/publish-on-dsfhub"], - } - ] - }, + { + text: "API v1", + children: [ + "api-v1/readme.md", + "api-v1/get-started.md" + ] + }, + { + text: "API v2", + children: [ + "api-v2/readme.md", + "api-v2/get-started.md" + ] + } + ] + + }/*, { text: "DSF Development", icon: "info", link: "/dsf-development/", - }, + }*/, { text: "Community", icon: "creative", prefix: "/community/", children: [ - { - text: "About us", - icon: "creative", - prefix: "about/", - children: ["contact", "team", "partners", "public", "faq", "projectlist"], - }, - { - text: "Contribute", - icon: "creative", - prefix: "contribute/", - children: ["contribute"], - }, - { - text: "Events", - icon: "creative", - prefix: "events/", - children: ["tutorials/"], - }, "communications" , "dsf-ecosytem", "speakinghours" + "team", + "communication", + "ecosystem", + "contribute/", + "events/", + "consultation-hours" ], }, - { - text: "Versions", - icon: "note", - // children:["/v1/"], - children: [{ text: "v1.7.1 (stable)", link: "/stable/" }, { text: "v1.7.0", link: "/v1.7.0/" }, { text: "v1.6.0", link: "/v1.6.0/" }, { text: "v1.5.2", link: "/v1.5.2/" }, { text: "v1.5.1", link: "/v1.5.1/" }, { text: "v1.5.0", link: "/v1.5.0/" }, { text: "v1.4.0", link: "/v1.4.0/" }, { text: "v1.3.2", link: "/v1.3.2/" }, { text: "v1.3.1", link: "/v1.3.1/" }, { text: "v1.3.0", link: "/v1.3.0/" }, { text: "v1.2.0", link: "/v1.2.0/" }, { text: "v1.1.0", link: "/v1.1.0/" }, { text: "v1.0.0", link: "/v1.0.0/" }, { text: "v0.9.3 (archived)", link: "/oldstable/"}], - }, { text: "", icon: "github", @@ -250,7 +225,7 @@ export default hopeTheme({ ] }, ], - "/v1.7.1/": [ + "/operations/v1/v1.7.1/": [ { text: "Home", icon: "home", @@ -333,7 +308,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.7.0/": [ + "/operations/v1/v1.7.0/": [ { text: "Home", icon: "home", @@ -419,7 +394,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.6.0/": [ + "/operations/v1/v1.6.0/": [ { text: "Home", icon: "home", @@ -506,7 +481,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.5.2/": [ + "/operations/v1/v1.5.2/": [ { text: "Home", icon: "home", @@ -593,7 +568,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.5.1/": [ + "/operations/v1/v1.5.1/": [ { text: "Home", icon: "home", @@ -680,7 +655,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.5.0/": [ + "/operations/v1/v1.5.0/": [ { text: "Home", icon: "home", @@ -767,7 +742,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.4.0/": [ + "/operations/v1/v1.4.0/": [ { text: "Home", icon: "home", @@ -836,7 +811,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.3.2/": [ + "/operations/v1/v1.3.2/": [ { text: "Home", icon: "home", @@ -905,7 +880,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.3.1/": [ + "/operations/v1/v1.3.1/": [ { text: "Home", icon: "home", @@ -974,7 +949,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.3.0/": [ + "/operations/v1/v1.3.0/": [ { text: "Home", icon: "home", @@ -1043,7 +1018,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.2.0/": [ + "/operations/v1/v1.2.0/": [ { text: "Home", icon: "home", @@ -1107,7 +1082,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.1.0/": [ + "/operations/v1/v1.1.0/": [ { text: "Home", icon: "home", @@ -1171,7 +1146,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/v1.0.0/": [ + "/operations/v1/v1.0.0/": [ { text: "Home", icon: "home", @@ -1269,18 +1244,6 @@ export default hopeTheme({ }, - ], - "/oldstable/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Version 0.9.x", - icon: "guide", - children: ["introduction", "generalinformation/", "code/", "build/", "releases/", "tutorial/"], - }, ], "/intro/use-cases/internal-mii-data-sharing.html": [] }, diff --git a/docs/src/community/README.md b/docs/src/community/README.md index 970d63b29..e057b760c 100644 --- a/docs/src/community/README.md +++ b/docs/src/community/README.md @@ -1,21 +1,11 @@ --- -title: About +title: Community icon: creative --- -## Overview -### About Us -- [Contact & Community Guide](learnmore/contact) -- [Contributors](learnmore/team) -- [Partners](learnmore/partners) -- [Public Funding](learnmore/public) -- [FAQ](/about/learnmore/faq.md) -- [Projectlist](/about/learnmore/projectlist.md) -- [Speakinghours](/about/learnmore/speakinghours.md) - -### DSF Community -- [Community](/about/community/community.md) -- [Contribute](/about/community/contribute/readme.md) -- [Code](/about/community/contribute/code.md) -- [Documentation](/about/community/contribute/documentation.md) +- [Consultation Hours](./consultation-hours.md) +- [Team](./team.md) +- [Communication](./communication.md) +- [Contribute](./contribute/readme.md) +- [DSF Ecosystem](./ecosystem.md) diff --git a/docs/src/community/about/contact.md b/docs/src/community/about/contact.md index 6628f5a30..1d10cc1c8 100644 --- a/docs/src/community/about/contact.md +++ b/docs/src/community/about/contact.md @@ -2,19 +2,3 @@ title: Contact & Community icon: call --- -## :envelope: <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-MAIL</a> -Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible. - -## :busts_in_silhouette: COMMUNITY -DSF's community is growing and we welcome anyone who would like to join! :rocket: - -### Stay up to Date -- [GitHub](https://github.com/datasharingframework/dsf) -- Follow our [contributors](/about/learnmore/team.md) on GitHub -- [Zulip Chat - MII](https://mii.zulipchat.com) (If you would like access, please write us an <a href="mailto:dsf-gecko@hs-heilbronn.de">E-MAIL</a>) - -### Contribute Code -You can get familiar with the DSF code on GitHub. Branching follows the git-flow model, for the latest development version see branch [develop](https://github.com/datasharingframework/dsf/tree/develop). Additionally, you can find more information [here](/stable/) in the documentation. - -### Share your Experience & Get support -You´re welcome to share your experience with the Community. If you have a bug to report or feature to request, that's what the [GitHub issues](https://github.com/datasharingframework/dsf/issues) are for. \ No newline at end of file diff --git a/docs/src/community/communication.md b/docs/src/community/communication.md new file mode 100644 index 000000000..782178231 --- /dev/null +++ b/docs/src/community/communication.md @@ -0,0 +1,20 @@ +--- +title: Communication +--- + +## Contact the team +Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible. + +## Community +DSF's community is growing and we welcome anyone who would like to join! :rocket: + +### Stay up to Date +- [GitHub](https://github.com/datasharingframework/dsf) +- Follow our [contributors](/about/learnmore/team.md) on GitHub +- [Zulip Chat - MII](https://mii.zulipchat.com) + +### Contribute Code +You can get familiar with the DSF code on GitHub. Branching follows the git-flow model, for the latest development version see branch [develop](https://github.com/datasharingframework/dsf/tree/develop). Additionally, you can find more information [here](/dsf-development/) in the documentation. + +### Share your Experience & Get support +You´re welcome to share your experience with the Community. If you have a bug to report or feature to request, that's what the [GitHub issues](https://github.com/datasharingframework/dsf/issues) are for. \ No newline at end of file diff --git a/docs/src/community/communications.md b/docs/src/community/communications.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/src/community/consultation-hours.md b/docs/src/community/consultation-hours.md new file mode 100644 index 000000000..7afd081d9 --- /dev/null +++ b/docs/src/community/consultation-hours.md @@ -0,0 +1,18 @@ +--- +title: Consultation Hours +--- + + +::: warning Schedule Change +Due to the FDPG Data Extraction Consultation (DANA), the consultation hour will take place from 14:00–14:50 starting January 20, 2025. +::: + +::: tip Joint Technical Consultation of the DSF Community and FDPG+ + +Mondays, 14:00–14:50 + +Location: https://dsf.dev/sprechstunde +::: + +Click [here](https://lecture.senfcall.de/sim-ock-1vk-l8o) to join the consultation hour. + diff --git a/docs/src/community/contribute/README.md b/docs/src/community/contribute/README.md index 6c64b8682..bbacced29 100644 --- a/docs/src/community/contribute/README.md +++ b/docs/src/community/contribute/README.md @@ -1,12 +1,35 @@ --- -title: DSF Community -icon: group +title: Contribute +icon: info --- -## Overview +We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact. -### DSF Community -- [Community](/about/community/community.md) -- [Contribute](/about/community/contribute/readme.md) -- [Code](/about/community/contribute/code.md) -- [Documentation](/about/community/contribute/documentation.md) +### **Ways you can contribute:** + + +1. **Helping other users**: + * **MII Zulip**: If you are part of the German Medical Informatics Initiative, [join the MII Zulip community](https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29) to assist others, share your knowledge, and learn from fellow contributors. + * **GitHub Discussions**: Engage with our community in [GitHub Discussions](https://github.com/datasharingframework/dsf/discussions) by answering questions, providing feedback, and sharing your insights. +2. **Testing releases**: + * **Stay ahead**: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable. + * **Report findings**: Share your testing results to help us refine and enhance our releases. +3. **Reviewing changes**: + * **Peer review**: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes. + * **Constructive feedback**: Offer constructive feedback and suggestions to help improve and refine proposed changes. +4. **Documentation changes**: + * **Improve documentation**: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our [Getting started guide for documentation contributions](./documentation) to DSF. + * **Suggest improvements**: If you notice gaps or areas for enhancement in our documentation, we welcome [your suggestions and contributions](https://github.com/datasharingframework/datasharingframework.github.io). +5. **Contributing bug reports**: + * **Report bugs**: If you find a bug, please report it via [an issue on GitHub](https://github.com/datasharingframework/dsf/issues). Detailed bug reports are incredibly helpful. + * **Reproduction steps**: Include steps to reproduce the bug and any relevant logs according to our bug report issue template. +6. **Contributing feature requests**: + * **Suggest features**: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template. + * **Collaborate on implementation**: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our [Getting started guide for code contributions](./code) to DSF. +7. **Contributing process plugins**: + * **Develop process plugins for the DSF**: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our [Getting started guide for process plugin development](https://dsf.dev/stable/develop/) will be a useful reference. + * **Share your work**: Your plugins could be a valuable addition to the ecosystem and benefit other users. + +Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved. + +**Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!** \ No newline at end of file diff --git a/docs/src/community/contribute/contribute.md b/docs/src/community/contribute/contribute.md deleted file mode 100644 index bbacced29..000000000 --- a/docs/src/community/contribute/contribute.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Contribute -icon: info ---- - -We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact. - -### **Ways you can contribute:** - - -1. **Helping other users**: - * **MII Zulip**: If you are part of the German Medical Informatics Initiative, [join the MII Zulip community](https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29) to assist others, share your knowledge, and learn from fellow contributors. - * **GitHub Discussions**: Engage with our community in [GitHub Discussions](https://github.com/datasharingframework/dsf/discussions) by answering questions, providing feedback, and sharing your insights. -2. **Testing releases**: - * **Stay ahead**: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable. - * **Report findings**: Share your testing results to help us refine and enhance our releases. -3. **Reviewing changes**: - * **Peer review**: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes. - * **Constructive feedback**: Offer constructive feedback and suggestions to help improve and refine proposed changes. -4. **Documentation changes**: - * **Improve documentation**: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our [Getting started guide for documentation contributions](./documentation) to DSF. - * **Suggest improvements**: If you notice gaps or areas for enhancement in our documentation, we welcome [your suggestions and contributions](https://github.com/datasharingframework/datasharingframework.github.io). -5. **Contributing bug reports**: - * **Report bugs**: If you find a bug, please report it via [an issue on GitHub](https://github.com/datasharingframework/dsf/issues). Detailed bug reports are incredibly helpful. - * **Reproduction steps**: Include steps to reproduce the bug and any relevant logs according to our bug report issue template. -6. **Contributing feature requests**: - * **Suggest features**: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template. - * **Collaborate on implementation**: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our [Getting started guide for code contributions](./code) to DSF. -7. **Contributing process plugins**: - * **Develop process plugins for the DSF**: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our [Getting started guide for process plugin development](https://dsf.dev/stable/develop/) will be a useful reference. - * **Share your work**: Your plugins could be a valuable addition to the ecosystem and benefit other users. - -Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved. - -**Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!** \ No newline at end of file diff --git a/docs/src/community/dsf-ecosystem.md b/docs/src/community/dsf-ecosystem.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/src/community/ecosystem.md b/docs/src/community/ecosystem.md new file mode 100644 index 000000000..b8f46c4d5 --- /dev/null +++ b/docs/src/community/ecosystem.md @@ -0,0 +1,27 @@ +--- +title: DSF Ecosystem +--- + +We believe that the Data Sharing Framework (DSF) can only develop its full potential when embedded in a well-connected network of tools, organizations, and individuals. + +We appreciate the contributions of everyone who supports this shared approach—whether by directly advancing the DSF or by developing and applying tools that make use of it in various contexts. + +Your expertise and ongoing efforts are an essential part of this broader ecosystem. + + +- [Medical Informatics Initiative (MII)](https://www.medizininformatik-initiative.de/en/start) + - [German Portal for Medical Research Data (FDPG)](https://forschen-fuer-gesundheit.de/en/) + - [The FDPG+ Project and Team](https://www.gesundheitsforschung-bmbf.de/de/fdpg-plus-medizininformatik-struktur-erweiterung-des-mii-forschungsdatenportals-fur-16137.php) + - [Open Medical Inference (OMI)](https://omi.ikim.nrw/) + - [MII Service Unit Terminological Services (SU-TermServ)](https://mii-termserv.de/en/) + - [TRANSIT Data Management Unit](https://www.isst.fraunhofer.de/en/departments/healthcare/projects/TRANSIT.html) +- [Network University Medicine](https://www.netzwerk-universitaetsmedizin.de/en) + - [NUM Dashboard](https://numdashboard.ukbonn.de/welcome) + - [NUM RDP](https://www.netzwerk-universitaetsmedizin.de/en/projects/num-rdp) +- [German Cancer Research Center (DKFZ)](https://www.dkfz.de/en/) + - [Digital Oncology](https://www.dkfz.de/en/research/cross-topics/digital-oncology) + - [National Center for Tumor Diseases (NCT)](https://www.dkfz.de/en/research/translational-centers/nct) +- [Bavarian Center for Cancer Research (BZKF)](https://bzkf.de/) +- Various working groups and contributors + +And, of course, individuals whose dedication and insight continue to drive the DSF forward. \ No newline at end of file diff --git a/docs/src/community/events/tutorials/README.md b/docs/src/community/events/tutorials/README.md index 0912802c3..4ae36def0 100644 --- a/docs/src/community/events/tutorials/README.md +++ b/docs/src/community/events/tutorials/README.md @@ -1,5 +1,5 @@ --- -title: Tutorials +title: Events icon: edit --- - [MIE 2023](MIE2023.md) diff --git a/docs/src/community/speakinghours.md b/docs/src/community/speakinghours.md deleted file mode 100644 index b19697409..000000000 --- a/docs/src/community/speakinghours.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Sprechstunde -icon: guide ---- - -::: warning Terminverschiebung -Die Sprechstunde wird aufgrund der FDPG Datenausleitungssprechstunde (DANA) ab dem 20.01.2025 von 14:00-14:50 Uhr stattfinden. -::: - - -::: tip Gemeinsame technische Sprechstunde der DSF-Community und des FDPG+ -- Montags, 14:00-14:50 Uhr -- Ort: https://dsf.dev/sprechstunde -::: - - -Klicken Sie [hier](https://lecture.senfcall.de/sim-ock-1vk-l8o), um der Sprechstunde beizutreten. diff --git a/docs/src/community/about/team.md b/docs/src/community/team.md similarity index 100% rename from docs/src/community/about/team.md rename to docs/src/community/team.md diff --git a/docs/src/dsf-development/README.md b/docs/src/dsf-development/README.md index e69de29bb..2357dd44e 100644 --- a/docs/src/dsf-development/README.md +++ b/docs/src/dsf-development/README.md @@ -0,0 +1,5 @@ +--- +title: DSF Development +--- + +No content yet. Please visit this page later. \ No newline at end of file diff --git a/docs/src/operations/get-started.md b/docs/src/operations/get-started.md index 0f6ef9c59..44a0e5c90 100644 --- a/docs/src/operations/get-started.md +++ b/docs/src/operations/get-started.md @@ -1 +1,5 @@ -weiterleitung auf v1 \ No newline at end of file +--- +title: Get Started +--- + +<meta http-equiv="refresh" content="0;url=./v1/latest/"> diff --git a/docs/src/operations/old-versions.md b/docs/src/operations/old-versions.md new file mode 100644 index 000000000..19b6d05fd --- /dev/null +++ b/docs/src/operations/old-versions.md @@ -0,0 +1,11 @@ +--- +title: Old Versions +--- + +## DSF v1 + + +- [1.7.1](./v1/v1.7.1/) +- [1.7.0](./v1/v1.7.0/) +- [1.6.0](./v1/v1.6.0/) +- [1.5.2](./v1/v1.5.2/) \ No newline at end of file diff --git a/docs/src/operations/process-plugin-deployment.md b/docs/src/operations/process-plugin-deployment.md index e69de29bb..77541362e 100644 --- a/docs/src/operations/process-plugin-deployment.md +++ b/docs/src/operations/process-plugin-deployment.md @@ -0,0 +1,5 @@ +--- +title: Process Plugin Deployment +--- + +<meta http-equiv="refresh" content="0;url=./v1/latest/maintain/install-plugins.html"> diff --git a/docs/src/operations/v1/latest b/docs/src/operations/v1/latest new file mode 120000 index 000000000..6c4fc2034 --- /dev/null +++ b/docs/src/operations/v1/latest @@ -0,0 +1 @@ +v1.7.1 \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/develop/README.md b/docs/src/operations/v1/v1.7.1/develop/README.md deleted file mode 100644 index 7c7613cb5..000000000 --- a/docs/src/operations/v1/v1.7.1/develop/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Develop Process Plugins -icon: plugin ---- -## Overview -- [Create a new process plugin](create) -- [Upgrade processes from 0.9.x](upgrade-from-0) \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/develop/create.md b/docs/src/operations/v1/v1.7.1/develop/create.md deleted file mode 100644 index 13f5b32bc..000000000 --- a/docs/src/operations/v1/v1.7.1/develop/create.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Create a new process plugin -icon: code ---- - -Visit the [how the DSF can help you](../../for-you/) page to get started. - - -::: tip Work in progress -We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the [process plugin tutorial](/oldstable/tutorial/). Additionally, we recommend to take a look at the upgraded DSF processes here: -- The [hello world plugin](https://github.com/datasharingframework/dsf-process-hello-world) -- The [ping pong plugin](https://github.com/datasharingframework/dsf-process-ping-pong) -- The [update allowlist plugin](https://github.com/datasharingframework/dsf-process-allow-list) -::: \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md b/docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md deleted file mode 100644 index d27d7a228..000000000 --- a/docs/src/operations/v1/v1.7.1/develop/upgrade-from-0.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Upgrade processes from 0.9.x -icon: update ---- -::: tip Work in progress -We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins: -- The [hello world plugin](https://github.com/datasharingframework/dsf-process-hello-world) -- The [ping pong plugin](https://github.com/datasharingframework/dsf-process-ping-pong) -- The [update allowlist plugin](https://github.com/datasharingframework/dsf-process-allow-list) -::: \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/dsf-for-dev.md b/docs/src/operations/v1/v1.7.1/dsf-for-dev.md deleted file mode 100644 index 45e408ca1..000000000 --- a/docs/src/operations/v1/v1.7.1/dsf-for-dev.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: DSF for Developers -icon: info ---- \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/index.md b/docs/src/operations/v1/v1.7.1/index.md index 743647689..45493649a 100644 --- a/docs/src/operations/v1/v1.7.1/index.md +++ b/docs/src/operations/v1/v1.7.1/index.md @@ -3,10 +3,7 @@ title: DSF 1.7.1 icon: guide --- -Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click [here](/intro/) to find more information about the DSF in general. -::: tip Important note -This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf. -::: +Data Sharing Framework 1.x is the current major release of the Data Sharing Framework. Click [here](/explore/) to find more information about the DSF in general. # System Administrators @@ -15,17 +12,8 @@ This is a major DSF release not compatible with 0.9.x and older version develope - [Install DSF 1.7.1](maintain/install) -# Developers -- [Create a new process plugin](develop/create) -- [Upgrade from DSF 0.9.x.](develop/upgrade-from-0) ## New features -- Improved versioning to support up- and downwards-compatibility -- Enhanced web ui to start processes in the web browser -- Allow local user authentication and authorization with OpenID Connect -- New process plugin API -- Removed mostly unused features to simplify instance configuration -- Unified proxy setup -- Many more features, see [1.x release-notes](https://github.com/datasharingframework/dsf/releases) +- See [Release Notes](https://github.com/datasharingframework/dsf/releases/tag/v1.7.1) diff --git a/docs/src/operations/v1/v1.7.1/process-plugins-advanced.md b/docs/src/operations/v1/v1.7.1/process-plugins-advanced.md deleted file mode 100644 index ccd9c3d99..000000000 --- a/docs/src/operations/v1/v1.7.1/process-plugins-advanced.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Process Plugins Advanced -icon: info ---- \ No newline at end of file diff --git a/docs/src/process-development/api-v1/README.md b/docs/src/process-development/api-v1/README.md index a32a01bf5..46bfa61ec 100644 --- a/docs/src/process-development/api-v1/README.md +++ b/docs/src/process-development/api-v1/README.md @@ -1,5 +1,5 @@ --- -title: API 1 +title: API 1 (stable) Overview icon: code --- ## Overview diff --git a/docs/src/process-development/process-plugin/create.md b/docs/src/process-development/api-v1/create.md similarity index 100% rename from docs/src/process-development/process-plugin/create.md rename to docs/src/process-development/api-v1/create.md diff --git a/docs/src/process-development/how-to/start-project.md b/docs/src/process-development/api-v1/get-started.md similarity index 84% rename from docs/src/process-development/how-to/start-project.md rename to docs/src/process-development/api-v1/get-started.md index 95946ac0f..8e7ef725e 100644 --- a/docs/src/process-development/how-to/start-project.md +++ b/docs/src/process-development/api-v1/get-started.md @@ -1,5 +1,5 @@ --- -title: How to start new Project +title: Get Started with API v1 icon: edit --- diff --git a/docs/src/process-development/publishing/publish-on-dsfhub.md b/docs/src/process-development/api-v1/publishing/publish-on-dsfhub.md similarity index 100% rename from docs/src/process-development/publishing/publish-on-dsfhub.md rename to docs/src/process-development/api-v1/publishing/publish-on-dsfhub.md diff --git a/docs/src/process-development/api-v2/README.md b/docs/src/process-development/api-v2/README.md index cf8b8ccaa..a0c73805e 100644 --- a/docs/src/process-development/api-v2/README.md +++ b/docs/src/process-development/api-v2/README.md @@ -1,5 +1,5 @@ --- -title: API 2 +title: API 2 (alpha) Overview icon: code --- ## Overview diff --git a/docs/src/process-development/process-plugin/best-practise.md b/docs/src/process-development/api-v2/best-practices.md similarity index 100% rename from docs/src/process-development/process-plugin/best-practise.md rename to docs/src/process-development/api-v2/best-practices.md diff --git a/docs/src/process-development/api-v2/create.md b/docs/src/process-development/api-v2/create.md new file mode 100644 index 000000000..40b34511e --- /dev/null +++ b/docs/src/process-development/api-v2/create.md @@ -0,0 +1,10 @@ +--- +title: Create a new Process Plugin +icon: share +--- + +## Create a new Process Plugin + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v2/get-started.md b/docs/src/process-development/api-v2/get-started.md new file mode 100644 index 000000000..8baa5e96a --- /dev/null +++ b/docs/src/process-development/api-v2/get-started.md @@ -0,0 +1,12 @@ +--- +title: Get Started with API v2 +icon: edit +--- + +## How to start a new Project + +::: warning Work in progress + +This site is work in progress, please come back later. + +## Process Plugin Development Cycle \ No newline at end of file diff --git a/docs/src/process-development/api-v2/publishing/publish-on-dsfhub.md b/docs/src/process-development/api-v2/publishing/publish-on-dsfhub.md new file mode 100644 index 000000000..d3c414a63 --- /dev/null +++ b/docs/src/process-development/api-v2/publishing/publish-on-dsfhub.md @@ -0,0 +1,8 @@ +--- +title: Publishing on DSF Hub +icon: share +--- + +## How to publish a project on DSF hub + +hub verlinken als neuer Tab \ No newline at end of file diff --git a/docs/src/process-development/process-plugin/testing.md b/docs/src/process-development/api-v2/testing.md similarity index 100% rename from docs/src/process-development/process-plugin/testing.md rename to docs/src/process-development/api-v2/testing.md diff --git a/docs/src/sprechstunde/readme.md b/docs/src/sprechstunde/readme.md new file mode 100644 index 000000000..e872fec72 --- /dev/null +++ b/docs/src/sprechstunde/readme.md @@ -0,0 +1 @@ +<meta http-equiv="refresh" content="0;url=/community/consultation-hours.html"> From 9bcd5ae22e6b6eef576e4d0638d2060076268065 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:09:03 +0200 Subject: [PATCH 16/42] updated dependency versions --- docs/package-lock.json | 3052 +++++++++++++++++++---------------- docs/package.json | 22 +- docs/src/.vuepress/theme.ts | 66 +- 3 files changed, 1679 insertions(+), 1461 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 239d7ea80..c6a6238fe 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9,46 +9,46 @@ "version": "0.0.0", "license": "MIT", "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.17", - "@vuepress/plugin-markdown-image": "2.0.0-rc.52", - "@vuepress/plugin-markdown-math": "2.0.0-rc.52", - "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", - "katex": "^0.16.11", - "sass-loader": "16.0.2", - "vue": "3.5.12", - "vuepress": "2.0.0-rc.17", - "vuepress-plugin-search-pro": "2.0.0-rc.57", - "vuepress-theme-hope": "2.0.0-rc.58" + "@vuepress/bundler-vite": "2.0.0-rc.23", + "@vuepress/plugin-markdown-image": "2.0.0-rc.104", + "@vuepress/plugin-markdown-math": "2.0.0-rc.104", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.104", + "@vuepress/plugin-slimsearch": "2.0.0-rc.104", + "katex": "^0.16.22", + "sass-loader": "16.0.5", + "vue": "3.5.14", + "vuepress": "2.0.0-rc.23", + "vuepress-theme-hope": "2.0.0-rc.88" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.22.4" + "@rollup/rollup-linux-x64-gnu": "^4.41.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -58,23 +58,22 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -84,13 +83,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -100,13 +99,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -116,13 +115,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -132,13 +131,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -148,13 +147,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -164,13 +163,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -180,13 +179,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -196,13 +195,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -212,13 +211,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -228,13 +227,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -244,13 +243,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -260,13 +259,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -276,13 +275,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -292,13 +291,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -308,13 +307,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -324,13 +323,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -340,13 +339,29 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -356,13 +371,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -372,13 +403,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -388,13 +419,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -404,13 +435,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -420,13 +451,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -436,7 +467,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -446,110 +477,130 @@ "dev": true }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", - "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", + "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", "dev": true }, "node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz", + "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==", "dev": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@mdit-vue/plugin-component": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.3.tgz", - "integrity": "sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.4.tgz", + "integrity": "sha512-fiLbwcaE6gZE4c8Mkdkc4X38ltXh/EdnuPE1hepFT2dLiW6I4X8ho2Wq7nhYuT8RmV4OKlCFENwCuXlKcpV/sw==", "dev": true, "dependencies": { - "@types/markdown-it": "^14.1.1", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/plugin-frontmatter": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.3.tgz", - "integrity": "sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.4.tgz", + "integrity": "sha512-mOlavV176njnozIf0UZGFYymmQ2LK5S1rjrbJ1uGz4Df59tu0DQntdE7YZXqmJJA9MiSx7ViCTUQCNPKg7R8Ow==", "dev": true, "dependencies": { - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "gray-matter": "^4.0.3", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/plugin-headers": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.3.tgz", - "integrity": "sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.4.tgz", + "integrity": "sha512-tyZwGZu2mYkNSqigFP1CK3aZYxuYwrqcrIh8ljd8tfD1UDPJkAbQeayq62U572po2IuWVB1BqIG8JIXp5POOTA==", "dev": true, "dependencies": { - "@mdit-vue/shared": "2.1.3", - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/shared": "2.1.4", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/plugin-sfc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.3.tgz", - "integrity": "sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.4.tgz", + "integrity": "sha512-oqAlMulkz280xUJIkormzp6Ps0x5WULZrwRivylWJWDEyVAFCj5VgR3Dx6CP2jdgyuPXwW3+gh2Kzw+Xe+kEIQ==", "dev": true, "dependencies": { - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/plugin-title": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.3.tgz", - "integrity": "sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.4.tgz", + "integrity": "sha512-uuF24gJvvLVIWG/VBtCDRqMndfd5JzOXoBoHPdKKLk3PA4P84dsB0u0NnnBUEl/YBOumdCotasn7OfFMmco9uQ==", "dev": true, "dependencies": { - "@mdit-vue/shared": "2.1.3", - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/shared": "2.1.4", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/plugin-toc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.3.tgz", - "integrity": "sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.4.tgz", + "integrity": "sha512-vvOU7u6aNmvPwKXzmoHion1sv4zChBp20LDpSHlRlXc3btLwdYIA0DR+UiO5YeyLUAO0XSHQKBpsIWi57K9/3w==", "dev": true, "dependencies": { - "@mdit-vue/shared": "2.1.3", - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/shared": "2.1.4", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/shared": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.3.tgz", - "integrity": "sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.4.tgz", + "integrity": "sha512-Axd8g2iKQTMuHcPXZH5JY3hbSMeLyoeu0ftdgMrjuPzHpJnWiPSAnA0dAx5NQFQqZkXHhyIrAssLSrOWjFmPKg==", "dev": true, "dependencies": { - "@mdit-vue/types": "2.1.0", - "@types/markdown-it": "^14.1.1", + "@mdit-vue/types": "2.1.4", + "@types/markdown-it": "^14.1.2", "markdown-it": "^14.1.0" } }, "node_modules/@mdit-vue/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.1.0.tgz", - "integrity": "sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.1.4.tgz", + "integrity": "sha512-QiGNZslz+zXUs2X8D11UQhB4KAMZ0DZghvYxa7+1B+VMLcDtz//XHpWbcuexjzE3kBXSxIUTPH3eSQCa0puZHA==", "dev": true }, + "node_modules/@mdit/helper": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/helper/-/helper-0.18.0.tgz", + "integrity": "sha512-/4w+hKHmJUutRhmwX8w7dpYW4lgaNXW055m/x+apvemLGlDoRd3VZbAR5Gt0zWdkE0l4b5FWqbydiig9Sgj5gQ==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, "node_modules/@mdit/plugin-alert": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.13.1.tgz", - "integrity": "sha512-3LMYQQ3QP6TUx6zmtmuoHJScST5SVoPZlNuuF4S6PUZvJIwtlITF+eFNjDrA7UQx0PUdCgVHmwu5kYliq+BNtg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.18.0.tgz", + "integrity": "sha512-nm6BJPZG6ux6hTUGstKEDL14AWwMTxTU7mxZFKUVqC/qDgCgmzeoFINE4N+4mrDKAnAF5uF5APfIZCh481PnaQ==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -564,12 +615,12 @@ } }, "node_modules/@mdit/plugin-align": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.13.1.tgz", - "integrity": "sha512-g8je53oEpYNHEudhtB5ViSiAaiMcca+hvoGbInhLl979tWuvEosOs0oWH2X3GM4f6goTGx8gLwzA10Z5C4FxIQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.18.0.tgz", + "integrity": "sha512-93znJvVPOx1NY88Q1GLDSsPa272CPlXwrHTLiuWgBfKwbFQ016KKtrI5AyUgpA//BGv9QiTgYZI+mUR6MKdBgg==", "dev": true, "dependencies": { - "@mdit/plugin-container": "0.13.1", + "@mdit/plugin-container": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -585,11 +636,12 @@ } }, "node_modules/@mdit/plugin-attrs": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.13.1.tgz", - "integrity": "sha512-3saBw5W2y3T0QNbui+uk7nfD36FOoBWNQImk+pbMGpKRqunjouiYP4ZtnttT/AiieGbZBVaOqhM4e01Uyua8VA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.18.0.tgz", + "integrity": "sha512-WyjzLxKYuJYgcw9ydhVRzbcGLQ7h6CFZmoXZvou/K7fIJVF0XcAJ03uKPIRqp9F44qr+n3mzj0hUc4CnUMZtsQ==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -605,9 +657,9 @@ } }, "node_modules/@mdit/plugin-container": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.13.1.tgz", - "integrity": "sha512-mFfm7YViyLHo8uORVa9oLi9+acZZoSVdPf3WPqzC/yLZAJbF27rfJgWZ9Kylt+tyaAYng8L4DiSeVcSNUIHF1A==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.18.0.tgz", + "integrity": "sha512-lNXFxhgPU44UmrElp5oRUGUYx4q0Nkta6BYDC7tYIzqk3BBJLccBMv2iI0Hejz+LFTRytyMUBAuxh/F+i1DsGw==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -625,9 +677,9 @@ } }, "node_modules/@mdit/plugin-demo": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.13.1.tgz", - "integrity": "sha512-ne36FB7jstUblatow7ed1Z3Nm0zootM7A6b+77xEw7aJnXHkM5tJLbBfS6l8WN1Ze7fWVZbP7xQkI3wRvjqrqg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.18.0.tgz", + "integrity": "sha512-oWrADUZmkFm0YTFKg8NT/YRDekL5I+xreryiwyFldVo7WyXDUxLJ7ae4TLHwU4KV2heCm3A1jTtPNORzQewUmA==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -642,9 +694,9 @@ } }, "node_modules/@mdit/plugin-figure": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.13.1.tgz", - "integrity": "sha512-bxeUVMPAuXHYRqPzU+1ux7R3LkpyHTdavCa05rQUhzDI07N+BZDE7oOABXnnFbx6ESamzu3/FBtq9VKjoifLmw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.18.0.tgz", + "integrity": "sha512-LRSNtPDZJbCPtiMOEcSS2pPL9rN2s//MWlL5lvc/EF1XlB/ZMO7Huj9dqQZ/I34vNR+TlZtwt1WifAh2GSKZBw==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -662,9 +714,9 @@ } }, "node_modules/@mdit/plugin-footnote": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.13.1.tgz", - "integrity": "sha512-46TzNvY9QXO5y6MbXlewCe+gfw3lgF2IFQCs0enaWVSgKNaGxOuecDR68SlbLPc7unJQCcs5Bb/XB4xsx0depQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.18.0.tgz", + "integrity": "sha512-Qr99rLRBEAmcFo2rPtmdpZNrTK4cVH4cwSutLu2v1fWxsXP6Hfks1O8cmkRGKbcsBE2mqh1r3yo0w178zDO/cQ==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -676,10 +728,28 @@ "markdown-it": "^14.1.0" } }, + "node_modules/@mdit/plugin-icon": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-icon/-/plugin-icon-0.18.0.tgz", + "integrity": "sha512-w7RA1vqP/ZumkKLSRGDm5D7bXFJJkD+VBtAurgR4J/slATcZWAmAGBUC/dq2tp1UueNGg0kJfrKvcqQMdxXqTA==", + "dev": true, + "dependencies": { + "@mdit/helper": "0.18.0", + "@types/markdown-it": "^14.1.2" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, "node_modules/@mdit/plugin-img-lazyload": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.13.1.tgz", - "integrity": "sha512-DPzR+yabbgqHWHb8oetOj56TtZzOcn5YZjSTssoh7lY5hp/Yy7jWvlLDrSw/LiXkYEhyocUee78enhTodBEpHQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.18.0.tgz", + "integrity": "sha512-X2gbtWTHfW7NdPW2ceQrCnLZ9D/xvY1TTSPa3GBa2+7vR02bL36kRBIXTEyS0anC08R+7FHBN2uJljk8qQ2AJw==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -697,9 +767,9 @@ } }, "node_modules/@mdit/plugin-img-mark": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.13.1.tgz", - "integrity": "sha512-HOALB1nILV5vkopSKPrclkwwc5WGbpuAWxuOLTz/teOifE8E4JsbiFivcM6URMP1lZXzRBXoniQCCOUhWRis8A==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.18.0.tgz", + "integrity": "sha512-dLPOuUUcP/tlOVRTWJYeIhcFLE4DQgFovDE0ojlGZS/nS5YYjZGELujADHL2zUruCe99uJqAbHzTPeQvUsWckw==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -717,9 +787,9 @@ } }, "node_modules/@mdit/plugin-img-size": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.13.1.tgz", - "integrity": "sha512-cgihl72BNzij7GXjrqcKhl2eOqAlqWHiImOgblJPghDFNFKnnynty/Bf9nwbj8hTnhVWznFeuwawzXBfKYNbkg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.18.1.tgz", + "integrity": "sha512-jomprQOuv2xEe4CDbDA+KmRlxmUhOF5psXvl+sjgNmxR2+So6q7hbPLJVTVV3Z2jK5sXmogOPQz0Wf7h72LNHA==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -737,11 +807,12 @@ } }, "node_modules/@mdit/plugin-include": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.13.1.tgz", - "integrity": "sha512-rWGJ3/L2Ocv+8KDNoXPb6H1f+aLqx0FzJKcNqJl+0HOAEScuyKS1GC4OxeWefVMQ87QoG/mYqoCbpDsJeiDbLQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.18.0.tgz", + "integrity": "sha512-OsxTbORV3ZcmqIebAxV6Rxm9FFykGY1UePLJIffI46JYVZf6Nv6E1ArtHbz5ntr0sEKPifDXQtkmksl2SX9UKA==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2", "upath": "^2.0.1" }, @@ -755,13 +826,13 @@ } }, "node_modules/@mdit/plugin-katex-slim": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-katex-slim/-/plugin-katex-slim-0.13.1.tgz", - "integrity": "sha512-OO4n51aLo0Igv0aICXOaTO5+ZW/jW8Lnl8u1kxs2zkFVNUqpqNHAo8l4QxtscQk5L4XhXGgaTj2ZgAv7rtH96Q==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-katex-slim/-/plugin-katex-slim-0.18.0.tgz", + "integrity": "sha512-VQE4UkTIV2Uv7Jzm2EnrvJamjkUXKnzHgpYpdVuLk954kwPTmSkBqGstly9G7C6CL34tqulpyBA2Pq90zHu79Q==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.13.1", - "@types/katex": "^0.16.7", + "@mdit/helper": "0.18.0", + "@mdit/plugin-tex": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -781,9 +852,9 @@ } }, "node_modules/@mdit/plugin-mark": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.13.1.tgz", - "integrity": "sha512-UV+7cSY8iQXlfnrIJ/gEpgwiL2SSVzVLtaWMOV0J4tRSsdtN8ZXnJn/gC547SxBaOLIkt+0ObSskXaCH/UzuIA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.18.0.tgz", + "integrity": "sha512-mFEUrNV63z6Os5r5cZzjjdVaU5pz6YdwON8jM71h6HTgaM5EjsXm2c4zyfnUdN24lWz+O6gaYw67inhAFxZGwg==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -801,12 +872,12 @@ } }, "node_modules/@mdit/plugin-mathjax-slim": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax-slim/-/plugin-mathjax-slim-0.13.1.tgz", - "integrity": "sha512-ZFtKG2BtLAk1BarJZei9HP4aK0vNU7YvDb+R+nApK7MRmLQ53xHe7upu3qlfNBoOZWHXsdRmcz0G4xL3oxzlqA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax-slim/-/plugin-mathjax-slim-0.18.0.tgz", + "integrity": "sha512-U1LU/moBIda1auMPP657w6nL7zNcnw6c+LnuD8Kf/HgfGEBx5mEBO7ReEmrpXu9i6urP78/C0/oVGPrWZDzB8w==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.13.1", + "@mdit/plugin-tex": "0.18.0", "@types/markdown-it": "^14.1.2", "upath": "^2.0.1" }, @@ -827,12 +898,12 @@ } }, "node_modules/@mdit/plugin-plantuml": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-plantuml/-/plugin-plantuml-0.13.1.tgz", - "integrity": "sha512-qupMO/lG1mDYaGHSutB9AO1TsxHjmp4yFnvp3VBNNRdVh9lqWhXFv/htrnr0IGEWAmlik6zlkCvz/YrKRONV5A==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-plantuml/-/plugin-plantuml-0.18.0.tgz", + "integrity": "sha512-JZCv706q5yLiGHRD0s/R65hCKBaHOrOgdyQM1d6kkcdakWwyeLJUeBSb+v6fFnbjM2GgGpoeioUMQHlSK/uiTQ==", "dev": true, "dependencies": { - "@mdit/plugin-uml": "0.13.1", + "@mdit/plugin-uml": "0.18.0", "@types/markdown-it": "^14.1.2" }, "peerDependencies": { @@ -845,9 +916,9 @@ } }, "node_modules/@mdit/plugin-spoiler": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-spoiler/-/plugin-spoiler-0.13.1.tgz", - "integrity": "sha512-6aOD+kjGavkn+Ta0Iq8AUfBG3UsKsL5e0pxi0Eng13lIEp8DrDw36W+E6fLOFtX8Te3ays6eTkTc1I5WzHO0Gw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-spoiler/-/plugin-spoiler-0.18.0.tgz", + "integrity": "sha512-YIJMUBkBme/DuIgH7ZwbpF4/jIRmzaQqdGNowmC5PVMd5OryBulVwDQ4lYKi4qeaS/xxIFe7ssgMpB1XNjA7JA==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -865,9 +936,9 @@ } }, "node_modules/@mdit/plugin-stylize": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.13.1.tgz", - "integrity": "sha512-1v+3H1nMMvXsbu6iyV1pQ7WccrRNkuHovkIAp04Vj0FtbjnKrBHlmzFZace5OaD2RcZ0fn6qRpyR+/AIMjUvtQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.18.0.tgz", + "integrity": "sha512-6pJkvsB+HwN9up9lQo1tXRfoK5nj8u9z+Q7HM9AvWWc42JnsZ4iHgz2LMu5AqjaqfwAXfOLwJ20FZy6OSeHfcQ==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -885,11 +956,12 @@ } }, "node_modules/@mdit/plugin-sub": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.13.1.tgz", - "integrity": "sha512-2rIvEl6pXUoXIm3JMO5ZOQ+vWIeFXmLkqxcmTZB2yOIfhYdLwIcSyquRwtI2AX8zCuvaTdiQ/aypvIE4tDoURw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.18.0.tgz", + "integrity": "sha512-VqNwTeUjbLP2AZv9WGbGJPY7q32nf24fkFbuXlalzJk5FNArOo4qHCqWmswjBmfGWbtG5ZkrRM0v+f4adRELrQ==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -905,11 +977,12 @@ } }, "node_modules/@mdit/plugin-sup": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.13.1.tgz", - "integrity": "sha512-vkNif2Rbj7/gtk4/HJt5hnb+Dcbnek/V4HtLdtqUUnq9bIbzFBpYw5jZ1ZKKZeetDtRvOUPH5oy5d7iXAHorUg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.18.0.tgz", + "integrity": "sha512-2l5BcRrZfivZi2vwrC/an4K/wZYsgA1k8m4VGgOcDllTKUW8IQHAmievYo7IuAwvY3CwBdqEtc5s0DHlHRFdnQ==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -925,11 +998,12 @@ } }, "node_modules/@mdit/plugin-tab": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.13.2.tgz", - "integrity": "sha512-evpIXvo6vXRWhgNE6vu4ok1I2dVOzrBYmBUGc1gW8nT9MvkW9litu7RbJ6CafscqaiiYRIM5Oib1ahS0lwte6g==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.18.0.tgz", + "integrity": "sha512-nM/cqa8q7x2L6bXkrmePk9IEaSONhxIkgTVsmM4b6PQ3zoXq83SxGR+8vC7AFhiRYAjmtV8psBjy1pyUtY4Syw==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2" }, "peerDependencies": { @@ -942,9 +1016,9 @@ } }, "node_modules/@mdit/plugin-tasklist": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.13.1.tgz", - "integrity": "sha512-flEWnDJFEB7QZIHRwtkVjAEZe9ONiRQLRg7oazRDBM/3Z0rf28blxOx7qj2QZ/FVzQnRRZTgjFQkpiz61IckKQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.18.0.tgz", + "integrity": "sha512-b1Fwx19Jaugvfp4i/bJQRmoAupNhG8ZGjn+sSAPtji9VyiYaqrfB19cPTImZA2/Z4LFPxMH4ZzwC2kOl/qDy/g==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -962,9 +1036,9 @@ } }, "node_modules/@mdit/plugin-tex": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.13.1.tgz", - "integrity": "sha512-lkRf6XrfVfS11FzT3hiooWdOUPJfAd/cnAv4NN/4WU7qOEz0e0HBVQO8PQb5CPwrE94Ld4+E6rQwJfVH1grkwQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.18.0.tgz", + "integrity": "sha512-k4xSML1N6gFkCm/zsiRO1eI0IFpi+Nr6WcYs1Y8NojyuIgDUZSrKbIJTwuqIo/TrCUfgUQANpibYskRxQpgZLg==", "dev": true, "dependencies": { "@types/markdown-it": "^14.1.2" @@ -982,11 +1056,12 @@ } }, "node_modules/@mdit/plugin-uml": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.13.1.tgz", - "integrity": "sha512-JdCOg25OyG+QJFAba6AWwdpkaOjuht5VmOqYt4/h/AzLsIHh/2j+TnCZBn0XQm3D8yJ9Y4w4oouS4wpPduRW0A==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.18.0.tgz", + "integrity": "sha512-zT08h34NF40LQcXSDuVvW0hANte6zYotSMMxW/288Ux5BSeY55yHfLrBFs4uRLRa989d0Ib7PcXrRkPN+kxHcA==", "dev": true, "dependencies": { + "@mdit/helper": "0.18.0", "@types/markdown-it": "^14.1.2" }, "engines": { @@ -1323,10 +1398,22 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@pkgr/core": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", + "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", "cpu": [ "arm" ], @@ -1337,9 +1424,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", + "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", "cpu": [ "arm64" ], @@ -1350,9 +1437,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", + "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", "cpu": [ "arm64" ], @@ -1363,9 +1450,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", + "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", "cpu": [ "x64" ], @@ -1375,10 +1462,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", + "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", + "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", + "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", "cpu": [ "arm" ], @@ -1389,9 +1502,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", + "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", "cpu": [ "arm" ], @@ -1402,9 +1515,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", + "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", "cpu": [ "arm64" ], @@ -1415,9 +1528,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", + "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", "cpu": [ "arm64" ], @@ -1427,10 +1540,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", + "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", + "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", "cpu": [ "ppc64" ], @@ -1441,9 +1567,22 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", + "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", + "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", "cpu": [ "riscv64" ], @@ -1454,9 +1593,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", + "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", "cpu": [ "s390x" ], @@ -1467,9 +1606,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", + "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", "cpu": [ "x64" ], @@ -1479,9 +1618,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", + "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", "cpu": [ "x64" ], @@ -1492,9 +1631,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", + "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", "cpu": [ "arm64" ], @@ -1505,9 +1644,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", + "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", "cpu": [ "ia32" ], @@ -1518,9 +1657,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", "cpu": [ "x64" ], @@ -1530,70 +1669,81 @@ "win32" ] }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true - }, "node_modules/@shikijs/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", - "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.4.2.tgz", + "integrity": "sha512-AG8vnSi1W2pbgR2B911EfGqtLE9c4hQBYkv/x7Z+Kt0VxhgQKcW7UNDVYsu9YxwV6u+OJrvdJrMq6DNWoBjihQ==", "dev": true, "dependencies": { - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/types": "3.4.2", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.3" + "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", - "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.4.2.tgz", + "integrity": "sha512-1/adJbSMBOkpScCE/SB6XkjJU17ANln3Wky7lOmrnpl+zBdQ1qXUJg2GXTYVHRq+2j3hd1DesmElTXYDgtfSOQ==", "dev": true, "dependencies": { - "@shikijs/types": "1.22.0", - "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-js": "0.4.3" + "@shikijs/types": "3.4.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", - "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.4.2.tgz", + "integrity": "sha512-zcZKMnNndgRa3ORja6Iemsr3DrLtkX3cAF7lTJkdMB6v9alhlBsX9uNiCpqofNrXOvpA3h6lHcLJxgCIhVOU5Q==", + "dev": true, + "dependencies": { + "@shikijs/types": "3.4.2", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.4.2.tgz", + "integrity": "sha512-H6azIAM+OXD98yztIfs/KH5H4PU39t+SREhmM8LaNXyUrqj2mx+zVkr8MWYqjceSjDw9I1jawm1WdFqU806rMA==", + "dev": true, + "dependencies": { + "@shikijs/types": "3.4.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.4.2.tgz", + "integrity": "sha512-qAEuAQh+brd8Jyej2UDDf+b4V2g1Rm8aBIdvt32XhDPrHvDkEnpb7Kzc9hSuHUxz0Iuflmq7elaDuQAP9bHIhg==", "dev": true, "dependencies": { - "@shikijs/types": "1.22.0", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/types": "3.4.2" } }, "node_modules/@shikijs/transformers": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.22.0.tgz", - "integrity": "sha512-k7iMOYuGQA62KwAuJOQBgH2IQb5vP8uiB3lMvAMGUgAMMurePOx3Z7oNqJdcpxqZP6I9cc7nc4DNqSKduCxmdg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.4.2.tgz", + "integrity": "sha512-I5baLVi/ynLEOZoWSAMlACHNnG+yw5HDmse0oe+GW6U1u+ULdEB3UHiVWaHoJSSONV7tlcVxuaMy74sREDkSvg==", "dev": true, "dependencies": { - "shiki": "1.22.0" + "@shikijs/core": "3.4.2", + "@shikijs/types": "3.4.2" } }, "node_modules/@shikijs/types": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", - "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.4.2.tgz", + "integrity": "sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg==", "dev": true, "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", - "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true }, "node_modules/@sindresorhus/merge-streams": { @@ -1624,9 +1774,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, "node_modules/@types/fs-extra": { @@ -1663,12 +1813,6 @@ "@types/node": "*" } }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "dev": true - }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -1710,18 +1854,18 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/sax": { @@ -1746,267 +1890,268 @@ "dev": true }, "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "dev": true }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", - "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0", + "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", - "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.14.tgz", + "integrity": "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==", "dev": true, "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.12", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.14", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", - "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.14.tgz", + "integrity": "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/compiler-core": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", - "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.14.tgz", + "integrity": "sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==", "dev": true, "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.12", - "@vue/compiler-dom": "3.5.12", - "@vue/compiler-ssr": "3.5.12", - "@vue/shared": "3.5.12", + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.14", + "@vue/compiler-dom": "3.5.14", + "@vue/compiler-ssr": "3.5.14", + "@vue/shared": "3.5.14", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.47", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", - "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.14.tgz", + "integrity": "sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/compiler-dom": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/devtools-api": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.4.6.tgz", - "integrity": "sha512-XipBV5k0/IfTr0sNBDTg7OBUCp51cYMMXyPxLXJZ4K/wmUeMqt8cVdr2ZZGOFq+si/jTyCYnNxeKoyev5DOUUA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", "dev": true, "dependencies": { - "@vue/devtools-kit": "^7.4.6" + "@vue/devtools-kit": "^7.7.6" } }, "node_modules/@vue/devtools-kit": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.4.6.tgz", - "integrity": "sha512-NbYBwPWgEic1AOd9bWExz9weBzFdjiIfov0yRn4DrRfR+EQJCI9dn4I0XS7IxYGdkmUJi8mFW42LLk18WsGqew==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", "dev": true, "dependencies": { - "@vue/devtools-shared": "^7.4.6", - "birpc": "^0.2.17", + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", - "superjson": "^2.2.1" + "superjson": "^2.2.2" } }, "node_modules/@vue/devtools-shared": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.4.6.tgz", - "integrity": "sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", "dev": true, "dependencies": { "rfdc": "^1.4.1" } }, "node_modules/@vue/reactivity": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", - "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.14.tgz", + "integrity": "sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==", "dev": true, "dependencies": { - "@vue/shared": "3.5.12" + "@vue/shared": "3.5.14" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", - "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.14.tgz", + "integrity": "sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==", "dev": true, "dependencies": { - "@vue/reactivity": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/reactivity": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", - "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.14.tgz", + "integrity": "sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==", "dev": true, "dependencies": { - "@vue/reactivity": "3.5.12", - "@vue/runtime-core": "3.5.12", - "@vue/shared": "3.5.12", + "@vue/reactivity": "3.5.14", + "@vue/runtime-core": "3.5.14", + "@vue/shared": "3.5.14", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", - "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.14.tgz", + "integrity": "sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/compiler-ssr": "3.5.14", + "@vue/shared": "3.5.14" }, "peerDependencies": { - "vue": "3.5.12" + "vue": "3.5.14" } }, "node_modules/@vue/shared": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", - "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.14.tgz", + "integrity": "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==", "dev": true }, "node_modules/@vuepress/bundler-vite": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.17.tgz", - "integrity": "sha512-K2osFYuAX1y1m50IxSA7ykM0wdxvQBD3LsYsqAltMk/yM26cF8BjTOfpAbfBw4/gTbQHv2pzJbfUgOm9o/LbvQ==", - "dev": true, - "dependencies": { - "@vitejs/plugin-vue": "^5.1.4", - "@vuepress/bundlerutils": "2.0.0-rc.17", - "@vuepress/client": "2.0.0-rc.17", - "@vuepress/core": "2.0.0-rc.17", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", - "autoprefixer": "^10.4.20", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.23.tgz", + "integrity": "sha512-59oBof+QaCyrZVOussrmv3bHxpwFPsLlI9yQbq2ubR+dFNzgfAtb8Dpm2z9iB/duZnx6PgmWPke4qGl9wOjEKw==", + "dev": true, + "dependencies": { + "@vitejs/plugin-vue": "^5.2.3", + "@vuepress/bundlerutils": "2.0.0-rc.23", + "@vuepress/client": "2.0.0-rc.23", + "@vuepress/core": "2.0.0-rc.23", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", + "autoprefixer": "^10.4.21", "connect-history-api-fallback": "^2.0.0", - "postcss": "^8.4.47", + "postcss": "^8.5.3", "postcss-load-config": "^6.0.1", - "rollup": "^4.22.5", - "vite": "~5.4.8", - "vue": "^3.5.10", - "vue-router": "^4.4.5" + "rollup": "^4.40.2", + "vite": "~6.3.5", + "vue": "^3.5.13", + "vue-router": "^4.5.1" } }, "node_modules/@vuepress/bundlerutils": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/bundlerutils/-/bundlerutils-2.0.0-rc.17.tgz", - "integrity": "sha512-+Hxv3N8XRr6TTzBcXtaXlzq8r3YY/+HLeQHZ9mCGAhBXRCv5BeBgjpMP4BiQT1jd1FxfxRguyyFwioC6g5dOdA==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/bundlerutils/-/bundlerutils-2.0.0-rc.23.tgz", + "integrity": "sha512-XgDbIT10xI7m8Pto+N8Mi+o+s1oAg+Mo65WLeHkaCexSRrF9Fa9WRun28EtB5PnyVhaZvnXh5XXuthXZl206JA==", "dev": true, "dependencies": { - "@vuepress/client": "2.0.0-rc.17", - "@vuepress/core": "2.0.0-rc.17", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", - "vue": "^3.5.10", - "vue-router": "^4.4.5" + "@vuepress/client": "2.0.0-rc.23", + "@vuepress/core": "2.0.0-rc.23", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", + "vue": "^3.5.13", + "vue-router": "^4.5.1" } }, "node_modules/@vuepress/cli": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.17.tgz", - "integrity": "sha512-naib+o5MRmkimjzHykuTLojltebv4+VpstK2KyOp7oR8XBBLAbpgVOgTLnTnDSooR9e313wQzYUzrgI+TKOwdQ==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.23.tgz", + "integrity": "sha512-lNAvRf4zyfnl8pgUA/uj2yCgsroJJzUm2dEwmudOIvfSV+N5jMUQuomdE5gZemDDk2oE2gqyRPBOZ12LP2EEIg==", "dev": true, "dependencies": { - "@vuepress/core": "2.0.0-rc.17", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", + "@vuepress/core": "2.0.0-rc.23", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", "cac": "^6.7.14", "chokidar": "^3.6.0", "envinfo": "^7.14.0", - "esbuild": "~0.21.5" + "esbuild": "^0.25.4" }, "bin": { "vuepress-cli": "bin/vuepress.js" } }, "node_modules/@vuepress/client": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.17.tgz", - "integrity": "sha512-dnCU+spOgVw1V7vU/Gkj6e7bkfsGbezUuPAQMiWkBdrNTZ2BJctOHhhi+F8OBRR02hZ9JldlToA5vBoVsPKRpw==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.23.tgz", + "integrity": "sha512-/2sdQTOELCUgoEjy2XGqcDMHSAz1kdaMYBr+8zv5et2aYzpn9rYdW0SzXTprhc354ccN65xNHarr6uIbVJ1m0g==", "dev": true, "dependencies": { - "@vue/devtools-api": "^7.4.6", - "@vuepress/shared": "2.0.0-rc.17", - "vue": "^3.5.10", - "vue-router": "^4.4.5" + "@vue/devtools-api": "^7.7.6", + "@vue/devtools-kit": "^7.7.6", + "@vuepress/shared": "2.0.0-rc.23", + "vue": "^3.5.13", + "vue-router": "^4.5.1" } }, "node_modules/@vuepress/core": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.17.tgz", - "integrity": "sha512-Ux5zAqnSAAnaE4qFgIGkGRMWObyZaAeRk6Pj30tVRCC7zkYIRWXii7sUK6aehPyugQz02TKMvW5FlrJeA40ogw==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.23.tgz", + "integrity": "sha512-CkXDOCKJATxFciEuLCDtAzdCkGyNfCcmBYyhsvYLSJU8oiXgt27EjmXNKTpN+MNXSl934/353UERExGafhsTfg==", "dev": true, "dependencies": { - "@vuepress/client": "2.0.0-rc.17", - "@vuepress/markdown": "2.0.0-rc.17", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", - "vue": "^3.5.10" + "@vuepress/client": "2.0.0-rc.23", + "@vuepress/markdown": "2.0.0-rc.23", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", + "vue": "^3.5.13" } }, "node_modules/@vuepress/helper": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.52.tgz", - "integrity": "sha512-zePTo0eJkyK7NirwidII1+r8PkuJbsXO0CrcXw/K7Yv8ab8RkQKaUmqLSM21xHZddKuzWEncugGtRIt5yITumw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.104.tgz", + "integrity": "sha512-GmsFstdmryNLjCDF+wVTP6wBmHYAenAbtd04TG4se/ZB+pfhCNT5Zq6dEO3TG35JLcdUm/bI4uE3BE4WVBkSgw==", "dev": true, "dependencies": { - "@vue/shared": "^3.5.10", - "@vueuse/core": "^11.1.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^13.1.0", "cheerio": "1.0.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", - "vue": "^3.5.10" + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/highlighter-helper": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.52.tgz", - "integrity": "sha512-imyoo7gQxJ2/uhyPL1uQ1FexD2BpsJ7gYp4BXHY3iaaDuJ6KVnF+FSIbxaLW4XW3qivJ7IjWWfv5Q3gi0/xQxQ==", + "version": "2.0.0-rc.103", + "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.103.tgz", + "integrity": "sha512-gYOF+5Q4ilo3Km5KSZfie8w1Fs2Nit/YnvWaIenWelSfp3DHweLNiwOhVjp8e/s8bmCEozP3CtOxmWXEZNrHng==", "dev": true, "peerDependencies": { - "@vueuse/core": "^11.1.0", - "vuepress": "2.0.0-rc.17" + "@vueuse/core": "^13.1.0", + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "@vueuse/core": { @@ -2015,23 +2160,23 @@ } }, "node_modules/@vuepress/markdown": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.17.tgz", - "integrity": "sha512-eIwRostE3t3zsJzPjmOufVyyBpsaWQkZluk6o0i1e9WLW3EoinKrDZdzej0Jw8IQlq6nvOPD2JMFWyXwu8fv7w==", - "dev": true, - "dependencies": { - "@mdit-vue/plugin-component": "^2.1.3", - "@mdit-vue/plugin-frontmatter": "^2.1.3", - "@mdit-vue/plugin-headers": "^2.1.3", - "@mdit-vue/plugin-sfc": "^2.1.3", - "@mdit-vue/plugin-title": "^2.1.3", - "@mdit-vue/plugin-toc": "^2.1.3", - "@mdit-vue/shared": "^2.1.3", - "@mdit-vue/types": "^2.1.0", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.23.tgz", + "integrity": "sha512-KDC5xtd6GQBKsKkOKchJ5yxof/JES6StsBAmm5+S6WVJGOFRCVw5tpicFO9tgm1alwWFbX0WD5oloPq/ZOJtfA==", + "dev": true, + "dependencies": { + "@mdit-vue/plugin-component": "^2.1.4", + "@mdit-vue/plugin-frontmatter": "^2.1.4", + "@mdit-vue/plugin-headers": "^2.1.4", + "@mdit-vue/plugin-sfc": "^2.1.4", + "@mdit-vue/plugin-title": "^2.1.4", + "@mdit-vue/plugin-toc": "^2.1.4", + "@mdit-vue/shared": "^2.1.4", + "@mdit-vue/types": "^2.1.4", "@types/markdown-it": "^14.1.2", "@types/markdown-it-emoji": "^3.0.1", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-emoji": "^3.0.0", @@ -2039,75 +2184,75 @@ } }, "node_modules/@vuepress/plugin-active-header-links": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.52.tgz", - "integrity": "sha512-2QJbVTurvHuIAkO6YqXHoHkY6t4H6o0nktxbUjCiezkOGtiN2DHn4wpD2AFKjYstezIWDGbPianbBuGAZKr+aQ==", + "version": "2.0.0-rc.103", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.103.tgz", + "integrity": "sha512-NStHWt6pYpkytULiAN2HWExsETbJKo8iCRGVbKkm6rn4NFM5v5zODv/0Mw7aRZ35X8b6H75BYVY3zKe8ahUkDQ==", "dev": true, "dependencies": { - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-back-to-top": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.52.tgz", - "integrity": "sha512-Ea1r8bNma61vxAAxwuA62md4cZlP8Dmfl0kqlA9u++90l95Dc3z/lw+Rju/ENlBqxvv17lTN4NWMMbwcnXK21w==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.104.tgz", + "integrity": "sha512-8pdtoK1LlH+VVV+tAZuv5J6jyeILVtip51TkzfeenHtI6NSba3SxPq9qaUhX2GPHTcUZV62higM4rwG2zAEz5A==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-blog": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.52.tgz", - "integrity": "sha512-W9FrpR/ynV1lztdCrtEmnfZizNbnhLdzl/BdLxbDoVrKcjAWktqmfx8VJI+zrWyHmPzwIxrY0FdttQDUXPj+VA==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.104.tgz", + "integrity": "sha512-WFr4yx5hgYE8RVOqE/sXqovAujd2HgAQEIFgZwKU1u1ncmtlbwBwdKWOU8I2mv0iEhYWu53TUyP+uZvNf/kVLg==", "dev": true, - "license": "MIT", "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/helper": "2.0.0-rc.104", "chokidar": "^3.6.0", - "vue": "^3.5.10" + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-catalog": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.52.tgz", - "integrity": "sha512-NMT0Iyi8F4eRiHd8KoP2Wje9vzY6shzwxuqYpXULNKsc9e3gPpCP63N6AqjSEaEO/NyqN8EzJftYIiK7KorYbw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.104.tgz", + "integrity": "sha512-HQSmDhHpx+1cPL0jWmKlLUzc0e0XwoqFbX5X5MX5wDVohqjx3j04iEKWEeYhE7NbirbxlA9dXc3/ssb/WoYY+A==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-comment": { - "version": "2.0.0-rc.53", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.53.tgz", - "integrity": "sha512-1nzUCKqTHf/zrwBKs9hSwUMo/f7tI2SKhTAwAWFY0sHo1uYTtSV7gllDXrhpeoprlO4S3R3oQc/0ZkSIFpe08Q==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.104.tgz", + "integrity": "sha512-I0OENWem7z7g+OXOU9L9RGj2hfBZ3MRl8Wd3+1yXE3t8PUimUKrUUj3x0eVQPhAwupmzV1ncTsm72M2IwIVRmQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "giscus": "^1.5.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "giscus": "^1.6.0", + "vue": "^3.5.13" }, "peerDependencies": { - "@waline/client": "^3.3.1", - "artalk": "^2.9.0", - "twikoo": "^1.6.39", - "vuepress": "2.0.0-rc.17" + "@waline/client": "^3.5.5", + "artalk": "^2.9.1", + "twikoo": "^1.6.41", + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "@waline/client": { @@ -2122,106 +2267,176 @@ } }, "node_modules/@vuepress/plugin-copy-code": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.52.tgz", - "integrity": "sha512-YQeWH3EZrZsiQGUC/9tkhKXk5LuWZKIRDnYgit03+i/1hoivgVO8sRRAKCf9gQpX2EEbyyyiCqBTSByOFNAHag==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.104.tgz", + "integrity": "sha512-WROusuYp+EWCZcfAu1MX/DtvWbfmDYipDmCDAdwA5C78qbjWJbEDeMOJKvyO4AhfjxrdS6wmOjw61M9t2ZJUIQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-copyright": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.52.tgz", - "integrity": "sha512-eDGSqisi9Fnu3ODd4JwVepxd+ACrRbcO1ugAFukVeTQqySodnh5c70aDJN32QuYN7RmxIt1FvPJoS9/hWiOSrw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.104.tgz", + "integrity": "sha512-bURyvHxFWdwL+fz3OGjlEgmQiZTdu+WhaJixrRyRi05L7r4sBnV1MIbTH29757HerdFu5THona0mF15xgj0B2A==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-git": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.52.tgz", - "integrity": "sha512-IHCHAKvia0NCv64Y1NQcmAeJKZvT3lFddhl3yrd79KiIZ4HLoBjni7jII0dsx77FtTJLeXHYkkNhnY1l/j1Diw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.104.tgz", + "integrity": "sha512-Gw9aLcrMKJ+ThLCFSeYMZRXkW2tak3OhuwyObchij63SiR8G8I6EZWzGaZAT8ad3BUUcst6qLX6phXVkShtQWQ==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "rehype-parse": "^9.0.1", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.1", + "unified": "^11.0.5", + "vue": "^3.5.13" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.23" + } + }, + "node_modules/@vuepress/plugin-icon": { + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-icon/-/plugin-icon-2.0.0-rc.104.tgz", + "integrity": "sha512-UNopisXX8hWPRSyw2tgbz6u7Mtj/sm6moUbTCPD6YcJqJAyp9SnkQDzBMUtmvPnWrKUwbWdJvCvAdMIMKa/mSw==", "dev": true, "dependencies": { - "execa": "^9.4.0" + "@mdit/plugin-icon": "^0.18.0", + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-links-check": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.52.tgz", - "integrity": "sha512-peu3Fzv/TNb+rpiNByKfbira79sR8vGVpF8u9mZXgM/xsQH5IvO0g7Zgwub8fkoIxsNjEN2SnA0k3bCbOWGUgw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.104.tgz", + "integrity": "sha512-duE6CUoc2eorW4sYw8tMFuPEStm35dmnk0XhxQQqkeIg2gpWDMkrb4sYqfU8twLU3Z+Tcq9FWYwyQ2QjyT8TYQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52" + "@vuepress/helper": "2.0.0-rc.104" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" + } + }, + "node_modules/@vuepress/plugin-markdown-ext": { + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-ext/-/plugin-markdown-ext-2.0.0-rc.104.tgz", + "integrity": "sha512-W3vWwFsoAVgEWrNa8u+/FgGrRjIM7XYJYXhJzfJJdh1wOKJUOavBGdn20JGRnD3b3KAw0q4UzSeDeJPLA+vTKA==", + "dev": true, + "dependencies": { + "@mdit/plugin-container": "^0.18.0", + "@mdit/plugin-footnote": "^0.18.0", + "@mdit/plugin-tasklist": "^0.18.0", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.104", + "js-yaml": "^4.1.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.23" + } + }, + "node_modules/@vuepress/plugin-markdown-ext/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/@vuepress/plugin-markdown-ext/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/@vuepress/plugin-markdown-hint": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-hint/-/plugin-markdown-hint-2.0.0-rc.52.tgz", - "integrity": "sha512-8c3RVFvjh9ntgmqpU3ZWiolCMIBcKZXmd4utTU9EGBaNeIBGtdGyY2dYhbMkR89/OUBP1NfEtuSTNa2PkVW9Cg==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-hint/-/plugin-markdown-hint-2.0.0-rc.104.tgz", + "integrity": "sha512-5ozO5Q9gTh7x7ZPAvAAXULdD6S0A1KrsunMtjG3TPREL99ExILwMnnRtgnDSDA11gH7SBMrKuS18E77ccHLaeA==", "dev": true, "dependencies": { - "@mdit/plugin-alert": "^0.13.1", - "@mdit/plugin-container": "^0.13.1", + "@mdit/plugin-alert": "^0.18.0", + "@mdit/plugin-container": "^0.18.0", "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-markdown-image": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-image/-/plugin-markdown-image-2.0.0-rc.52.tgz", - "integrity": "sha512-Qu21KKNOvQPOaW++WtJ43XHT8tj1HlV7eDOGZJzc2Gv+0aeRHxCZ6Ljycbs6cSsekP6Rg9GOlMOv2902pCu4Pg==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-image/-/plugin-markdown-image-2.0.0-rc.104.tgz", + "integrity": "sha512-UV/nRsvt7/aTfRFrdVD1n/M70IdTT988pGMdzAOexlcs0xdStLHmo9w9d9CwXOh5rrIWMM4JLzvJnpYY3Njluw==", + "dev": true, + "dependencies": { + "@mdit/plugin-figure": "^0.18.0", + "@mdit/plugin-img-lazyload": "^0.18.0", + "@mdit/plugin-img-mark": "^0.18.0", + "@mdit/plugin-img-size": "^0.18.0", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.104" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.23" + } + }, + "node_modules/@vuepress/plugin-markdown-include": { + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-include/-/plugin-markdown-include-2.0.0-rc.104.tgz", + "integrity": "sha512-MiuwUQZB4dz9Zx0o5wzP/GX23dzPLaEPATqhgN6+roO75tHaGUUpt0752b5HrUtny8R1evFHz/kk3mDjQfIN7g==", "dev": true, "dependencies": { - "@mdit/plugin-figure": "^0.13.1", - "@mdit/plugin-img-lazyload": "^0.13.1", - "@mdit/plugin-img-mark": "^0.13.1", - "@mdit/plugin-img-size": "^0.13.1", + "@mdit/plugin-include": "^0.18.0", "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.52" + "@vuepress/helper": "2.0.0-rc.104" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-markdown-math": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-math/-/plugin-markdown-math-2.0.0-rc.52.tgz", - "integrity": "sha512-Dnez/mkxLe/EgpGcORUwi0oNwwxOpdY8hzfjTGgOEONxQOhO9MwTzgp75aNbVKGG5Df/xqEpKjU8plncNIg7eA==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-math/-/plugin-markdown-math-2.0.0-rc.104.tgz", + "integrity": "sha512-w+Dn425WKY3oMf5jl1hjoDFsoENvEhIANMsLCDPDa9GRxTdxd1LZdRJ6UMfsolC2nPoa+diZG9/Z+Nk9jAIz1Q==", "dev": true, "dependencies": { - "@mdit/plugin-katex-slim": "^0.13.1", - "@mdit/plugin-mathjax-slim": "^0.13.1", + "@mdit/plugin-katex-slim": "^0.18.0", + "@mdit/plugin-mathjax-slim": "^0.18.0", "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "vue": "^3.5.13" }, "peerDependencies": { - "katex": "^0.16.10", + "katex": "^0.16.21", "mathjax-full": "^3.2.2", - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "katex": { @@ -2232,122 +2447,153 @@ } } }, + "node_modules/@vuepress/plugin-markdown-stylize": { + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-stylize/-/plugin-markdown-stylize-2.0.0-rc.104.tgz", + "integrity": "sha512-jSIpE+p6/aPXZx4ipU3YVnqB9wPFwBRmbDhsw0xVg7x+9TBLHQGmp/fUg6bYWjgU/TSnrdzri6B1sgkzuoWZKg==", + "dev": true, + "dependencies": { + "@mdit/plugin-align": "^0.18.0", + "@mdit/plugin-attrs": "^0.18.0", + "@mdit/plugin-mark": "^0.18.0", + "@mdit/plugin-spoiler": "^0.18.0", + "@mdit/plugin-stylize": "^0.18.0", + "@mdit/plugin-sub": "^0.18.0", + "@mdit/plugin-sup": "^0.18.0", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.104" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.23" + } + }, "node_modules/@vuepress/plugin-markdown-tab": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-tab/-/plugin-markdown-tab-2.0.0-rc.52.tgz", - "integrity": "sha512-ZIeRllMZR/pRKLLID2xW++cjE7JGJLutjUVvqLRF9BPb2t425zurZUE3ahI8z338UZr8UhUosZeb/5HDHJ7MTQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-tab/-/plugin-markdown-tab-2.0.0-rc.104.tgz", + "integrity": "sha512-M/c08lAfSg2fJq8KqOoX/kdFWlFjt+rT+0v8JzKtDjqNcK8GzhCsaLNw+9X09FLBqDOolrXYnjvGvGPSNh2JxA==", "dev": true, "dependencies": { - "@mdit/plugin-tab": "^0.13.2", + "@mdit/plugin-tab": "^0.18.0", "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-notice": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-notice/-/plugin-notice-2.0.0-rc.52.tgz", - "integrity": "sha512-kBu5uTJWwgK9n3g62vayAlMx8m7PKPdCOUOSza3x6VTI0pkANHIgwVH0jyRosfnJjrfbcZRF86lpGjMnmW6+sw==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-notice/-/plugin-notice-2.0.0-rc.104.tgz", + "integrity": "sha512-L5QQcCX5pQiPmI6g7j062m+DlSoiCpQClhq4sv+2vkpPefct4hpdH2h3L3WBwiijUUH2fZ/aZ8SPNI4aeqm4Nw==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "chokidar": "^3.6.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-nprogress": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.52.tgz", - "integrity": "sha512-TxDd4y+RWytToja0fOF4GL0k500g8zB0LpCxsc33gHvVUsJ7qVXcq8XPyYH6FgZPX4BuiPexVxE6FG7XUat/fg==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.104.tgz", + "integrity": "sha512-ZjdWXpoTY/+Aa+24mNLwMwFjx4qSn/jeKTAqtJTK697Tro7BCUa/KdKtDlXfdUVsm1O9Ewc/Nh0T9eMjEaWAfA==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-photo-swipe": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.52.tgz", - "integrity": "sha512-ybrAzJZfZwd6oK7uMHckR/rsZ8T9v3TZrWYRVZQ08rSlW71YKLA0Lsi+UaD+ECMJh2onSALhipb9WGGVTDMd0A==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.104.tgz", + "integrity": "sha512-/NiQ2n3wvhQ3vq9jwI98p9ecdfh6Q7bXfFZbkfVoYD3fQMgfg1pkRfO2VnR6uJUQkKOE7x/c1REB5ulm/lZQ1A==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", "photoswipe": "^5.4.4", - "vue": "^3.5.10" + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-reading-time": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.52.tgz", - "integrity": "sha512-LRpxo55wPOomeDZF+TQV4QxgEM5hb18aVsFRlyDy55tHvjwtv7zJJOtcROkDXTgMqWqe1ipqoDyo4IAoRglxXQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.104.tgz", + "integrity": "sha512-5podLkwt9uJZy4rikwc2FP6R2ObWS9t73sUi0XBTUlAmv0fh55kXDY0bbyiOv0odlWwrmq48O2si3hggFZVdGA==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-redirect": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-redirect/-/plugin-redirect-2.0.0-rc.52.tgz", - "integrity": "sha512-57j8ycJ5CBS7MfuhpWCxkhphTO67MoEcm3ZfZJpvUCXiX/D9l9uPuK+JD2/Ky+60p7Md0YfBnYsenfk/0zFlYQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-redirect/-/plugin-redirect-2.0.0-rc.104.tgz", + "integrity": "sha512-/71G5+8NzhOFOxgrju3ocNJ0NocvRLBWIEXIDKscBqMMD5gD12WdkSS6TsFKDNLRWEaTgTsljD75yYn9WvNNNQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "cac": "^6.7.14", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "commander": "^13.1.0", + "vue": "^3.5.13" }, "bin": { "vp-redirect": "lib/cli/index.js" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" + } + }, + "node_modules/@vuepress/plugin-redirect/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "engines": { + "node": ">=18" } }, "node_modules/@vuepress/plugin-rtl": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.52.tgz", - "integrity": "sha512-Uz7IVWazFE4IfkEZpArImUmOQhJVDU1/CcfUOOb4UY0ZStrLOtJrbgOYoBLgNYZrfcCsQtxSKD/syFuyM5RLcg==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.104.tgz", + "integrity": "sha512-nz4TkvdyWPoBeCB19UW0FThH/WqG0eH/KVr95bU9hSAQ3NCBxcSxT3RMBN+7gG0Mryfj5niSVb0HXMSCPf7RBw==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-sass-palette": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-sass-palette/-/plugin-sass-palette-2.0.0-rc.52.tgz", - "integrity": "sha512-z4SS9UlrMu99e2CICmUknItkK85QSaRXpNOR9vlIno+UEjeAthw5s4YYgkCdQul7yEn6EosyXqxNJ5vH6OtLgQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sass-palette/-/plugin-sass-palette-2.0.0-rc.104.tgz", + "integrity": "sha512-IwYUTRSPU4yMikfg8tfdFwWLx1Msv1y/KbMUrpn2nlVzEqpmYCDorvskM45jlTv05PIrcerrVbEfYLyJTIVmAQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "chokidar": "^4.0.1" + "@vuepress/helper": "2.0.0-rc.104", + "chokidar": "^4.0.3" }, "peerDependencies": { - "sass": "^1.79.2", - "sass-embedded": "^1.79.2", - "sass-loader": "^16.0.1", - "vuepress": "2.0.0-rc.17" + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sass-loader": "^16.0.5", + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "sass": { @@ -2362,9 +2608,9 @@ } }, "node_modules/@vuepress/plugin-sass-palette/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { "readdirp": "^4.0.1" @@ -2377,12 +2623,12 @@ } }, "node_modules/@vuepress/plugin-sass-palette/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -2390,37 +2636,44 @@ } }, "node_modules/@vuepress/plugin-seo": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.52.tgz", - "integrity": "sha512-q3BhGXnhrDBms4QZbMryKnCLR+TIY79J8Xt01SfkhD8UanYWvMg3+pXg7+Wn9HNLNAUsuuXfLZ4tLQwlF0OxJQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.104.tgz", + "integrity": "sha512-/+ssrAl8z5lT+Z6/dzTxlOEbqspJiCN/w5NpeAu46Tvrf9XqqBO47vQURAdRxJeUGi7ddsWt61ctthQnayOOmg==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52" + "@vuepress/helper": "2.0.0-rc.104" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/plugin-shiki": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-shiki/-/plugin-shiki-2.0.0-rc.52.tgz", - "integrity": "sha512-UBbDCCHVr1jp4xWS1at+iCZnBih/Gt+b4Md/VISFfKUZ+ZbZsZQqtF2jmeJ0kj2rCwJSRWTaqAQJg/DlM2eDyQ==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-shiki/-/plugin-shiki-2.0.0-rc.104.tgz", + "integrity": "sha512-FDkdUsXdBcxU2yya7/69qCogxjoRf+GCoKMyJ2GOyZ71hX48h4e9EngF0Tds81FI0yofDiA2XAN396IxiYTV+A==", "dev": true, "dependencies": { - "@shikijs/transformers": "^1.21.0", - "@vuepress/helper": "2.0.0-rc.52", - "@vuepress/highlighter-helper": "2.0.0-rc.52", - "nanoid": "^5.0.7", - "shiki": "^1.21.0" + "@shikijs/transformers": "^3.4.0", + "@vuepress/helper": "2.0.0-rc.104", + "@vuepress/highlighter-helper": "2.0.0-rc.103", + "nanoid": "^5.1.5", + "shiki": "^3.4.0", + "synckit": "^0.11.4" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "@vuepress/shiki-twoslash": "2.0.0-rc.104", + "vuepress": "2.0.0-rc.23" + }, + "peerDependenciesMeta": { + "@vuepress/shiki-twoslash": { + "optional": true + } } }, "node_modules/@vuepress/plugin-shiki/node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", "dev": true, "funding": [ { @@ -2436,159 +2689,112 @@ } }, "node_modules/@vuepress/plugin-sitemap": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.52.tgz", - "integrity": "sha512-16SBEXox2IwztBBjJRCQbecz/K3aEBKkQRsxI4cUhSGU3BaMk1DiGyTSYhge+e4DaQQvcjfrDOTWNJTPg46L7A==", + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.104.tgz", + "integrity": "sha512-pisuHpJoM/b0jhP/LgnLeqbiCIyPBIzzN5SpZa6ivB+gt3hKqHxki/gE4GwgrlY/VrUkq2gOss9+LwHFyY7iGw==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/helper": "2.0.0-rc.104", "sitemap": "^8.0.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, - "node_modules/@vuepress/plugin-theme-data": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.52.tgz", - "integrity": "sha512-eCqCNgYUcLA6zISgWLUXMMLLP+5BJj3gx/v9Eczd7vtyYHaNwEZ+MRC1GMJHcCUK25o5KzMUXnzR1JKFCGobAQ==", + "node_modules/@vuepress/plugin-slimsearch": { + "version": "2.0.0-rc.104", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-slimsearch/-/plugin-slimsearch-2.0.0-rc.104.tgz", + "integrity": "sha512-UUZAX6aMpnoWh0yQqnqe3SF6IEMgdVEYd76sGI+bI4mDaRBPyJS67xSDgpfbmZ3PhJaN0pIHjFzQpadymsGazQ==", "dev": true, "dependencies": { - "@vue/devtools-api": "^7.4.6", - "vue": "^3.5.10" + "@vuepress/helper": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "cheerio": "^1.0.0", + "chokidar": "^3.6.0", + "slimsearch": "^2.2.2", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, - "node_modules/@vuepress/plugin-watermark": { - "version": "2.0.0-rc.52", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-watermark/-/plugin-watermark-2.0.0-rc.52.tgz", - "integrity": "sha512-iiCrcJOYqHgBA9CRYeAEMzcG0PT5FmB9iSoNnrWWzKEBBlXfEvdx9dZSe+KBytJ1TBAPQ99Ddy4lMxs6EQ5NzQ==", + "node_modules/@vuepress/plugin-theme-data": { + "version": "2.0.0-rc.103", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.103.tgz", + "integrity": "sha512-pHkCf7VZJDlVVE+LkDTmHMTdDxYkaUTNbglgTI1QoTq8cMpOb/M8BaBDtb8//DC2gbNTgx/x6wsPogwm0K45+w==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "vue": "^3.5.10", - "watermark-js-plus": "^1.5.7" + "@vue/devtools-api": "^7.7.6", + "vue": "^3.5.13" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/@vuepress/shared": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.17.tgz", - "integrity": "sha512-meBWLJCCHqj+edHY+U2q64Q8AIqqlHzau6T0j95Q58WkWOQdgn8MUCx1/TXXh2mKVyTt4g6Kgci/3fK2Hi97HQ==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.23.tgz", + "integrity": "sha512-keUT4ZXVN0LvNWRxDOSjvyePZHoAmedVQvFqFWfH/3JjzLU1nrhn+WXucNtlJh6OqZZD5sdzCxnrotkb7MEnVw==", "dev": true, "dependencies": { - "@mdit-vue/types": "^2.1.0" + "@mdit-vue/types": "^2.1.4" } }, "node_modules/@vuepress/utils": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.17.tgz", - "integrity": "sha512-5QFG8arU01QxJm+pzaNpNxfvSy3ttSjouwcefyr/6dO/cKbnjgmmaDOoy3UKnHYQtEDycybNOg4ebn2AHslEKw==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.23.tgz", + "integrity": "sha512-nuert5yo58GS5g9UVGNPY3xCLuob1jg7p5t9gYThUIjWp4treFJZDgV8YGbrhmNxrvrS5pWyC9HYMTWRDdO98A==", "dev": true, "dependencies": { "@types/debug": "^4.1.12", "@types/fs-extra": "^11.0.4", "@types/hash-sum": "^1.0.2", - "@vuepress/shared": "2.0.0-rc.17", - "debug": "^4.3.7", - "fs-extra": "^11.2.0", - "globby": "^14.0.2", + "@vuepress/shared": "2.0.0-rc.23", + "debug": "^4.4.0", + "fs-extra": "^11.3.0", + "globby": "^14.1.0", "hash-sum": "^2.0.0", - "ora": "^8.1.0", - "picocolors": "^1.1.0", + "ora": "^8.2.0", + "picocolors": "^1.1.1", "upath": "^2.0.1" } }, "node_modules/@vueuse/core": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz", - "integrity": "sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.2.0.tgz", + "integrity": "sha512-n5TZoIAxbWAQ3PqdVPDzLgIRQOujFfMlatdI+f7ditSmoEeNpPBvp7h2zamzikCmrhFIePAwdEQB6ENccHr7Rg==", "dev": true, "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.1.0", - "@vueuse/shared": "11.1.0", - "vue-demi": ">=0.14.10" + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.2.0", + "@vueuse/shared": "13.2.0" }, "funding": { "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.1.0.tgz", - "integrity": "sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==", + "node_modules/@vueuse/metadata": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.2.0.tgz", + "integrity": "sha512-kPpzuQCU0+D8DZCzK0iPpIcXI+6ufWSgwnjJ6//GNpEn+SHViaCtR+XurzORChSgvpHO9YC8gGM97Y1kB+UabA==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.1.0.tgz", - "integrity": "sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==", - "dev": true, - "dependencies": { - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.2.0.tgz", + "integrity": "sha512-vx9ZPDF5HcU9up3Jgt3G62dMUfZEdk6tLyBAHYAG4F4n73vpaA7J5hdncDI/lS9Vm7GA/FPlbOmh9TrDZROTpg==", "dev": true, - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "vue": "^3.5.0" } }, "node_modules/ansi-regex": { @@ -2647,9 +2853,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -2666,11 +2872,11 @@ } ], "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -2683,6 +2889,16 @@ "postcss": "^8.1.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balloon-css": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/balloon-css/-/balloon-css-1.2.0.tgz", @@ -2690,12 +2906,12 @@ "dev": true }, "node_modules/bcrypt-ts": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-ts/-/bcrypt-ts-5.0.2.tgz", - "integrity": "sha512-gDwQ5784AkkfhHACh3jGcg1hUubyZyeq9AtVd5gXkcyHGVOC+mORjRIHSj+fHfqwY5vxwyBLXQpcfk8MpK0ROg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/bcrypt-ts/-/bcrypt-ts-7.0.0.tgz", + "integrity": "sha512-JMr30sbKPwF+2TccaNOYJuDx+nCmnTvHGB2rwkj+To/xZhBTX9f8zpTqGy3kpkS26KWOEYPsQlOJ5MVD00RHQQ==", "dev": true, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/binary-extensions": { @@ -2711,9 +2927,9 @@ } }, "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" @@ -2738,9 +2954,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -2757,10 +2973,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -2788,9 +3004,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "dev": true, "funding": [ { @@ -2818,9 +3034,9 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -3065,20 +3281,6 @@ "node": ">=18" } }, - "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/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -3113,16 +3315,10 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "dev": true - }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -3243,9 +3439,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.38", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.38.tgz", - "integrity": "sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg==", + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", "dev": true }, "node_modules/emoji-regex": { @@ -3292,41 +3488,43 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/escalade": { @@ -3357,43 +3555,11 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/execa": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", - "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.0", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extend-shallow": { "version": "2.0.1", @@ -3408,25 +3574,25 @@ } }, "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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "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" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3438,21 +3604,6 @@ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3492,9 +3643,9 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -3540,29 +3691,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/giscus": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.5.0.tgz", - "integrity": "sha512-t3LL0qbSO3JXq3uyQeKpF5CegstGfKX/0gI6eDe1cmnI7D56R7j52yLdzw4pdKrg3VnufwCgCM3FDz7G1Qr6lg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.6.0.tgz", + "integrity": "sha512-Zrsi8r4t1LVW950keaWcsURuZUQwUaMKjvJgTCY125vkW6OiEBkatE7ScJDbpqKHdZwb///7FVC21SE3iFK3PQ==", "dev": true, "dependencies": { - "lit": "^3.1.2" + "lit": "^3.2.1" } }, "node_modules/glob-parent": { @@ -3578,17 +3713,17 @@ } }, "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -3624,10 +3759,76 @@ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "dev": true }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-sanitize": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "unist-util-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, "dependencies": { "@types/hast": "^3.0.0", @@ -3637,7 +3838,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -3660,6 +3861,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", @@ -3695,15 +3913,6 @@ "entities": "^4.5.0" } }, - "node_modules/human-signals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", - "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -3717,18 +3926,18 @@ } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", "dev": true, "optional": true, "peer": true @@ -3817,18 +4026,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -3853,12 +4050,6 @@ "url": "https://github.com/sponsors/mesqueeb" } }, - "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/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -3885,15 +4076,14 @@ } }, "node_modules/katex": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", - "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", "dev": true, "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], - "license": "MIT", "dependencies": { "commander": "^8.3.0" }, @@ -3932,31 +4122,31 @@ } }, "node_modules/lit": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", - "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", + "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==", "dev": true, "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.1.0", - "lit-html": "^3.2.0" + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" } }, "node_modules/lit-element": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", - "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz", + "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==", "dev": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.2.0" + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" } }, "node_modules/lit-html": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", - "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.0.tgz", + "integrity": "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -4003,9 +4193,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -4087,9 +4277,9 @@ } }, "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -4107,9 +4297,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, "funding": [ { @@ -4123,9 +4313,9 @@ ] }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "funding": [ { @@ -4144,9 +4334,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -4160,9 +4350,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { @@ -4213,9 +4403,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -4245,9 +4435,9 @@ "peer": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/normalize-path": { @@ -4268,46 +4458,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -4335,22 +4485,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/oniguruma-to-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", - "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "dev": true + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", "dev": true, "dependencies": { - "regex": "^4.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, "node_modules/ora": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", - "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, "dependencies": { "chalk": "^5.3.0", @@ -4406,18 +4561,6 @@ "node": ">=6" } }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse5": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", @@ -4464,22 +4607,13 @@ "node": ">=8" } }, - "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-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4501,9 +4635,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -4528,9 +4662,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -4547,8 +4681,8 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -4603,25 +4737,10 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/pretty-ms": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", - "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", - "dev": true, - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, "funding": { "type": "github", @@ -4687,11 +4806,73 @@ } }, "node_modules/regex": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", - "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "dev": true }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sanitize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", + "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-sanitize": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4724,9 +4905,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "engines": { "iojs": ">=1.0.0", @@ -4740,12 +4921,12 @@ "dev": true }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", "dev": true, "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -4755,22 +4936,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", "fsevents": "~2.3.2" } }, @@ -4804,16 +4989,15 @@ "dev": true }, "node_modules/sass": { - "version": "1.79.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", - "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", + "version": "1.89.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.0.tgz", + "integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -4821,12 +5005,15 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", - "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -4920,38 +5107,19 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "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/shiki": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", - "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", - "dev": true, - "dependencies": { - "@shikijs/core": "1.22.0", - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", - "@shikijs/vscode-textmate": "^9.3.0", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.4.2.tgz", + "integrity": "sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==", + "dev": true, + "dependencies": { + "@shikijs/core": "3.4.2", + "@shikijs/engine-javascript": "3.4.2", + "@shikijs/engine-oniguruma": "3.4.2", + "@shikijs/langs": "3.4.2", + "@shikijs/themes": "3.4.2", + "@shikijs/types": "3.4.2", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, @@ -5005,9 +5173,9 @@ } }, "node_modules/slimsearch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/slimsearch/-/slimsearch-2.1.1.tgz", - "integrity": "sha512-l1utJWal8F/RIheYk88DE2+enI12nIrn5SHt4ih/CNAH81PzkTv2GVBODlLynDJb7xan5hjd8XTL5f0L4cxLQA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/slimsearch/-/slimsearch-2.2.2.tgz", + "integrity": "sha512-C+E3y4sKKzPzcOyty0G9CjXdLvY0ZWPSCQCDNqSv/P6+rvoL6RiHvuwr0wnxf0QgdbdyNiJQ0w7OdudHoabpCg==", "dev": true, "engines": { "node": ">=18.18.0" @@ -5114,37 +5282,73 @@ "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, "engines": { - "node": ">=18" + "node": ">=16" + } + }, + "node_modules/synckit": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.6.tgz", + "integrity": "sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/synckit" } }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "dependencies": { - "copy-anything": "^3.0.2" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=16" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/to-regex-range": { @@ -5169,6 +5373,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -5185,15 +5399,15 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "engines": { "node": ">=18" @@ -5202,6 +5416,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -5290,9 +5523,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -5310,7 +5543,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5333,6 +5566,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", @@ -5348,20 +5595,23 @@ } }, "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -5370,19 +5620,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -5403,20 +5659,52 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vue": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", - "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.14.tgz", + "integrity": "sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.5.12", - "@vue/compiler-sfc": "3.5.12", - "@vue/runtime-dom": "3.5.12", - "@vue/server-renderer": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/compiler-dom": "3.5.14", + "@vue/compiler-sfc": "3.5.14", + "@vue/runtime-dom": "3.5.14", + "@vue/server-renderer": "3.5.14", + "@vue/shared": "3.5.14" }, "peerDependencies": { "typescript": "*" @@ -5428,9 +5716,9 @@ } }, "node_modules/vue-router": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", - "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", "dev": true, "dependencies": { "@vue/devtools-api": "^6.6.4" @@ -5449,18 +5737,18 @@ "dev": true }, "node_modules/vuepress": { - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.17.tgz", - "integrity": "sha512-KUWHbB4c9bEeFa8Zx9OAz0e1n8Ae9bEvu0T+Yuhm73cnLONxvhLveBdaLjCwrQZC78auP1L5xL8R1voq0ahXYQ==", + "version": "2.0.0-rc.23", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.23.tgz", + "integrity": "sha512-XID/zr7qDGLg7oYGwDTZpWRNXCVQcI1wQTfkN0spyumV2EpHe7XBsmnwICd+dTqRNZuD+JHyJsYLEqDEszFObw==", "dev": true, "dependencies": { - "@vuepress/cli": "2.0.0-rc.17", - "@vuepress/client": "2.0.0-rc.17", - "@vuepress/core": "2.0.0-rc.17", - "@vuepress/markdown": "2.0.0-rc.17", - "@vuepress/shared": "2.0.0-rc.17", - "@vuepress/utils": "2.0.0-rc.17", - "vue": "^3.5.10" + "@vuepress/cli": "2.0.0-rc.23", + "@vuepress/client": "2.0.0-rc.23", + "@vuepress/core": "2.0.0-rc.23", + "@vuepress/markdown": "2.0.0-rc.23", + "@vuepress/shared": "2.0.0-rc.23", + "@vuepress/utils": "2.0.0-rc.23", + "vue": "^3.5.13" }, "bin": { "vuepress": "bin/vuepress.js", @@ -5471,9 +5759,9 @@ "node": "^18.19.0 || >=20.4.0" }, "peerDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.17", - "@vuepress/bundler-webpack": "2.0.0-rc.17", - "vue": "^3.5.0" + "@vuepress/bundler-vite": "2.0.0-rc.23", + "@vuepress/bundler-webpack": "2.0.0-rc.23", + "vue": "^3.5.13" }, "peerDependenciesMeta": { "@vuepress/bundler-vite": { @@ -5485,23 +5773,23 @@ } }, "node_modules/vuepress-plugin-components": { - "version": "2.0.0-rc.57", - "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.57.tgz", - "integrity": "sha512-/YEQS46Y87Sqn55PAhBaJI31J221qq+twpl62u7yLgVZmtE1P6ibnRCSqzsu/D8OscMjDSUlN4yFuuVZvdtCqA==", + "version": "2.0.0-rc.88", + "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.88.tgz", + "integrity": "sha512-TwcHHiCdx9g8VlUhRTcMvvPAw1dmtmKNnfs9XgK3ejLMzVkmxT5uEH9xqmkbDdIFo4oy/CYBBX9qSCXH5/Qx0A==", "dev": true, "dependencies": { "@stackblitz/sdk": "^1.11.0", - "@vuepress/helper": "2.0.0-rc.52", - "@vuepress/plugin-sass-palette": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", + "@vuepress/helper": "^2.0.0-rc.104", + "@vuepress/plugin-sass-palette": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", "balloon-css": "^1.2.0", "create-codepen": "^2.0.0", "qrcode": "^1.5.4", - "vue": "^3.5.10", - "vuepress-shared": "2.0.0-rc.57" + "vue": "^3.5.13", + "vuepress-shared": "2.0.0-rc.88" }, "engines": { - "node": ">=18.19.0", + "node": ">= 20.6.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" @@ -5511,11 +5799,11 @@ "dashjs": "4.7.4", "hls.js": "^1.4.12", "mpegts.js": "^1.7.3", - "sass": "^1.79.3", - "sass-embedded": "^1.79.3", - "sass-loader": "^16.0.2", + "sass": "^1.88.0", + "sass-embedded": "^1.88.0", + "sass-loader": "^16.0.5", "vidstack": "^1.12.9", - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "artplayer": { @@ -5545,37 +5833,26 @@ } }, "node_modules/vuepress-plugin-md-enhance": { - "version": "2.0.0-rc.57", - "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.57.tgz", - "integrity": "sha512-+HU1NRoUkAlPUqLizmLfvmXHCa5Z1gc0+mApONaS1Q01K64DBZ9GSUMjpch/QCa2gL76yI9C8w679ukhlDY3Gw==", - "dev": true, - "dependencies": { - "@mdit/plugin-alert": "^0.13.1", - "@mdit/plugin-align": "^0.13.1", - "@mdit/plugin-attrs": "^0.13.1", - "@mdit/plugin-container": "^0.13.1", - "@mdit/plugin-demo": "^0.13.1", - "@mdit/plugin-footnote": "^0.13.1", - "@mdit/plugin-include": "^0.13.1", - "@mdit/plugin-mark": "^0.13.1", - "@mdit/plugin-plantuml": "^0.13.1", - "@mdit/plugin-spoiler": "^0.13.1", - "@mdit/plugin-stylize": "^0.13.1", - "@mdit/plugin-sub": "^0.13.1", - "@mdit/plugin-sup": "^0.13.1", - "@mdit/plugin-tasklist": "^0.13.1", - "@mdit/plugin-uml": "^0.13.1", + "version": "2.0.0-rc.88", + "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.88.tgz", + "integrity": "sha512-829rH7XUkRD9yYdnJxDmUleRx+mCXxO7A7xtQAXBlZbqX1dvB540iB1Uh8DYJCf8F/LmAmg7R2ftZjUqfhUy3Q==", + "dev": true, + "dependencies": { + "@mdit/plugin-container": "^0.18.0", + "@mdit/plugin-demo": "^0.18.0", + "@mdit/plugin-plantuml": "^0.18.0", + "@mdit/plugin-uml": "^0.18.0", "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.52", - "@vuepress/plugin-sass-palette": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", + "@vuepress/helper": "^2.0.0-rc.104", + "@vuepress/plugin-sass-palette": "2.0.0-rc.104", + "@vueuse/core": "^13.1.0", "balloon-css": "^1.2.0", "js-yaml": "^4.1.0", - "vue": "^3.5.10", - "vuepress-shared": "2.0.0-rc.57" + "vue": "^3.5.13", + "vuepress-shared": "2.0.0-rc.88" }, "engines": { - "node": ">=18.19.0", + "node": ">= 20.6.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" @@ -5586,15 +5863,15 @@ "echarts": "^5.0.0", "flowchart.ts": "^3.0.0", "kotlin-playground": "^1.23.0", - "markmap-lib": "^0.17.0", - "markmap-toolbar": "^0.17.0", - "markmap-view": "^0.17.0", - "mermaid": "^11.2.0", + "markmap-lib": "^0.18.5", + "markmap-toolbar": "^0.18.5", + "markmap-view": "^0.18.5", + "mermaid": "^11.6.0", "sandpack-vue3": "^3.0.0", - "sass": "^1.79.3", - "sass-embedded": "^1.79.3", - "sass-loader": "^16.0.2", - "vuepress": "2.0.0-rc.17" + "sass": "^1.88.0", + "sass-embedded": "^1.88.0", + "sass-loader": "^16.0.5", + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "@vue/repl": { @@ -5656,126 +5933,92 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/vuepress-plugin-search-pro": { - "version": "2.0.0-rc.57", - "resolved": "https://registry.npmjs.org/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-rc.57.tgz", - "integrity": "sha512-d+gl1G5GYGHhAlF6BofAWFaLNn0h9euULGJEJ2/2GtWsBgkppEI0pPrGDlJ1t7KAo/67eOX0/VNf4CrRSp1GFA==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vuepress/plugin-sass-palette": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "cheerio": "1.0.0", - "chokidar": "^3.6.0", - "slimsearch": "^2.1.1", - "vue": "^3.5.10", - "vuepress-shared": "2.0.0-rc.57" - }, - "engines": { - "node": ">=18.19.0", - "npm": ">=8", - "pnpm": ">=7", - "yarn": ">=2" - }, - "peerDependencies": { - "sass": "^1.79.3", - "sass-embedded": "^1.79.3", - "sass-loader": "^16.0.2", - "vuepress": "2.0.0-rc.17" - }, - "peerDependenciesMeta": { - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "sass-loader": { - "optional": true - } - } - }, "node_modules/vuepress-shared": { - "version": "2.0.0-rc.57", - "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.57.tgz", - "integrity": "sha512-W6zSdTl7Vvjnvu/eTIZYm0+jyFEMEOJQTbF/nOgmeQcOaX8cDiftWi64s0dopZ2FSeWETiZ/efyIGcuB6O17JQ==", + "version": "2.0.0-rc.88", + "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.88.tgz", + "integrity": "sha512-BbNs0idGkZIOuuRtH111Y4qDX0Rah4LBCyMGlMj5rPHtnSmrMXHzjZlevkzwpSsPTLVoOuYvreFuocI1bLl6qA==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", - "dayjs": "^1.11.13", - "vue": "^3.5.10" + "@vuepress/helper": "^2.0.0-rc.104", + "@vueuse/core": "^13.1.0", + "vue": "^3.5.13" }, "engines": { - "node": ">=18.19.0", + "node": ">= 20.6.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "vuepress": "2.0.0-rc.17" + "vuepress": "2.0.0-rc.23" } }, "node_modules/vuepress-theme-hope": { - "version": "2.0.0-rc.58", - "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.58.tgz", - "integrity": "sha512-7C2UEhtNm1+ILoDLXyS+wNDz3Exjq6dwJnKbMIB1JnyZI+90kTmfZ/MtK1vCXBsA8Y4lbZE6dHxbhDLowwHypw==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.52", - "@vuepress/plugin-active-header-links": "2.0.0-rc.52", - "@vuepress/plugin-back-to-top": "2.0.0-rc.52", - "@vuepress/plugin-blog": "2.0.0-rc.52", - "@vuepress/plugin-catalog": "2.0.0-rc.52", - "@vuepress/plugin-comment": "2.0.0-rc.53", - "@vuepress/plugin-copy-code": "2.0.0-rc.52", - "@vuepress/plugin-copyright": "2.0.0-rc.52", - "@vuepress/plugin-git": "2.0.0-rc.52", - "@vuepress/plugin-links-check": "2.0.0-rc.52", - "@vuepress/plugin-markdown-hint": "2.0.0-rc.52", - "@vuepress/plugin-markdown-image": "2.0.0-rc.52", - "@vuepress/plugin-markdown-math": "2.0.0-rc.52", - "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", - "@vuepress/plugin-notice": "2.0.0-rc.52", - "@vuepress/plugin-nprogress": "2.0.0-rc.52", - "@vuepress/plugin-photo-swipe": "2.0.0-rc.52", - "@vuepress/plugin-reading-time": "2.0.0-rc.52", - "@vuepress/plugin-redirect": "2.0.0-rc.52", - "@vuepress/plugin-rtl": "2.0.0-rc.52", - "@vuepress/plugin-sass-palette": "2.0.0-rc.52", - "@vuepress/plugin-seo": "2.0.0-rc.52", - "@vuepress/plugin-shiki": "2.0.0-rc.52", - "@vuepress/plugin-sitemap": "2.0.0-rc.52", - "@vuepress/plugin-theme-data": "2.0.0-rc.52", - "@vuepress/plugin-watermark": "2.0.0-rc.52", - "@vueuse/core": "^11.1.0", + "version": "2.0.0-rc.88", + "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.88.tgz", + "integrity": "sha512-XV33tgx84TuowHqxnYgG+rusqpdqbznPqDGbHrzOzJ+DMqGDHkVa6pejnUshpNryPSsHlNXtGLoqKLNQf/YVNw==", + "dev": true, + "dependencies": { + "@vuepress/helper": "^2.0.0-rc.104", + "@vuepress/plugin-active-header-links": "2.0.0-rc.103", + "@vuepress/plugin-back-to-top": "2.0.0-rc.104", + "@vuepress/plugin-blog": "2.0.0-rc.104", + "@vuepress/plugin-catalog": "2.0.0-rc.104", + "@vuepress/plugin-comment": "2.0.0-rc.104", + "@vuepress/plugin-copy-code": "2.0.0-rc.104", + "@vuepress/plugin-copyright": "2.0.0-rc.104", + "@vuepress/plugin-git": "2.0.0-rc.104", + "@vuepress/plugin-icon": "2.0.0-rc.104", + "@vuepress/plugin-links-check": "2.0.0-rc.104", + "@vuepress/plugin-markdown-ext": "2.0.0-rc.104", + "@vuepress/plugin-markdown-hint": "2.0.0-rc.104", + "@vuepress/plugin-markdown-image": "2.0.0-rc.104", + "@vuepress/plugin-markdown-include": "2.0.0-rc.104", + "@vuepress/plugin-markdown-math": "2.0.0-rc.104", + "@vuepress/plugin-markdown-stylize": "2.0.0-rc.104", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.104", + "@vuepress/plugin-notice": "2.0.0-rc.104", + "@vuepress/plugin-nprogress": "2.0.0-rc.104", + "@vuepress/plugin-photo-swipe": "2.0.0-rc.104", + "@vuepress/plugin-reading-time": "2.0.0-rc.104", + "@vuepress/plugin-redirect": "2.0.0-rc.104", + "@vuepress/plugin-rtl": "2.0.0-rc.104", + "@vuepress/plugin-sass-palette": "2.0.0-rc.104", + "@vuepress/plugin-seo": "2.0.0-rc.104", + "@vuepress/plugin-shiki": "2.0.0-rc.104", + "@vuepress/plugin-sitemap": "2.0.0-rc.104", + "@vuepress/plugin-theme-data": "2.0.0-rc.103", + "@vueuse/core": "^13.1.0", "balloon-css": "^1.2.0", - "bcrypt-ts": "^5.0.2", + "bcrypt-ts": "^7.0.0", "chokidar": "^3.6.0", - "vue": "^3.5.10", - "vuepress-plugin-components": "2.0.0-rc.57", - "vuepress-plugin-md-enhance": "2.0.0-rc.57", - "vuepress-shared": "2.0.0-rc.57" + "vue": "^3.5.13", + "vuepress-plugin-components": "2.0.0-rc.88", + "vuepress-plugin-md-enhance": "2.0.0-rc.88", + "vuepress-shared": "2.0.0-rc.88" }, "engines": { - "node": ">=18.19.0", + "node": ">= 20.6.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "@vuepress/plugin-docsearch": "2.0.0-rc.52", - "@vuepress/plugin-feed": "2.0.0-rc.52", - "@vuepress/plugin-prismjs": "2.0.0-rc.52", - "@vuepress/plugin-pwa": "2.0.0-rc.52", - "@vuepress/plugin-revealjs": "2.0.0-rc.52", - "@vuepress/plugin-search": "2.0.0-rc.52", - "nodejs-jieba": "^0.1.2", - "sass": "^1.79.3", - "sass-embedded": "^1.79.3", - "sass-loader": "^16.0.2", - "vuepress": "2.0.0-rc.17", - "vuepress-plugin-search-pro": "2.0.0-rc.57" + "@vuepress/plugin-docsearch": "2.0.0-rc.104", + "@vuepress/plugin-feed": "2.0.0-rc.104", + "@vuepress/plugin-meilisearch": "2.0.0-rc.104", + "@vuepress/plugin-prismjs": "2.0.0-rc.104", + "@vuepress/plugin-pwa": "2.0.0-rc.104", + "@vuepress/plugin-revealjs": "2.0.0-rc.104", + "@vuepress/plugin-search": "2.0.0-rc.104", + "@vuepress/plugin-slimsearch": "2.0.0-rc.104", + "@vuepress/plugin-watermark": "2.0.0-rc.104", + "@vuepress/shiki-twoslash": "2.0.0-rc.104", + "nodejs-jieba": "^0.2.1 || ^0.3.0", + "sass": "^1.88.0", + "sass-embedded": "^1.88.0", + "sass-loader": "^16.0.5", + "vuepress": "2.0.0-rc.23" }, "peerDependenciesMeta": { "@vuepress/plugin-docsearch": { @@ -5784,6 +6027,9 @@ "@vuepress/plugin-feed": { "optional": true }, + "@vuepress/plugin-meilisearch": { + "optional": true + }, "@vuepress/plugin-prismjs": { "optional": true }, @@ -5796,6 +6042,15 @@ "@vuepress/plugin-search": { "optional": true }, + "@vuepress/plugin-slimsearch": { + "optional": true + }, + "@vuepress/plugin-watermark": { + "optional": true + }, + "@vuepress/shiki-twoslash": { + "optional": true + }, "nodejs-jieba": { "optional": true }, @@ -5807,19 +6062,17 @@ }, "sass-loader": { "optional": true - }, - "vuepress-plugin-search-pro": { - "optional": true } } }, - "node_modules/watermark-js-plus": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/watermark-js-plus/-/watermark-js-plus-1.5.7.tgz", - "integrity": "sha512-KaQEUnvBX5em2hBeuKcpAASpV+sO1j8NbXY7FL7jb0w1TCKmMSyn8nkj2e+KeleuQ1iwyXHEMFdSWXDIQsACYQ==", + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "dev": true, - "engines": { - "node": ">=20.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/whatwg-encoding": { @@ -5843,21 +6096,6 @@ "node": ">=18" } }, - "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/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -6001,18 +6239,6 @@ "node": ">=8" } }, - "node_modules/yoctocolors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", - "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/docs/package.json b/docs/package.json index a2da69dcb..739155972 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,18 +11,18 @@ "docs:update-package": "npx vp-update" }, "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.17", - "@vuepress/plugin-markdown-image": "2.0.0-rc.52", - "@vuepress/plugin-markdown-math": "2.0.0-rc.52", - "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", - "katex": "^0.16.11", - "sass-loader": "16.0.2", - "vue": "3.5.12", - "vuepress": "2.0.0-rc.17", - "vuepress-plugin-search-pro": "2.0.0-rc.57", - "vuepress-theme-hope": "2.0.0-rc.58" + "@vuepress/bundler-vite": "2.0.0-rc.23", + "@vuepress/plugin-markdown-image": "2.0.0-rc.104", + "@vuepress/plugin-markdown-math": "2.0.0-rc.104", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.104", + "@vuepress/plugin-slimsearch": "2.0.0-rc.104", + "katex": "^0.16.22", + "sass-loader": "16.0.5", + "vue": "3.5.14", + "vuepress": "2.0.0-rc.23", + "vuepress-theme-hope": "2.0.0-rc.88" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.22.4" + "@rollup/rollup-linux-x64-gnu": "^4.41.0" } } diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 9301e7ee0..e56b8704e 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -1,3 +1,4 @@ +import { slimsearchPlugin } from "@vuepress/plugin-slimsearch"; import { hopeTheme } from "vuepress-theme-hope"; export default hopeTheme({ @@ -6,9 +7,6 @@ export default hopeTheme({ url: "/community/team.html", }, - iconAssets: "/assets/font/font.css", - iconPrefix: "iconfont icon-", - logo: "/photos/home/logo-small.svg", darkmode: "toggle", @@ -1254,48 +1252,43 @@ export default hopeTheme({ plugins: { + + icon: { + prefix: "iconfont icon-", + assets: "/assets/font/font.css", + }, + blog: { filter: ({ frontmatter }) => frontmatter.type === "news", }, - - markdownImage: { - figure: true, - lazyload: true, - mark: true, - size: true, - }, - markdownMath: { - }, - markdownTab: { - codeTabs: true, - tabs: false, - }, - linksCheck: { - dev: true, - build: "error" - }, - searchPro: { + + + slimsearch: { indexContent: true, }, photoSwipe: false, components: { - // components you want - components: [ - /* "AudioPlayer", - "Badge", - "BiliBili", - "CodePen", - "PDF", - "Replit", - "StackBlitz", - "VideoPlayer", - "YouTube",*/ - ], + components: [], }, - mdEnhance: { + }, + + markdown: { + imgLazyload: true, + imgMark: true, + figure: true, + imgSize: true, + math: { + + }, + tabs: false, + codeTabs: true, + linksCheck: { + dev: true, + build: "error" + }, align: true, attrs: true, - chart: false, + chartjs: false, demo: false, echarts: false, flowchart: false, @@ -1324,6 +1317,5 @@ export default hopeTheme({ tasklist: false, vPre: false, vuePlayground: false - } - }, + } }); From 171e1bd097e0f5333b14d49c1f33f08e257332ba Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:09:24 +0200 Subject: [PATCH 17/42] updated team page --- docs/src/community/team.md | 56 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/docs/src/community/team.md b/docs/src/community/team.md index 3184c715c..5d7bca9ce 100644 --- a/docs/src/community/team.md +++ b/docs/src/community/team.md @@ -9,11 +9,63 @@ The funded project team includes: - Hauke Hund • [GitHub](https://github.com/hhund) - Maximilian Kurscheidt • [GitHub](https://github.com/MadMax93) - Simon Schweizer • [GitHub](https://github.com/schwzr) -- Christoph Zilske • [GitHub](https://github.com/ZilskeC) - Reto Wettstein • [GitHub](https://github.com/wetret) - Alexander Kiel • [GitHub](https://github.com/alexanderkiel) - +- Jan Böhringer • [GitHub](https://github.com/jaboehri) +- Mathias Rühle • [GitHub](https://github.com/EmteZogaf) +- Mohamad Khalil Malla +- Paul Maibach • [GitHub](https://github.com/javarum) +- Sylvester Baidoo-A. +- Tom Holler • [GitHub](https://github.com/H99-code) +- Serap Aydin • [GitHub](https://github.com/seay28) We thank additional contributors, including: - Florian Seidel • [GitHub](https://github.com/FloSeidel) - Simon Mödinger • [GitHub](https://github.com/simonmoedinger) +- Christoph Zilske • [GitHub](https://github.com/ZilskeC) +- Amir Kannout + +## Funded Partners + +### Heilbronn University of Applied Sciences | Gecko Institute +The [GECKO Institute](https://www.hs-heilbronn.de/de/gecko) is a research institution of [Heilbronn University of Applied Sciences](https://www.hs-heilbronn.de/de) and conducts research and development at the interfaces between medicine, economics and computer science. The DSF is part of Prof. Fegeler's research area: Interoperability and Digital Processes in Medicine. Other areas of research include educational technologies, health economics, and consumer health informatics. + + +### University of Heidelberg | Institute of Medical Informatics +The [Institute of Medical Informatics](https://www.klinikum.uni-heidelberg.de/kliniken-institute/institute/institut-fuer-medizinische-informatik) belongs to the University of Heidelberg. The scientific focus of the institute is on structured patient data, e.g. +- in the Medical Data Integration Center (MeDIC), +- structured acquisition and transformation of biomedical data, +- medical information systems and data models +- and much more. + + +### University of Leipzig | LIFE Institute +The [LIFE Institute](https://www.uniklinikum-leipzig.de/einrichtungen/life/) of the University of Leipzig manages collaborative and follow-on projects in the fields of medicine, public health, medical informatics, and biobanking. + +## Public Funding +### DSF - Medical Informatics Structure "Data Sharing Framework Community" (2023-2026) + + +![BMBF Logo =228x158](/photos/learnmore/funding/bmbf.png) + + The DSF Community connects the DSF competencies of the entire [Medical Informatics Initiative (MII)](https://www.medizininformatik-initiative.de/de/start) so that new use cases, in particular from Module 3 or the [Network University Medicine (NUM)](https://www.netzwerk-universitaetsmedizin.de/), are better supported in creating the respective DSF plugins. In the context of Module 2b, the DSF Community contributes to the further development of the common digital infrastructure of the MII together with the [FDPG+](https://forschen-fuer-gesundheit.de/) and [TRANSIT](https://www.gesundheitsforschung-bmbf.de/de/transit-medizininformatik-struktur-data-management-unit-16148.php) projects. [BMBF](https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php) + + Heilbronn University (HHN) focuses on the connecting of DSF related topics and competencies in the MII with the community management. The quality assurance of new DSF plugins and further development of the application and core components aim at a scalable, stable and secure operation of the DSF (Funding code: 01ZZ2307A). + + Heidelberg University is focusing on the further development of the DSF core components as well as the rollout of the DSF plugins, in particular also from the perspective of a data integration center in consultation with the FDGP+ and TRANSIT projects (Funding code: 01ZZ2307B). + + The University of Leipzig will further develop and adapt the DSF plugin for the Research Data Portal for Health FDPG according to specifications resulting from the FDPG+ project and enable Data Integration Centers (DIC) to operate the FDPG plugin (Funding code: 01ZZ2307C). + + ![MII Logo =320x190](/photos/learnmore/funding/mii.png ) + +<br> +<br> +<br> + +--- + +### Development of the DSF in the HiGHmed consortium -Contribution Heilbronn University and Heidelberg University (2018-2022) + +[HiGHmed](https://www.highmed.org/en/home) aims to increase the efficiency of clinical research and improve patient care through new medical informatics solutions and cross-organizational data exchange. The concept will be developed on the basis of three defined prototypical use cases, which will ensure close integration with the requirements of patient care and medical research. The [GECKO Institute](https://www.hs-heilbronn.de/de/gecko) of HHN will establish a trusted third party with pseudonymization service to implement the goals of HiGHmed and is involved in the technical development of the DSF together with the partners (Funding code: 01ZZ1802E). Heidelberg University is in particular involved in the technical development of the DSF (Funding code: 01ZZ1802A). + +![HiGHmed Logo =450x150](/photos/learnmore/funding/highmed.jpg) \ No newline at end of file From bcad408565a7b8511e7126a9d1edbdedcc61fbf9 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:09:49 +0200 Subject: [PATCH 18/42] removed not required pages --- docs/src/community/about/README.md | 14 ------------ docs/src/community/about/contact.md | 4 ---- docs/src/community/about/faq.md | 6 ----- docs/src/community/about/partners.md | 23 ------------------- docs/src/community/about/projectlist.md | 6 ----- docs/src/community/about/public.md | 30 ------------------------- 6 files changed, 83 deletions(-) delete mode 100644 docs/src/community/about/README.md delete mode 100644 docs/src/community/about/contact.md delete mode 100644 docs/src/community/about/faq.md delete mode 100644 docs/src/community/about/partners.md delete mode 100644 docs/src/community/about/projectlist.md delete mode 100644 docs/src/community/about/public.md diff --git a/docs/src/community/about/README.md b/docs/src/community/about/README.md deleted file mode 100644 index 4b85263ae..000000000 --- a/docs/src/community/about/README.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Learn more -icon: creative ---- - -## Overview - -- [Contact & Community Guide](/about/learnmore/contact.md) -- [Contributors](/about/learnmore/team.md) -- [Partners](/about/learnmore/partners.md) -- [Public Funding](/about/learnmore/public.md) -- [FAQ](/about/learnmore/faq.md) -- [Projectlist](/about/learnmore/projectlist.md) -- [Speakinghours](/about/learnmore/speakinghours.md) diff --git a/docs/src/community/about/contact.md b/docs/src/community/about/contact.md deleted file mode 100644 index 1d10cc1c8..000000000 --- a/docs/src/community/about/contact.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Contact & Community -icon: call ---- diff --git a/docs/src/community/about/faq.md b/docs/src/community/about/faq.md deleted file mode 100644 index 9c202db62..000000000 --- a/docs/src/community/about/faq.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: FAQ -icon: ask ---- - -## FAQ \ No newline at end of file diff --git a/docs/src/community/about/partners.md b/docs/src/community/about/partners.md deleted file mode 100644 index d404351ff..000000000 --- a/docs/src/community/about/partners.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Partners -icon: proxy ---- - -Funded for further development of the Data Sharing Framework are: - -## Heilbronn University of Applied Sciences | Gecko Institute -The [GECKO Institute](https://www.hs-heilbronn.de/de/gecko) is a research institution of [Heilbronn University of Applied Sciences](https://www.hs-heilbronn.de/de) and conducts research and development at the interfaces between medicine, economics and computer science. The DSF is part of Prof. Fegeler's research area: Interoperability and Digital Processes in Medicine. Other areas of research include educational technologies, health economics, and consumer health informatics. - - -## University of Heidelberg | Institute of Medical Informatics -The [Institute of Medical Informatics](https://www.klinikum.uni-heidelberg.de/kliniken-institute/institute/institut-fuer-medizinische-informatik) belongs to the University of Heidelberg. The scientific focus of the institute is on structured patient data, e.g. -- in the Medical Data Integration Center (MeDIC), -- structured acquisition and transformation of biomedical data, -- medical information systems and data models -- and much more. - - -## University of Leipzig | LIFE Institute -The [LIFE Institute](https://www.uniklinikum-leipzig.de/einrichtungen/life/) of the University of Leipzig manages collaborative and follow-on projects in the fields of medicine, public health, medical informatics, and biobanking. - - diff --git a/docs/src/community/about/projectlist.md b/docs/src/community/about/projectlist.md deleted file mode 100644 index f44454bac..000000000 --- a/docs/src/community/about/projectlist.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Projectlist -icon: list ---- - -## Projectlist \ No newline at end of file diff --git a/docs/src/community/about/public.md b/docs/src/community/about/public.md deleted file mode 100644 index bfae8e1f8..000000000 --- a/docs/src/community/about/public.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Public Funding -icon: free ---- -::: center -## DSF - Medical Informatics Structure "Data Sharing Framework Community" (2023-2026) -::: -![](/photos/learnmore/funding/bmbf.png =228x158) - - The DSF Community connects the DSF competencies of the entire [Medical Informatics Initiative (MII)](https://www.medizininformatik-initiative.de/de/start) so that new use cases, in particular from Module 3 or the [Network University Medicine (NUM)](https://www.netzwerk-universitaetsmedizin.de/), are better supported in creating the respective DSF plugins. In the context of Module 2b, the DSF Community contributes to the further development of the common digital infrastructure of the MII together with the [FDPG+](https://forschen-fuer-gesundheit.de/) and [TRANSIT](https://www.gesundheitsforschung-bmbf.de/de/transit-medizininformatik-struktur-data-management-unit-16148.php) projects. [BMBF](https://www.gesundheitsforschung-bmbf.de/de/dsf-medizininformatik-struktur-data-sharing-framework-community-16133.php) - - Heilbronn University (HHN) focuses on the connecting of DSF related topics and competencies in the MII with the community management. The quality assurance of new DSF plugins and further development of the application and core components aim at a scalable, stable and secure operation of the DSF (Funding code: 01ZZ2307A). - - Heidelberg University is focusing on the further development of the DSF core components as well as the rollout of the DSF plugins, in particular also from the perspective of a data integration center in consultation with the FDGP+ and TRANSIT projects (Funding code: 01ZZ2307B). - - The University of Leipzig will further develop and adapt the DSF plugin for the Research Data Portal for Health FDPG according to specifications resulting from the FDPG+ project and enable Data Integration Centers (DIC) to operate the FDPG plugin (Funding code: 01ZZ2307C). -::: center - ![](/photos/learnmore/funding/mii.png =370x190) -::: -<br> -<br> -<br> - ---- -::: center -## Development of the DSF in the HiGHmed consortium -Contribution Heilbronn University and Heidelberg University (2018-2022) -::: -[HiGHmed](https://www.highmed.org/en/home) aims to increase the efficiency of clinical research and improve patient care through new medical informatics solutions and cross-organizational data exchange. The concept will be developed on the basis of three defined prototypical use cases, which will ensure close integration with the requirements of patient care and medical research. The [GECKO Institute](https://www.hs-heilbronn.de/de/gecko) of HHN will establish a trusted third party with pseudonymization service to implement the goals of HiGHmed and is involved in the technical development of the DSF together with the partners (Funding code: 01ZZ1802E). Heidelberg University is in particular involved in the technical development of the DSF (Funding code: 01ZZ1802A). - -![](/photos/learnmore/funding/highmed.jpg =450x150) \ No newline at end of file From cd1828615bda8a9f6f741c9fe0f77d54185ce2a6 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:10:31 +0200 Subject: [PATCH 19/42] fixed allowlist cross reference --- docs/src/explore/concepts/allow-list.md | 2 +- docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md | 2 +- docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/src/explore/concepts/allow-list.md b/docs/src/explore/concepts/allow-list.md index 8a488a3b3..56856e1f8 100644 --- a/docs/src/explore/concepts/allow-list.md +++ b/docs/src/explore/concepts/allow-list.md @@ -12,6 +12,6 @@ The Allow List consists of Organization-, Endpoint- and OrganisationAffiliation- ![Architecture](/photos/info/allowList/allowList-architecture.png) ## Allow List Managment -[Here](/stable/maintain/allowList-mgm.md) you can read all the information if you want to create or update an Allow List. +[Here](/operations/v1/latest/maintain/allowList-mgm.md) you can read all the information if you want to create or update an Allow List. #### Feel free to contact us via <a href="mailto:dsf-gecko@hs-heilbronn.de"> E-Mail (dsf-gecko@hs-heilbronn.de)</a> and we will take care of your request as soon as possible. \ No newline at end of file diff --git a/docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md index 3b8bf336a..08b53882e 100644 --- a/docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.0.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [here](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md index a66ad0f7b..e230918cc 100644 --- a/docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.1.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [here](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md index a66ad0f7b..e230918cc 100644 --- a/docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.2.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [here](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md index f19efc32f..edd88d567 100644 --- a/docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.3.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the Gecko Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.3.1/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.3.2/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.4.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.5.0/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.5.1/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md index 4e7a8f444..db25eceff 100644 --- a/docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.5.2/maintain/allowList-mgm.md @@ -7,7 +7,7 @@ icon: share This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md index d04ae8c54..755a27a20 100644 --- a/docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.6.0/maintain/allowList-mgm.md @@ -2,7 +2,7 @@ title: Allow List Management icon: share --- -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. diff --git a/docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md index d04ae8c54..755a27a20 100644 --- a/docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.7.0/maintain/allowList-mgm.md @@ -2,7 +2,7 @@ title: Allow List Management icon: share --- -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. From 614aed7d4cfe772f19002d90b2e66566231e5877 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:10:53 +0200 Subject: [PATCH 20/42] fixed allowlist cross reference (pt2) --- docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md b/docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md index d04ae8c54..755a27a20 100644 --- a/docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md +++ b/docs/src/operations/v1/v1.7.1/maintain/allowList-mgm.md @@ -2,7 +2,7 @@ title: Allow List Management icon: share --- -You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). +You can read all about the concept of Allow Lists [in our introduction](/explore/concepts/allow-list.md). ## Overview To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. From db24de6cc783ff65681b0cfadc34660a86998baf Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:11:11 +0200 Subject: [PATCH 21/42] fixed link (new structure) --- docs/src/community/communication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/community/communication.md b/docs/src/community/communication.md index 782178231..f0fe19524 100644 --- a/docs/src/community/communication.md +++ b/docs/src/community/communication.md @@ -10,7 +10,7 @@ DSF's community is growing and we welcome anyone who would like to join! :rocket ### Stay up to Date - [GitHub](https://github.com/datasharingframework/dsf) -- Follow our [contributors](/about/learnmore/team.md) on GitHub +- Follow our [contributors](./team.md) on GitHub - [Zulip Chat - MII](https://mii.zulipchat.com) ### Contribute Code From 8200c3e29917ec2c28248afdb71da14b6d444145 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 21 May 2025 17:11:24 +0200 Subject: [PATCH 22/42] fixed links, page will be replaced later --- docs/src/explore/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/explore/README.md b/docs/src/explore/README.md index 116db69b9..529a40158 100644 --- a/docs/src/explore/README.md +++ b/docs/src/explore/README.md @@ -5,10 +5,10 @@ icon: info ## Overview - Documentation - - [Introduction](info/introduction.md) - - [Basics & Standards](info/basics.md) - - [Architecture](info/architecture.md) - - [Security](info/security.md) - - [Allow Lists](info/allowList.md) - - [Process Plugins](info/process-plugins.md) + - [Introduction](concepts/introduction.md) + - [Basics & Standards](concepts/basics.md) + - [Architecture](concepts/architecture.md) + - [Security](concepts/security.md) + - [Allow Lists](concepts/allowList.md) + - [Process Plugins](concepts/process-plugins.md) From 0415735b7317caf6363902294acf51d6c41d877b Mon Sep 17 00:00:00 2001 From: Serap Aydin <saydin3@stud.hs-heilbronn.de> Date: Wed, 21 May 2025 17:19:46 +0200 Subject: [PATCH 23/42] - for you --- docs/src/community/events/tutorials/Talks.md | 8 --- docs/src/explore/concepts/README.md | 52 ++++++++++++++++++++ docs/src/for-you/index.md | 3 +- 3 files changed, 54 insertions(+), 9 deletions(-) delete mode 100644 docs/src/community/events/tutorials/Talks.md create mode 100644 docs/src/explore/concepts/README.md diff --git a/docs/src/community/events/tutorials/Talks.md b/docs/src/community/events/tutorials/Talks.md deleted file mode 100644 index 7891fe1db..000000000 --- a/docs/src/community/events/tutorials/Talks.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Recorded talks -icon: globe ---- - -Redirect to [this webpage](/oldstable/guideline/publications.html#recorded-talks). -<meta http-equiv="refresh" content="0; URL=/oldstable/guideline/publications.html#recorded-talks"> - diff --git a/docs/src/explore/concepts/README.md b/docs/src/explore/concepts/README.md new file mode 100644 index 000000000..aa7247613 --- /dev/null +++ b/docs/src/explore/concepts/README.md @@ -0,0 +1,52 @@ +--- +title: DSF for your project +icon: creative +--- + +::: tip Summary + +- **Use case agnostic middleware**: DSF is adaptable to any distributed process, leveraging BPMN 2.0 and FHIR R4 for secure, efficient data sharing across various biomedical research scenarios. + +- **Security**: DSF prioritizes security through stringent authentication and authorization protocols, ensuring data is accessed and shared only by authorized organizations to maintain data confidentiality and integrity. + +- **Proven in clinical research**: Deployed in German university hospitals, DSF's effectiveness and reliability are validated in real-world settings. + +- **Implementation guidance**: DSF offers resources on how to implement new process plugins. + + +::: + + +## Overview of DSF + +The **Data Sharing Framework (DSF)** is a secure middleware solution designed to facilitate data sharing across different organizations for biomedical research. It utilizes BPMN 2.0 and FHIR R4 standards to support processes such as data extraction, merging, pseudonymization, and provisioning. Funded by the German Federal Ministry of Education and Research as part of the Medical Informatics initiative, the DSF aims to improve data interoperability and security across institutional boundaries. + +## Key features and benefits + +### Distributed data sharing processes + +DSF enables distributed data sharing by providing each participating site with a FHIR endpoint and a business process engine. This setup ensures that data can be securely shared and processed across different sites, facilitating cross-site data sharing and feasibility analyses. + +### Flexibility with data standards + +While DSF primarily uses the FHIR R4 standard to ensure high-quality data exchange, it is designed to be open and adaptable to other data formats. This flexibility allows for a wide range of data types to be incorporated into research projects. + +### Security and access control + +Security is a critical component of DSF, which includes robust authentication and authorization protocols. These protocols ensure that data access and sharing are restricted to authorized organizations, maintaining the confidentiality and integrity of the data. + +### Deployment in clinical environments + +DSF is already deployed and operational in *Data Integration Centers* at German university hospitals, demonstrating its applicability and reliability in real-world clinical research settings. + +## Getting started with the DSF + + + +If you're looking to leverage the DSF for your research or you're interested in exploring how it can enhance your data sharing needs, we're here to support you. Visit the **[Learn how to implement your use case](./learn.md)** page to start your journey towards integrating the DSF into your research project. + +Should you have any questions or need personalized assistance, don't hesitate to reach out to the DSF core team directly at **dsf-gecko@hs-heilbronn.de**. + +Embark on your DSF journey today and [join a community](/community/contribute/) committed to advancing biomedical research through secure, interoperable data sharing. + + diff --git a/docs/src/for-you/index.md b/docs/src/for-you/index.md index bc3e8e05e..54678a0b8 100644 --- a/docs/src/for-you/index.md +++ b/docs/src/for-you/index.md @@ -2,6 +2,7 @@ title: DSF for your project icon: creative --- +<meta http-equiv="refresh" content="0;url=/explore/concepts/for-you"> ::: tip Summary @@ -47,6 +48,6 @@ If you're looking to leverage the DSF for your research or you're interested in Should you have any questions or need personalized assistance, don't hesitate to reach out to the DSF core team directly at **dsf-gecko@hs-heilbronn.de**. -Embark on your DSF journey today and [join a community](../stable/contribute/) committed to advancing biomedical research through secure, interoperable data sharing. +Embark on your DSF journey today and [join a community](/community/contribute/) committed to advancing biomedical research through secure, interoperable data sharing. From 7e804b9d1c232f14ba204c23d411c0cd1e4cb7df Mon Sep 17 00:00:00 2001 From: Serap Aydin <saydin3@stud.hs-heilbronn.de> Date: Fri, 23 May 2025 17:51:53 +0200 Subject: [PATCH 24/42] - tag color fix - news date fix - sidebar fix operations and process development --- docs/src/.vuepress/styles/config.scss | 3 +- docs/src/.vuepress/styles/index.scss | 15 ++- docs/src/.vuepress/theme.ts | 93 +++++-------------- docs/src/community/communication.md | 1 + docs/src/community/consultation-hours.md | 1 + docs/src/community/ecosystem.md | 1 + docs/src/community/events/tutorials/README.md | 2 +- docs/src/operations/get-started.md | 1 + docs/src/operations/old-versions.md | 1 + .../operations/process-plugin-deployment.md | 1 + ...st.md => 2025-04-23-spring-school-2025.md} | 7 +- ...hir.md => 2025-05-07-fhir-devdays-2025.md} | 4 +- docs/src/process-development/api-v1/create.md | 2 +- .../process-development/api-v1/get-started.md | 3 +- .../api-v1/tooling/empty-process-plugin.md | 6 +- .../process-development/api-v1/tooling/ide.md | 6 +- .../api-v1/tooling/maven.md | 6 +- .../api-v1/tooling/validator.md | 1 - .../api-v1/tutorials/README.md | 6 ++ .../api-v2/best-practices.md | 2 +- .../src/process-development/api-v2/concept.md | 10 ++ docs/src/process-development/api-v2/create.md | 2 +- .../process-development/api-v2/description.md | 11 --- .../process-development/api-v2/get-started.md | 1 - .../api-v2/implementation.md | 5 +- .../process-development/api-v2/migration.md | 4 +- .../src/process-development/api-v2/testing.md | 4 +- .../api-v2/tutorials/README.md | 6 ++ .../sass-palette/@sass-palette/hope-palette | 0 29 files changed, 94 insertions(+), 111 deletions(-) rename docs/src/posts/{2025-05-15-my-first-post.md => 2025-04-23-spring-school-2025.md} (88%) rename docs/src/posts/{2025-05-16-fhir.md => 2025-05-07-fhir-devdays-2025.md} (98%) create mode 100644 docs/src/process-development/api-v2/concept.md delete mode 100644 docs/src/process-development/api-v2/description.md create mode 100644 src/.vuepress/.temp/sass-palette/@sass-palette/hope-palette diff --git a/docs/src/.vuepress/styles/config.scss b/docs/src/.vuepress/styles/config.scss index 9960691d8..c72f02ad7 100644 --- a/docs/src/.vuepress/styles/config.scss +++ b/docs/src/.vuepress/styles/config.scss @@ -1,4 +1,5 @@ // you can change config here $theme-color: #326F95; -$colors: #c0392b, #d35400, #f39c12, #27ae60, #16a085, #2980b9, #8e44ad, #2c3e50, +$colors: #63C7A6, #54AEA0, #3F8999, #326F95 , #27ae60, #16a085, #2980b9, #2c3e50, #7f8c8d !default; + diff --git a/docs/src/.vuepress/styles/index.scss b/docs/src/.vuepress/styles/index.scss index 20cf7d8c0..8f6804029 100644 --- a/docs/src/.vuepress/styles/index.scss +++ b/docs/src/.vuepress/styles/index.scss @@ -8,11 +8,20 @@ h1, h2, h3, h4, h5 { display: none; } - - .image-container { height: 150px; width:361px; max-width: calc(100% - 20px); padding: 10px; float: right; -} \ No newline at end of file +} + +.vp-tag { + background-color: #63C7A6 !important; +} + +.page-tag-item { + background: #326F95 !important; + color: white !important; + border-radius: 5%; +} + diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index e56b8704e..4d0e01a85 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -32,7 +32,7 @@ export default hopeTheme({ }, { text: "Process Development", - icon: "process", + icon: "plugin", prefix: "/process-development/", children: [ { @@ -88,7 +88,7 @@ export default hopeTheme({ { text: "News", icon: "news", - link: "tag/blog/" + link: "tag/news/" }, { @@ -121,13 +121,12 @@ export default hopeTheme({ "/hackathon": [], "/spring-school": [], "/news": [], - "/stable/": [ + "/operations/v1/latest/": [ { text: "Home", icon: "home", link: "/", }, - "", { text: "Maintain a DSF instance", icon: "tool", @@ -197,31 +196,6 @@ export default hopeTheme({ } ], }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - { - text: "Contribute", - icon: "info", - link: "contribute/", - prefix: "contribute/", - children: [ - { - text: "Code", - link: "code", - icon: "code" - }, - { - text: "Documentation", - link: "documentation", - icon: "info" - } - ] - }, ], "/operations/v1/v1.7.1/": [ { @@ -1178,7 +1152,7 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], - "/about/": [ + "/community/": [ { text: "Home", icon: "home", @@ -1187,22 +1161,24 @@ export default hopeTheme({ { text: "News", icon: "news", - link: "/news/" - }, - { - text: "About", - icon: "creative", - prefix: "learnmore/", - link: "learnmore/", - children: ["contact", "team", "partners", "public", "faq", "projectlist", "speakinghours"], + link: "/tag/news/" }, { - text: "DSF-Community", - icon: "group", - prefix: "community/", - link: "community/", - children: ["community", "contribute", "code", "documentation"], - }, + text: "Community", + icon: "creative", + prefix: "/community/", + children: [ + "team", + "communication", + "ecosystem", + "contribute/", + "contribute/code", + "contribute/documentation", + "events/", + "consultation-hours" + ], + }, + ], "/process-development": [ { @@ -1210,38 +1186,15 @@ export default hopeTheme({ icon: "", prefix: "api-v1/", link: "api-v1/", - children: [ "concept", "tooling/", "tutorials/"], + children: [ "get-started","concept","create", "publishing/publish-on-dsfhub", "tooling/", "tutorials/",], }, { text: "api v2", icon: "", prefix: "api-v2/", link: "api-v2/", - children: [ "description","implementation", "migration", "tooling/", "tutorials/",], - }, - { - text: "how-to", - icon: "creative", - prefix: "how-to/", - link: "how-to/", - children: ["start-project"], - }, - { - text: "process-plugin", - icon: "process", - prefix: "process-plugin/", - link: "process-plugin/", - children: ["best-practise", "create", "testing"], - }, - { - text: "publishing", - icon: "publish", - prefix: "publishing/", - link: "publishing/", - children: ["publish-on-dsfhub"], - }, - - + children: [ "get-started","concept","implementation", "migration", "create", "best-practices","testing", "publishing/publish-on-dsfhub", "tooling/", "tutorials/",], + }, ], "/intro/use-cases/internal-mii-data-sharing.html": [] }, diff --git a/docs/src/community/communication.md b/docs/src/community/communication.md index f0fe19524..0eaa21017 100644 --- a/docs/src/community/communication.md +++ b/docs/src/community/communication.md @@ -1,5 +1,6 @@ --- title: Communication +icon: call --- ## Contact the team diff --git a/docs/src/community/consultation-hours.md b/docs/src/community/consultation-hours.md index 7afd081d9..deb4ffa46 100644 --- a/docs/src/community/consultation-hours.md +++ b/docs/src/community/consultation-hours.md @@ -1,5 +1,6 @@ --- title: Consultation Hours +icon: guide --- diff --git a/docs/src/community/ecosystem.md b/docs/src/community/ecosystem.md index b8f46c4d5..41c34d25b 100644 --- a/docs/src/community/ecosystem.md +++ b/docs/src/community/ecosystem.md @@ -1,5 +1,6 @@ --- title: DSF Ecosystem +icon: proxy --- We believe that the Data Sharing Framework (DSF) can only develop its full potential when embedded in a well-connected network of tools, organizations, and individuals. diff --git a/docs/src/community/events/tutorials/README.md b/docs/src/community/events/tutorials/README.md index 4ae36def0..c62bd0259 100644 --- a/docs/src/community/events/tutorials/README.md +++ b/docs/src/community/events/tutorials/README.md @@ -1,6 +1,6 @@ --- title: Events -icon: edit +icon: guide --- - [MIE 2023](MIE2023.md) - [GMDS 2022 - DSF Process Plugin Tutorial v 0.9.x](GMDS2022-dev.md) diff --git a/docs/src/operations/get-started.md b/docs/src/operations/get-started.md index 44a0e5c90..c24763bdc 100644 --- a/docs/src/operations/get-started.md +++ b/docs/src/operations/get-started.md @@ -1,5 +1,6 @@ --- title: Get Started +icon: launch --- <meta http-equiv="refresh" content="0;url=./v1/latest/"> diff --git a/docs/src/operations/old-versions.md b/docs/src/operations/old-versions.md index 19b6d05fd..060fc567c 100644 --- a/docs/src/operations/old-versions.md +++ b/docs/src/operations/old-versions.md @@ -1,5 +1,6 @@ --- title: Old Versions +icon: note --- ## DSF v1 diff --git a/docs/src/operations/process-plugin-deployment.md b/docs/src/operations/process-plugin-deployment.md index 77541362e..0747d59de 100644 --- a/docs/src/operations/process-plugin-deployment.md +++ b/docs/src/operations/process-plugin-deployment.md @@ -1,5 +1,6 @@ --- title: Process Plugin Deployment +icon: plugin --- <meta http-equiv="refresh" content="0;url=./v1/latest/maintain/install-plugins.html"> diff --git a/docs/src/posts/2025-05-15-my-first-post.md b/docs/src/posts/2025-04-23-spring-school-2025.md similarity index 88% rename from docs/src/posts/2025-05-15-my-first-post.md rename to docs/src/posts/2025-04-23-spring-school-2025.md index d3ebe3a3c..3d24dbebb 100644 --- a/docs/src/posts/2025-05-15-my-first-post.md +++ b/docs/src/posts/2025-04-23-spring-school-2025.md @@ -1,10 +1,11 @@ --- title: "Spring School 2025" -date: 2025-05-15 +date: 2025-04-23 type: "news" -excerpt: "" +excerpt: "From April 2nd to 4th, members of the DSF community gathered at Heilbronn University for the annual DSF Spring School 2025. The three-day event provided an in-depth look at the Data Sharing Framework (DSF) and its latest developments, featuring expert talks, hands-on sessions, and collaborative projects during a community-driven hackathon. With vibrant discussions and plenty of memorable moments, the event concluded on a high note. " tags: - - VuePress + - News + - Spring School - Blog --- diff --git a/docs/src/posts/2025-05-16-fhir.md b/docs/src/posts/2025-05-07-fhir-devdays-2025.md similarity index 98% rename from docs/src/posts/2025-05-16-fhir.md rename to docs/src/posts/2025-05-07-fhir-devdays-2025.md index 463b767e0..0bf6ef0fc 100644 --- a/docs/src/posts/2025-05-16-fhir.md +++ b/docs/src/posts/2025-05-07-fhir-devdays-2025.md @@ -1,12 +1,12 @@ --- title: "FHIR DevDays 2025" -date: 2025-05-16 +date: 2025-05-07 type: "news" excerpt: "Our DSF team will be at FHIR DevDays 2025 from June 3rd to 6th in Amsterdam! DevDays is the world’s leading FHIR event in the field of digital health. Join us at the event for engaging community talks by Maximilian Kurscheidt and Hauke Hund. We’ll be discussing the International Patient Summary Challenge 2025, as well as how we can foster research through Real-World Data Sharing and Process Orchestration using FHIR and BPMN. We look forward to seeing you there! If you'd like to connect with us during the event, feel free to arrange a meeting beforehand by emailing us at <strong>📧 dsf-gecko@hs-heilbronn.de</strong>." img: "![FHIR DevDays2025](/photos/news/Devdays-world.png)" tags: - FHIR - - Blog + - News --- # FHIR DevDays 2025 The DSF Team will be attending **FHIR DevDays 2025** from **June 3rd to 6th** in **Amsterdam**! The DevDays is the world’s leading event focused on HL7® FHIR® (Fast Healthcare Interoperability Resources). It’s dedicated to helping participants build expertise and accelerate the global implementation of FHIR standards. We’re excited to be speaking at the event and sharing insights from our work! diff --git a/docs/src/process-development/api-v1/create.md b/docs/src/process-development/api-v1/create.md index 40b34511e..236f1b39c 100644 --- a/docs/src/process-development/api-v1/create.md +++ b/docs/src/process-development/api-v1/create.md @@ -1,6 +1,6 @@ --- title: Create a new Process Plugin -icon: share +icon: plugin --- ## Create a new Process Plugin diff --git a/docs/src/process-development/api-v1/get-started.md b/docs/src/process-development/api-v1/get-started.md index 8e7ef725e..28c53ecb6 100644 --- a/docs/src/process-development/api-v1/get-started.md +++ b/docs/src/process-development/api-v1/get-started.md @@ -8,5 +8,4 @@ icon: edit ::: warning Work in progress This site is work in progress, please come back later. - -## Process Plugin Development Cycle \ No newline at end of file +::: diff --git a/docs/src/process-development/api-v1/tooling/empty-process-plugin.md b/docs/src/process-development/api-v1/tooling/empty-process-plugin.md index 98c9cdada..55e840fe1 100644 --- a/docs/src/process-development/api-v1/tooling/empty-process-plugin.md +++ b/docs/src/process-development/api-v1/tooling/empty-process-plugin.md @@ -3,4 +3,8 @@ title: empty Process Plugin icon: share --- -## empty Process Plugin \ No newline at end of file +## Empty Process Plugin + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/ide.md b/docs/src/process-development/api-v1/tooling/ide.md index 32ee03461..8fadad7af 100644 --- a/docs/src/process-development/api-v1/tooling/ide.md +++ b/docs/src/process-development/api-v1/tooling/ide.md @@ -3,4 +3,8 @@ title: DSF IDE icon: share --- -## DSF IDE \ No newline at end of file +## DSF IDE + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/maven.md b/docs/src/process-development/api-v1/tooling/maven.md index ca4fe93f3..07003ed56 100644 --- a/docs/src/process-development/api-v1/tooling/maven.md +++ b/docs/src/process-development/api-v1/tooling/maven.md @@ -3,4 +3,8 @@ title: Maven Central and Ressources icon: share --- -## Maven Central and Ressources \ No newline at end of file +## Maven Central and Ressources + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tooling/validator.md b/docs/src/process-development/api-v1/tooling/validator.md index a8e3b2c2c..fafa99266 100644 --- a/docs/src/process-development/api-v1/tooling/validator.md +++ b/docs/src/process-development/api-v1/tooling/validator.md @@ -8,4 +8,3 @@ icon: share This site is work in progress, please come back later. -## CLI and Maven Plugin \ No newline at end of file diff --git a/docs/src/process-development/api-v1/tutorials/README.md b/docs/src/process-development/api-v1/tutorials/README.md index e69de29bb..3624ca42e 100644 --- a/docs/src/process-development/api-v1/tutorials/README.md +++ b/docs/src/process-development/api-v1/tutorials/README.md @@ -0,0 +1,6 @@ +--- +title: Tutorials +icon: slides +--- + +## Process plugin tutorials \ No newline at end of file diff --git a/docs/src/process-development/api-v2/best-practices.md b/docs/src/process-development/api-v2/best-practices.md index 444d5192b..ca3982a5b 100644 --- a/docs/src/process-development/api-v2/best-practices.md +++ b/docs/src/process-development/api-v2/best-practices.md @@ -1,6 +1,6 @@ --- title: Best Practices -icon: share +icon: info --- ## Best Practices diff --git a/docs/src/process-development/api-v2/concept.md b/docs/src/process-development/api-v2/concept.md new file mode 100644 index 000000000..9c6431917 --- /dev/null +++ b/docs/src/process-development/api-v2/concept.md @@ -0,0 +1,10 @@ +--- +title: Concepts +icon: info +--- + +## API 2 Description + +::: warning Work in progress + +This site is work in progress, please come back later. \ No newline at end of file diff --git a/docs/src/process-development/api-v2/create.md b/docs/src/process-development/api-v2/create.md index 40b34511e..236f1b39c 100644 --- a/docs/src/process-development/api-v2/create.md +++ b/docs/src/process-development/api-v2/create.md @@ -1,6 +1,6 @@ --- title: Create a new Process Plugin -icon: share +icon: plugin --- ## Create a new Process Plugin diff --git a/docs/src/process-development/api-v2/description.md b/docs/src/process-development/api-v2/description.md deleted file mode 100644 index 55cbab213..000000000 --- a/docs/src/process-development/api-v2/description.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Description -icon: share ---- - -## API 2 Description - -::: warning Work in progress - -This site is work in progress, please come back later. - diff --git a/docs/src/process-development/api-v2/get-started.md b/docs/src/process-development/api-v2/get-started.md index 8baa5e96a..4703f7de0 100644 --- a/docs/src/process-development/api-v2/get-started.md +++ b/docs/src/process-development/api-v2/get-started.md @@ -9,4 +9,3 @@ icon: edit This site is work in progress, please come back later. -## Process Plugin Development Cycle \ No newline at end of file diff --git a/docs/src/process-development/api-v2/implementation.md b/docs/src/process-development/api-v2/implementation.md index a82a86d62..652c487f2 100644 --- a/docs/src/process-development/api-v2/implementation.md +++ b/docs/src/process-development/api-v2/implementation.md @@ -1,6 +1,6 @@ --- title: Implementation Guide -icon: share +icon: note --- ## Implementation Guide @@ -8,6 +8,3 @@ icon: share ::: warning Work in progress This site is work in progress, please come back later. - - -## FHIR \ No newline at end of file diff --git a/docs/src/process-development/api-v2/migration.md b/docs/src/process-development/api-v2/migration.md index 748d00e09..36f3d8cda 100644 --- a/docs/src/process-development/api-v2/migration.md +++ b/docs/src/process-development/api-v2/migration.md @@ -1,6 +1,6 @@ --- title: Migration Guide -icon: share +icon: update --- ## Migration Guide API 1 to API 2 @@ -9,5 +9,3 @@ icon: share This site is work in progress, please come back later. - -## Process Plugin Development Cycle \ No newline at end of file diff --git a/docs/src/process-development/api-v2/testing.md b/docs/src/process-development/api-v2/testing.md index 821b41347..cd0fcda0a 100644 --- a/docs/src/process-development/api-v2/testing.md +++ b/docs/src/process-development/api-v2/testing.md @@ -1,6 +1,6 @@ --- title: Process Plugin Testing -icon: share +icon: code --- ## Testing @@ -8,5 +8,3 @@ icon: share ::: warning Work in progress This site is work in progress, please come back later. - -Versionsabhängig \ No newline at end of file diff --git a/docs/src/process-development/api-v2/tutorials/README.md b/docs/src/process-development/api-v2/tutorials/README.md index e69de29bb..3624ca42e 100644 --- a/docs/src/process-development/api-v2/tutorials/README.md +++ b/docs/src/process-development/api-v2/tutorials/README.md @@ -0,0 +1,6 @@ +--- +title: Tutorials +icon: slides +--- + +## Process plugin tutorials \ No newline at end of file diff --git a/src/.vuepress/.temp/sass-palette/@sass-palette/hope-palette b/src/.vuepress/.temp/sass-palette/@sass-palette/hope-palette new file mode 100644 index 000000000..e69de29bb From d3fbf415af12d4212553fb8c8d3557bdbe8e9a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Wed, 28 May 2025 11:18:25 +0200 Subject: [PATCH 25/42] added api v1 process plugin development doc --- .../api-v1/bpmn/conditions.md | 8 + .../api-v1/bpmn/gateways.md | 16 + .../process-development/api-v1/bpmn/index.md | 15 + .../api-v1/bpmn/messaging.md | 24 + .../api-v1/bpmn/sequence-flow.md | 7 + .../api-v1/bpmn/service-tasks.md | 8 + .../timer-intermediate-catching-events.md | 8 + .../api-v1/bpmn/user-tasks.md | 8 + .../api-v1/dsf/bpmn-process-execution.md | 8 + .../api-v1/dsf/bpmn-process-variables.md | 10 + .../api-v1/dsf/draft-task-resources.md | 21 + .../api-v1/dsf/environment-variables.md | 10 + .../process-development/api-v1/dsf/index.md | 20 + .../api-v1/dsf/message-correlation.md | 10 + .../api-v1/dsf/message-delegates.md | 15 + .../api-v1/dsf/organization-identifiers.md | 10 + .../api-v1/dsf/process-plugin-api.md | 32 + .../api-v1/dsf/process-plugin-definition.md | 16 + .../api-v1/dsf/read-access-tag.md | 22 + .../api-v1/dsf/requester-and-recipient.md | 250 ++++++ .../api-v1/dsf/service-delegates.md | 12 + .../dsf/spring-framework-integration.md | 14 + .../api-v1/dsf/versions-placeholders-urls.md | 38 + .../api-v1/fhir/activitydefinition.md | 23 + .../api-v1/fhir/codesystem.md | 12 + .../process-development/api-v1/fhir/index.md | 13 + .../process-development/api-v1/fhir/task.md | 19 + .../api-v1/fhir/valueset.md | 10 + .../accessing-bpmn-process-variables.md | 10 + ...cessing-task-resources-during-execution.md | 12 + ...-task-input-parameters-to-task-profiles.md | 210 +++++ .../guides/configuring-read-access-tags.md | 415 ++++++++++ .../guides/creating-activity-definitions.md | 750 ++++++++++++++++++ .../creating-codesystems-for-dsf-processes.md | 42 + ...ng-task-resources-based-on-a-definition.md | 231 ++++++ .../creating-valuesets-for-dsf-processes.md | 63 ++ .../api-v1/guides/index.md | 17 + ...-incoming-messages-and-missing-messages.md | 18 + .../setting-targets-for-message-events.md | 14 + .../starting-a-process-via-task-resources.md | 43 + .../api-v1/guides/user-tasks-in-the-dsf.md | 57 ++ docs/src/process-development/api-v1/index.md | 47 ++ 42 files changed, 2588 insertions(+) create mode 100644 docs/src/process-development/api-v1/bpmn/conditions.md create mode 100644 docs/src/process-development/api-v1/bpmn/gateways.md create mode 100644 docs/src/process-development/api-v1/bpmn/index.md create mode 100644 docs/src/process-development/api-v1/bpmn/messaging.md create mode 100644 docs/src/process-development/api-v1/bpmn/sequence-flow.md create mode 100644 docs/src/process-development/api-v1/bpmn/service-tasks.md create mode 100644 docs/src/process-development/api-v1/bpmn/timer-intermediate-catching-events.md create mode 100644 docs/src/process-development/api-v1/bpmn/user-tasks.md create mode 100644 docs/src/process-development/api-v1/dsf/bpmn-process-execution.md create mode 100644 docs/src/process-development/api-v1/dsf/bpmn-process-variables.md create mode 100644 docs/src/process-development/api-v1/dsf/draft-task-resources.md create mode 100644 docs/src/process-development/api-v1/dsf/environment-variables.md create mode 100644 docs/src/process-development/api-v1/dsf/index.md create mode 100644 docs/src/process-development/api-v1/dsf/message-correlation.md create mode 100644 docs/src/process-development/api-v1/dsf/message-delegates.md create mode 100644 docs/src/process-development/api-v1/dsf/organization-identifiers.md create mode 100644 docs/src/process-development/api-v1/dsf/process-plugin-api.md create mode 100644 docs/src/process-development/api-v1/dsf/process-plugin-definition.md create mode 100644 docs/src/process-development/api-v1/dsf/read-access-tag.md create mode 100644 docs/src/process-development/api-v1/dsf/requester-and-recipient.md create mode 100644 docs/src/process-development/api-v1/dsf/service-delegates.md create mode 100644 docs/src/process-development/api-v1/dsf/spring-framework-integration.md create mode 100644 docs/src/process-development/api-v1/dsf/versions-placeholders-urls.md create mode 100644 docs/src/process-development/api-v1/fhir/activitydefinition.md create mode 100644 docs/src/process-development/api-v1/fhir/codesystem.md create mode 100644 docs/src/process-development/api-v1/fhir/index.md create mode 100644 docs/src/process-development/api-v1/fhir/task.md create mode 100644 docs/src/process-development/api-v1/fhir/valueset.md create mode 100644 docs/src/process-development/api-v1/guides/accessing-bpmn-process-variables.md create mode 100644 docs/src/process-development/api-v1/guides/accessing-task-resources-during-execution.md create mode 100644 docs/src/process-development/api-v1/guides/adding-task-input-parameters-to-task-profiles.md create mode 100644 docs/src/process-development/api-v1/guides/configuring-read-access-tags.md create mode 100644 docs/src/process-development/api-v1/guides/creating-activity-definitions.md create mode 100644 docs/src/process-development/api-v1/guides/creating-codesystems-for-dsf-processes.md create mode 100644 docs/src/process-development/api-v1/guides/creating-task-resources-based-on-a-definition.md create mode 100644 docs/src/process-development/api-v1/guides/creating-valuesets-for-dsf-processes.md create mode 100644 docs/src/process-development/api-v1/guides/index.md create mode 100644 docs/src/process-development/api-v1/guides/managing-mutiple-incoming-messages-and-missing-messages.md create mode 100644 docs/src/process-development/api-v1/guides/setting-targets-for-message-events.md create mode 100644 docs/src/process-development/api-v1/guides/starting-a-process-via-task-resources.md create mode 100644 docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md create mode 100644 docs/src/process-development/api-v1/index.md diff --git a/docs/src/process-development/api-v1/bpmn/conditions.md b/docs/src/process-development/api-v1/bpmn/conditions.md new file mode 100644 index 000000000..41447df07 --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/conditions.md @@ -0,0 +1,8 @@ +--- +title: Conditions +icon: creative +--- + +### Conditions + +[Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/gateways.md b/docs/src/process-development/api-v1/bpmn/gateways.md new file mode 100644 index 000000000..630b26ae0 --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/gateways.md @@ -0,0 +1,16 @@ +--- +title: Gateways +icon: creative +--- + +### Gateways + +[Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](sequence-flow.md). Different types of gateways are useful for different scenarios. + +#### Exclusive Gateways + +[Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence flow exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](sequence-flow.md) by selecting a [Sequence Flow](sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](conditions.md). + +#### Event-based Gateway + +The [Event-based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/index.md b/docs/src/process-development/api-v1/bpmn/index.md new file mode 100644 index 000000000..d74ae074d --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/index.md @@ -0,0 +1,15 @@ +--- +title: BPMN +icon: creative +--- + +## Introduction +The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. + +## Details +- [Conditions](conditions.md) +- [Gateways](gateways.md) +- [Messaging](messaging.md) +- [Sequence Flow](sequence-flow.md) +- [Service Tasks](service-tasks.md) +- [Timer Intermediate Catching Events](timer-intermediate-catching-events.md) \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/messaging.md b/docs/src/process-development/api-v1/bpmn/messaging.md new file mode 100644 index 000000000..97d05703b --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/messaging.md @@ -0,0 +1,24 @@ +--- +title: Messaging +icon: creative +--- + + +### Messaging + +In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. + +![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/message_flow.svg) + +#### Message Start Event + +[Message Start Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) at the beginning of all of your BPMN models. + +#### Message Intermediate Throwing Event +[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) are used to send messages during process execution. + +#### Message Intermediate Catching Event +[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). Use them whenever you expect to receive a message from another process or organization during execution. + +#### Message End Event +The [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) will stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/sequence-flow.md b/docs/src/process-development/api-v1/bpmn/sequence-flow.md new file mode 100644 index 000000000..3650cc635 --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/sequence-flow.md @@ -0,0 +1,7 @@ +--- +title: Sequence Flow +icon: creative +--- + +### Sequence Flow +BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. diff --git a/docs/src/process-development/api-v1/bpmn/service-tasks.md b/docs/src/process-development/api-v1/bpmn/service-tasks.md new file mode 100644 index 000000000..ebe8ad3c9 --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/service-tasks.md @@ -0,0 +1,8 @@ +--- +title: Service Tasks +icon: creative +--- + +### Service Tasks + +One of the most common types of BPMN Tasks used for modeling DSF processes is the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/). They are different from regular BPMN Tasks in that they offer the ability to link an implementation to the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/) which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages this engine to execute your BPMN processes. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/timer-intermediate-catching-events.md b/docs/src/process-development/api-v1/bpmn/timer-intermediate-catching-events.md new file mode 100644 index 000000000..49ab4a8fc --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/timer-intermediate-catching-events.md @@ -0,0 +1,8 @@ +--- +title: Timer Intermediate Catching Events +icon: creative +--- + +### Timer Intermediate Catching Events + +A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/bpmn/user-tasks.md b/docs/src/process-development/api-v1/bpmn/user-tasks.md new file mode 100644 index 000000000..8dda98d17 --- /dev/null +++ b/docs/src/process-development/api-v1/bpmn/user-tasks.md @@ -0,0 +1,8 @@ +--- +title: User Tasks +icon: creative +--- + +### User Tasks + +User Tasks define a process step that requires some kind of human interaction. Usually this is done by providing some kind of form the user can fill out. The Camunda Modeler allows to configure these forms as either a propriatary format called [Camunda Forms](https://docs.camunda.io/docs/guides/utilizing-forms/) or custom forms called `Embedded or External Task Forms`. The DSF uses such `External Task Forms` in the form of [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) and [Questionnaire Response](https://www.hl7.org/fhir/R4/questionnaireresponse.html) resources. This mechanism is further expanded upon in [User Tasks in the DSF](../guides/user-tasks-in-the-dsf.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/bpmn-process-execution.md b/docs/src/process-development/api-v1/dsf/bpmn-process-execution.md new file mode 100644 index 000000000..f711532c9 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/bpmn-process-execution.md @@ -0,0 +1,8 @@ +--- +title: BPMN Process Execution +icon: creative +--- + +### BPMN Process Execution + +The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.21/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](service-delegates.md) / [Message](message-delegates.md) Delegates like `execute` or `getAdditionalInputParameters` through the `variables` parameter. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/bpmn-process-variables.md b/docs/src/process-development/api-v1/dsf/bpmn-process-variables.md new file mode 100644 index 000000000..6170e1b1e --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/bpmn-process-variables.md @@ -0,0 +1,10 @@ +--- +title: BPMN Process Variables +icon: creative +--- + +### BPMN Process Variables + +BPMN process variables hold additional information which has to be available during BPMN process execution. Variables can be directly related to BPMN elements like the boolean value for [Conditions](../bpmn/conditions.md), but do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. They are accessible during the entirety of the execution to all [Service](service-delegates.md) / [Message](message-delegates.md) Delegates. + +You can learn how to access to the BPMN process variables [here](../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/draft-task-resources.md b/docs/src/process-development/api-v1/dsf/draft-task-resources.md new file mode 100644 index 000000000..c1bcaa28c --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/draft-task-resources.md @@ -0,0 +1,21 @@ +--- +title: Draft Task Resources +icon: creative +--- + +### Draft Task Resources + +[Task](../fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. Compared to regular [Task](../fhir/task.md) resources used to start BPMN processes, this type of [Task](../fhir/task.md) resource requires the status `draft` instead the usual `requested`. It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. Additionally, it requires setting the `Task.identifier` element. It should look something like this: + +```xml +<identifier> + <system value="http://dsf.dev/sid/task-identifier" /> + <value value="http://dsf.dev/bpe/Process/processKey/#{version}/task-name" /> +</identifier> +``` +`processKey` should be the same one used in [URLs](versions-placeholders-urls.md#urls). +`task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. + +For a complete example you can take a look at the Draft Task Resource in one of the solution branches and compare it to the one needed for cURL. The [Task](../fhir/task.md) resource created for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. + +You might also want to check out [this guide](../guides/creating-task-resources-based-on-a-definition.md) if you do not know how to create [Task](../fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/environment-variables.md b/docs/src/process-development/api-v1/dsf/environment-variables.md new file mode 100644 index 000000000..fcea6697c --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/environment-variables.md @@ -0,0 +1,10 @@ +--- +title: Environment Variables +icon: creative +--- + +### Environment Variables + +Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](bpmn-process-execution.md). They are the same for all running process instances. They can be defined by adding a member variable with the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds to an underscore in the equivalent environment variable. Environment variables are always written upper-case. The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. + +The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. You can take a look at the `pom.xml` for the `tutorial-process` submodule [here](https://github.com/datasharingframework/dsf-process-tutorial/blob/main/tutorial-process/pom.xml) to see how you can add it to your own project. Keep in mind to point the `<workingPackage>` field to the package you want documentation for. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/index.md b/docs/src/process-development/api-v1/dsf/index.md new file mode 100644 index 000000000..f70d7104e --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/index.md @@ -0,0 +1,20 @@ +--- +title: DSF +icon: creative +--- + +## Details +- [BPMN Process Execution](bpmn-process-execution.md) +- [BPMN Process Variables](bpmn-process-variables.md) +- [Draft Task Resources](draft-task-resources.md) +- [Environment Variables](environment-variables.md) +- [Message Correlation](message-correlation.md) +- [Message Delegates](message-delegates.md) +- [Organization Identifiers](organization-identifiers.md) +- [Process Plugin API](process-plugin-api.md) +- [Process Plugin Definition](process-plugin-definition.md) +- [Read Access Tag](read-access-tag.md) +- [Requester and Recipient](requester-and-recipient.md) +- [Service Delegates](service-delegates.md) +- [Spring Framework Integration](spring-framework-integration.md) +- [Versions, Placeholders and URLs](versions-placeholders-urls.md) \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/message-correlation.md b/docs/src/process-development/api-v1/dsf/message-correlation.md new file mode 100644 index 000000000..23b18e3e3 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/message-correlation.md @@ -0,0 +1,10 @@ +--- +title: Message Correlation +icon: creative +--- + +### Message Correlation + +In order for messages to be able to be sent back and forth between organizations with potentially multiple of the same process plugin instances running at the same time and still arriving at the correct process instance, we need some mechanism to map messages to their rightful process instance. This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. + +It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. To solve this issue, [Task](../fhir/task.md) resources also come with an [Input Parameter](../fhir/task.md#task-input-parameters) called `correlation-key`. This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/message-delegates.md b/docs/src/process-development/api-v1/dsf/message-delegates.md new file mode 100644 index 000000000..61a1a06f1 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/message-delegates.md @@ -0,0 +1,15 @@ +--- +title: Message Delegates +icon: creative +--- + +### Message Delegates + +Message Delegates are the Java representation of the [Message Events](../bpmn/messaging.md) in your BPMN model. You link a Message Delegate to a certain [Message Event](../bpmn/messaging.md) by selecting the Message Event in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` + +You will only need Message Delegates for [Message Send Events](../bpmn/messaging.md). Incoming messages will be resolved to the correct [BPMN process execution](bpmn-process-execution.md) automatically using [Message Correlation](message-correlation.md) and the message inputs will be added to that execution's [process variables](bpmn-process-variables.md). + +To make a Message Delegate for [Message Send Events](../bpmn/messaging.md), your Java class needs to extend `AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting the `doExecute` method like with [Service Delegates](service-delegates.md). Instead, you most likely want to aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the `getAdditionalInputParamters` method. The DSF translates BPMN messages into FHIR [Task](../fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../fhir/task.md#task-input-parameters), hence the name of the method. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). diff --git a/docs/src/process-development/api-v1/dsf/organization-identifiers.md b/docs/src/process-development/api-v1/dsf/organization-identifiers.md new file mode 100644 index 000000000..70d143150 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/organization-identifiers.md @@ -0,0 +1,10 @@ +--- +title: Organization Identifiers +icon: creative +--- + +### Organization Identifiers +DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server instance running under `domain`. The results will also include the `organization identifier` of each organization. + +#### Organization Identifiers in Task Resources +[Task](../fhir/task.md) resources require you to reference an organization via its identifier as the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements depend on the [ActivityDefinition](../fhir/activitydefinition.md) the [Task](../fhir/task.md) resource should conform to. As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements for [Task](../fhir/task.md) resources which initially start processes. All other cases depend on the context of the message being sent during process execution. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/process-plugin-api.md b/docs/src/process-development/api-v1/dsf/process-plugin-api.md new file mode 100644 index 000000000..5d1381a5a --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/process-plugin-api.md @@ -0,0 +1,32 @@ +--- +title: Process Plugin API +icon: creative +--- + +### Process Plugin API v1 Maven Module + +The [DSF Process Plugin API module](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. This includes for example the `Variables` class, which provides access to the [BPMN process variables](bpmn-process-variables.md). + +Maven Dependency: + +```xml +<dependencies> + <dependency> + <groupId>dev.dsf</groupId> + <artifactId>dsf-bpe-process-api-v1</artifactId> + <version>${dsf.version}</version> + <scope>provided</scope> + </dependency> +</dependencies> +``` + +#### Process Plugin Api +When creating [Service Delegates](service-delegates.md) or [Message Delegates](message-delegates.md) you wil notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. +This API instance provides a variety of utility classes: +- `ProxyConfig`**:** forward proxy configuration +- `EndpointProvider`**:** access to Endpoint resources +- `FhirContext`**:** HAPI FHIR Context for parsing/serializing +- `FhirWebserviceClientProvider`**:** Webservice client to access DSF FHIR server +- `MailService`**:** for sending automatic E-Mails (if configured) +- `OrganizationProvider`**:** access to Organization resources +- `Variables`**:** access to BPMN execution variables \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/process-plugin-definition.md b/docs/src/process-development/api-v1/dsf/process-plugin-definition.md new file mode 100644 index 000000000..a13bdbe26 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/process-plugin-definition.md @@ -0,0 +1,16 @@ +--- +title: Process Plugin Definition +icon: creative +--- + +### Process Plugin Definition + +In order for the DSF BPE server to load your plugin you need to provide it with the following information: +* A plugin [version](versions-placeholders-urls.md#version-pattern) +* A release date +* A plugin name +* The BPMN model files +* The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../fhir/task.md) resources needed for messages specific to that BPMN model) +* The Class holding your [Spring Framework Configuration](spring-framework-integration.md) + +You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. The DSF BPE server then searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/read-access-tag.md b/docs/src/process-development/api-v1/dsf/read-access-tag.md new file mode 100644 index 000000000..47a02b2c1 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/read-access-tag.md @@ -0,0 +1,22 @@ +--- +title: Read Access Tag +icon: creative +--- + +### Read Access Tag + +Axiomatically, nobody is allowed to write FHIR resources (except [Task](../fhir/task.md)) to the DSF FHIR server unless it is your own organization. By default, the same applies to reading FHIR resources (again except [Task](../fhir/task.md)). But since the DSF is often used to offer medical data in form of FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the exception of [Task](../fhir/task.md) resources. We will explain the reason for this exception shortly. For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: + +```xml +<meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> +</meta> +``` +You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). + +The read access rules for [Task](../fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. + +It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../guides/configuring-read-access-tags.md). diff --git a/docs/src/process-development/api-v1/dsf/requester-and-recipient.md b/docs/src/process-development/api-v1/dsf/requester-and-recipient.md new file mode 100644 index 000000000..8407bb318 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/requester-and-recipient.md @@ -0,0 +1,250 @@ +--- +title: Requester and Recipient +icon: creative +--- + +### Requester and Recipient Elements + +Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). Use this collection as a reference point when creating your own [ActivityDefinitions](../fhir/activitydefinition.md). + +#### Requester +The `requester` element uses one of the following Codings: +```xml +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all-practitioner|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization-practitioner|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role-practitioner|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-all|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-organization|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-parent-organization-role|1.0.0" /> +``` + +##### Local All +```xml +<extension url="requester"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ALL" /> + </valueCoding> +</extension> +``` + +##### Local All Practitioner +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-practitioner"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ALL_PRACTITIONER" /> + </valueCoding> +</extension> +``` + +##### Local Organization +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ORGANIZATION" /> + </valueCoding> +</extension> +``` + +##### Local Organization Practitioner +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ORGANIZATION_PRACTITIONER" /> + </valueCoding> +</extension> +``` + +##### Local Parent Organization Role +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ROLE" /> + </valueCoding> +</extension> +``` + +##### Local Parent Organization Role Practitioner +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role-practitioner"> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ROLE_PRACTITIONER" /> + </valueCoding> +</extension> +``` + +##### Remote All +```xml +<extension url="requester"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="REMOTE_ALL" /> + </valueCoding> +</extension> +``` + +##### Remote Organization +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="REMOTE_ORGANIZATION" /> + </valueCoding> +</extension> +``` + +##### Remote Parent Organization Role +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="REMOTE_ROLE" /> + </valueCoding> +</extension> +``` + +#### Recipient +The `recipeint` element uses one of the following Codings: +```xml +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> +<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> +``` + +##### Local All +```xml +<extension url="recipient"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ALL" /> + </valueCoding> +</extension> +``` + +##### Local Organization +```xml +<extension url="recipient"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ORGANIZATION" /> + </valueCoding> +</extension> +``` + +##### Local Parent Organization Role +```xml +<extension url="recipient"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> <!-- example, replace appropriately --> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + <code value="LOCAL_ROLE" /> + </valueCoding> +</extension> +``` diff --git a/docs/src/process-development/api-v1/dsf/service-delegates.md b/docs/src/process-development/api-v1/dsf/service-delegates.md new file mode 100644 index 000000000..278b51e34 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/service-delegates.md @@ -0,0 +1,12 @@ +--- +title: Service Delegates +icon: creative +--- + +### Service Delegates + +Service Delegates are the Java representation of the [Service Tasks](../bpmn/service-tasks.md) in your BPMN model. You link a Service Delegate to a certain [Service Task](../bpmn/service-tasks.md) by selecting the [Service Task](../bpmn/service-tasks.md) in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: +``` +org.package.myClass +``` +All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](bpmn-process-execution.md) arrives at the [Service Task](../bpmn/service-tasks.md) your Service Delegate is linked to. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/spring-framework-integration.md b/docs/src/process-development/api-v1/dsf/spring-framework-integration.md new file mode 100644 index 000000000..55f96f342 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/spring-framework-integration.md @@ -0,0 +1,14 @@ +--- +title: Spring Framework Integration +icon: creative +--- + +### Spring Framework Integration + +Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also have to provide some Spring functionality. When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): +- `AbstractTaskMessageSend` +- `AbstractServiceDelegate` +- `DefaultUserTaskListener` +- `ProcessPluginDeploymentStateListener` + +A [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) located in `spring/config` is expected to provide the Spring Beans. For this tutorial, the `TutorialConfig` class will take this role. If you are unfamiliar with the Spring Framework, you might want to check out the chapter [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) of the Spring Framework documentation, specifically the topics [Using the @Bean Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/bean-annotation.html) and [Using the @Configuration Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/dsf/versions-placeholders-urls.md b/docs/src/process-development/api-v1/dsf/versions-placeholders-urls.md new file mode 100644 index 000000000..0381ec629 --- /dev/null +++ b/docs/src/process-development/api-v1/dsf/versions-placeholders-urls.md @@ -0,0 +1,38 @@ +--- +title: Versions, Placeholders and URLs +icon: creative +--- + +### Versions, Placeholders and URLs + +#### Version Pattern + +Process plugin versions have to obey the pattern: +``` +\d+\.\d+\.\d+\.\d+ Example: 1.2.3.4 +``` + +The first two numbers (`1.2`) are used in FHIR resources and signal changes which break compatibility with previous process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`3.4`) signal changes which do not break compatibility with previous process versions. Specifically, the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. + +#### Placeholders + +To avoid specifying the version and release date in multiple files, the placeholders `#{version}` and `#{date}` can be used within FHIR resources and BPMN models. They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. There is also a placeholder for the organization the DSF instance is running in: `#{organization}`, typically use in [Draft Task Resources](draft-task-resources.md). + +#### URLs + +BPMN models have an ID call process definition key. The BPMN process definition key needs to be specified following the pattern: +``` +^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey +``` +In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](#placeholders) for this as well. The DSF will also reference this process in URL form in FHIR resources: +``` +http://domain.org/bpe/Process/processKey|1.2 +``` + +As you can see, the version in the URL ``|1.2`` only uses the resource version and omits the code base version. As mentioned in [Version Pattern](#version-pattern), this means that only changes to the first two version numbers are significant to signal compatibility when communicating with other process plugin instances. The process definition key and URL are also related to each other. The DSF will try to match BPMN models to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey the pattern above. + +You will use the above URL as your instantiatesCanonical value for [Task](../fhir/task.md) profile definitions as well as references to [Task](../fhir/task.md) profiles in other resources. You will also use it as the URL value for your [ActivityDefinitions](../fhir/activitydefinition.md). In this case though, you have to split up the URL into two parts. You will separate the version (``|1.2``) from the URL and use it as a value for the `ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` [placeholder](#placeholders) here instead. Going by the example from above, you will be left with a URL that looks like this: +``` +http://domain.org/bpe/Process/processKey +``` +This will be the value for your `ActivityDefinition.url` element with `#{version}` as the value for your `ActivityDefinition.version` element. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/fhir/activitydefinition.md b/docs/src/process-development/api-v1/fhir/activitydefinition.md new file mode 100644 index 000000000..5cd27ca91 --- /dev/null +++ b/docs/src/process-development/api-v1/fhir/activitydefinition.md @@ -0,0 +1,23 @@ +--- +title: ActivityDefinition +icon: creative +--- + +### ActivityDefinition + +[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. + + +The most important elements in ActivityDefinitions are: +- `message-name` +- `task-profile` +- `requester` +- `recipient` + +The `message-name` element contains the name of the [BPMN message start event](../bpmn/messaging.md#message-start-event) or [BPMN message intermediate catching event](../bpmn/messaging.md#message-intermediate-catching-event) which expects a [Task](task.md) resource complying to the profile defined by `task-profile`. + +The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. + +You will have to create your own [ActivityDefinitions](activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../guides/creating-activity-definitions.md). + +You can also find examples for all possible `requester` and `recipient` elements [here](../dsf/requester-and-recipient.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/fhir/codesystem.md b/docs/src/process-development/api-v1/fhir/codesystem.md new file mode 100644 index 000000000..e40a365f2 --- /dev/null +++ b/docs/src/process-development/api-v1/fhir/codesystem.md @@ -0,0 +1,12 @@ +--- +title: CodeSystem +icon: creative +--- + +### CodeSystem + +[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a [ValueSet](valueset.md). + +Plugin development for the DSF requires the use of [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) in two major ways: +1. Using existing [DSF CodeSystems](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem) in other FHIR resources like the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). +2. Creating your own CodeSystem to add additional [Input Parameters](task.md#task-input-parameters) to your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/fhir/index.md b/docs/src/process-development/api-v1/fhir/index.md new file mode 100644 index 000000000..47e4a6cda --- /dev/null +++ b/docs/src/process-development/api-v1/fhir/index.md @@ -0,0 +1,13 @@ +--- +title: FHIR +icon: creative +--- + +## Introduction +The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](activitydefinition.md), [CodeSystems](codesystem.md), [Tasks](task.md) and [ValueSets](valueset.md). There is also a catalog of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). + +## Details +- [ActivityDefinition](activitydefinition.md) +- [CodeSystem](codesystem.md) +- [Task](task.md) +- [ValueSet](valueset.md) \ No newline at end of file diff --git a/docs/src/process-development/api-v1/fhir/task.md b/docs/src/process-development/api-v1/fhir/task.md new file mode 100644 index 000000000..a647fc46c --- /dev/null +++ b/docs/src/process-development/api-v1/fhir/task.md @@ -0,0 +1,19 @@ +--- +title: Task +icon: creative +--- + +### Task + +The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource based on parameters you set in the BPMN model and during execution. It will then automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). This profile includes a splicing for `Task.input` with three additional [Input Parameters](task.md#task-input-parameters): +- `message-name` +- `business-key` +- `correlation-key` + +When creating your own plugin, you will want to create your own profiles based on the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). + +#### Task Input Parameters + +Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](codesystem.md) and including it in a [ValueSet](valueset.md) to be able to use it in the Task resource. + +If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/fhir/valueset.md b/docs/src/process-development/api-v1/fhir/valueset.md new file mode 100644 index 000000000..6be03a3fb --- /dev/null +++ b/docs/src/process-development/api-v1/fhir/valueset.md @@ -0,0 +1,10 @@ +--- +title: ValueSet +icon: creative +--- + +### ValueSet + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](codesystem.md) to coded elements like `code`, `Coding` or `CodeableConcept`. + +[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](codesystem.md) in your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/accessing-bpmn-process-variables.md b/docs/src/process-development/api-v1/guides/accessing-bpmn-process-variables.md new file mode 100644 index 000000000..f03bee5d0 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/accessing-bpmn-process-variables.md @@ -0,0 +1,10 @@ +--- +title: Accessing BPMN Process Variables +icon: creative +--- + +### Accessing BPMN Process Variables + +After creating a [Service Delegate](../dsf/service-delegates.md) or [Message Delegate](../dsf/message-delegates.md), you might want to retrieve data from or store data in the [BPMN process variables](../dsf/bpmn-process-variables.md). You can achieve this either through the [BPMN process execution](../dsf/bpmn-process-execution.md) or via the `Variables` class. *It is very much recommended to use the latter method*. + +The `Variables` class provides lots of utility methods to read or write certain types of [BPMN process variables](../dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../dsf/bpmn-process-execution.md) to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/process-development/api-v1/guides/accessing-task-resources-during-execution.md b/docs/src/process-development/api-v1/guides/accessing-task-resources-during-execution.md new file mode 100644 index 000000000..196e16381 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/accessing-task-resources-during-execution.md @@ -0,0 +1,12 @@ +--- +title: Accessing Task Resources During Execution +icon: creative +--- + +### Accessing Task Resources During Execution + +If you want access to the [Task](../fhir/task.md) resources in your [Service](../dsf/service-delegates.md) / [Message](../dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../fhir/task.md) resources. The most commonly used ones are the start [Task](../fhir/task.md), referring to the [Task](../fhir/task.md) / [Message Start Event](../bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../fhir/task.md), referring to most recently received [Task](../fhir/task.md) / Message. +In principle, this is sufficient to access all information in a [Task](../fhir/task.md) resource, since you have the [Task](../fhir/task.md) resource's Java object, but very cumbersome. +Instead of navigating the [Task](../fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../dsf/process-plugin-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../fhir/task.md) resources. +The most common use case for this is retrieving data from a [Task's](../fhir/task.md) [Input Parameter](../fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../fhir/task.md#task-input-parameters) for a [Message Delegate's](../dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../fhir/codesystem.md) and Code to any [Input Parameter](../fhir/task.md#task-input-parameters) of the provided [Task](../fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. +To create new [Input Parameters](../fhir/task.md#task-input-parameters) to attach to a [Task](../fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/process-development/api-v1/guides/adding-task-input-parameters-to-task-profiles.md new file mode 100644 index 000000000..7a625d5f4 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/adding-task-input-parameters-to-task-profiles.md @@ -0,0 +1,210 @@ +--- +title: Adding Task Input Parameters to Task Profiles +icon: creative +--- + +### Adding Task Input Parameters to Task Profiles + +When adding a new [Input Parameter](../fhir/task.md#task-input-parameters) to a [Task](../fhir/task.md) profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists like `Task.input` e.g. by only allowing the elements to be of certain types. +For example, you might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). +This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource context. Our goal will be to add a new [Input Parameter](../fhir/task.md#task-input-parameters) of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. + +Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). +The slicing for `Task.input` is defined in this part of the `baseDefinition`: +```xml +<element id="Task.input"> + <extension url="http://hl7.org/fhir/StructureDefinition/structuredefinition-explicit-type-name"> + <valueString value="Parameter" /> + </extension> + <path value="Task.input" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="type.coding.system" /> + </discriminator> + <discriminator> + <type value="value" /> + <path value="type.coding.code" /> + </discriminator> + <rules value="openAtEnd" /> + </slicing> + <min value="1" /> +</element> +``` +*The resource can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml)* + +We will only need to take a look at the `discrimitator` tag for now. Discriminators define the elements a FHIR processor needs to distinguish slices by. In our case, a processor would look at the values for `type.coding.system` and `type.coding.code` to determine which slice this element belongs to. The discriminator type `value` implies that `type.coding.system` and `type.coding.code` have to be present in all slices and need to have a fixed value. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). + +Let us revisit `task-start-dic-process.xml` and start adding a slice called `example-input` to it: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Task.input:example-input"> + <path value="Task.input" /> + <sliceName value="example-input" /> + <min value="1" /> + <max value="1" /> + </element> + </differential> +</StructureDefinition> +``` +*Irrelevant elements for this guide are hidden by ... placeholders.* + +We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). + +Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` is a `CodeableConcept` which uses codings from a [ValueSet](../fhir/valueset.md), the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Task.input:example-input"> + <path value="Task.input" /> + <sliceName value="example-input" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Task.input:example-input.type"> + <path value="Task.input.type" /> + <binding> + <strength value="required"/> + <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> + </binding> + </element> + </differential> +</StructureDefinition> +``` +As you can see, we referenced a [ValueSet](../fhir/valueset.md) in this binding. When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../fhir/valueset.md) resource or create a new one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). + +Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires `Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Task.input:example-input"> + <path value="Task.input" /> + <sliceName value="example-input" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Task.input:example-input.type"> + <path value="Task.input.type" /> + <binding> + <strength value="required"/> + <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> + </binding> + </element> + <element id="Task.input:example-input.type.coding"> + <path value="Task.input.type.coding"/> + <min value="1" /> + </element> + </differential> +</StructureDefinition> +``` + +In the beginning we mentioned how `Task.input.type.coding.system` and `Task.input.type.coding.code` have to use fixed values. Here is how we accomplish this: + +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Task.input:example-input"> + <path value="Task.input" /> + <sliceName value="example-input" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Task.input:example-input.type"> + <path value="Task.input.type" /> + <binding> + <strength value="required"/> + <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> + </binding> + </element> + <element id="Task.input:example-input.type.coding"> + <path value="Task.input.type.coding"/> + <min value="1" /> + </element> + <element id="Task.input:example-input.type.coding.system"> + <path value="Task.input.type.coding.system"/> + <min value="1"/> + <fixedUri value="http://dsf.dev/fhir/CodeSystem/example"/> + </element> + <element id="Task.input:example-input.type.coding.code"> + <path value="Task.input.type.coding.code"/> + <min value="1"/> + <fixedCode value="example-input" /> + </element> + </differential> +</StructureDefinition> +``` +*Notice that we also made the two elements mandatory because they are required by the discriminator.* + +For the `type.coding.system` element we referenced a [CodeSystem](../fhir/codesystem.md). The `type.coding.code` element uses a code from this [CodeSystem](../fhir/codesystem.md) called `example-input`. This is the mechanism by which you actually "name" your [Input Parameter](../fhir/task.md#task-input-parameters). The `type.coding.code` value will identify your [Input Parameter](../fhir/task.md#task-input-parameters) when you use it in an actual [Task](../fhir/task.md#task-input-parameters) resource. Here is how this would look like: + +```xml +<Task xmlns="http://hl7.org/fhir"> + ... + <input> + <type> + <coding> + <system value="http://dsf.dev/fhir/CodeSystem/example"/> + <code value="example-input" /> + </coding> + </type> + ... + </input> +</Task> +``` + +When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../fhir/codesystem.md) resource or create a new one to reference. A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). + +`Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: + +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Task.input:example-input"> + <path value="Task.input" /> + <sliceName value="example-input" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Task.input:example-input.type"> + <path value="Task.input.type" /> + <binding> + <strength value="required"/> + <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> + </binding> + </element> + <element id="Task.input:example-input.type.coding"> + <path value="Task.input.type.coding"/> + <min value="1" /> + </element> + <element id="Task.input:example-input.type.coding.system"> + <path value="Task.input.type.coding.system"/> + <min value="1"/> + <fixedUri value="http://dsf.dev/fhir/CodeSystem/example"/> + </element> + <element id="Task.input:example-input.type.coding.code"> + <path value="Task.input.type.coding.code"/> + <min value="1"/> + <fixedCode value="example-input" /> + </element> + <element id="Task.input:example-input.value[x]"> + <path value="Task.input.value[x]"/> + <type> + <code value="integer"/> + </type> + </element> + </differential> +</StructureDefinition> +``` + +Now we have a new Input Parameter of type `example-input` which accepts any `integer` as its value. diff --git a/docs/src/process-development/api-v1/guides/configuring-read-access-tags.md b/docs/src/process-development/api-v1/guides/configuring-read-access-tags.md new file mode 100644 index 000000000..404f2286e --- /dev/null +++ b/docs/src/process-development/api-v1/guides/configuring-read-access-tags.md @@ -0,0 +1,415 @@ +--- +title: Configuring Read Access Tags +icon: creative +--- + +### Configuring Read Access Tags + +To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../dsf/read-access-tag.md) and choose one of the codes from it: +```xml +<CodeSystem xmlns="http://hl7.org/fhir"> + ... + <url value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + ... + <concept> + <code value="LOCAL"/> + <display value="Local"/> + <definition value="Read access for local users"/> + </concept> + <concept> + <code value="ORGANIZATION"/> + <display value="Organization"/> + <definition value="Read access for organization specified via extension http://dsf.dev/fhir/StructureDefinition/extension-read-access-organization"/> + </concept> + <concept> + <code value="ROLE"/> + <display value="Role"/> + <definition value="Read access for member organizations with role in consortium (parent organization) specified via extension http://dsf.dev/fhir/StructureDefinition/extension-read-access-consortium-role"/> + </concept> + <concept> + <code value="ALL"/> + <display value="All"/> + <definition value="Read access for remote and local users"/> + </concept> +</CodeSystem> +``` + +The codes `LOCAL` and `ALL` are trivial. Their [Read Access Tag](../dsf/read-access-tag.md) would look like this: +```xml +<meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ALL"/> <!-- or value="LOCAL" respectively--> + </tag> +</meta> +``` + +Let us try to configure a Read Access Tag whose code uses an extension. We will choose `ROLE` for this example. We start out the same way as before: +```xml +<meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +The `definition` element of the `ROLE` code references an extension called [dsf-extension-read-access-parent-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-read-access-parent-organization-role-1.0.0.xml). + +The most important part of it is the `differential` statement. It uses [element definitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to describe how we need to implement the extension: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + <element id="Extension.extension"> + <path value="Extension.extension" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="url" /> + </discriminator> + <rules value="open" /> + </slicing> + </element> + <element id="Extension.extension:parentOrganization"> + <path value="Extension.extension" /> + <sliceName value="parentOrganization" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:parentOrganization.url"> + <path value="Extension.extension.url" /> + <fixedUri value="parent-organization" /> + </element> + <element id="Extension.extension:parentOrganization.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Identifier" /> + </type> + </element> + <element id="Extension.extension:parentOrganization.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + <fixedUri value="http://dsf.dev/sid/organization-identifier" /> + </element> + <element id="Extension.extension:parentOrganization.value[x].value"> + <path value="Extension.extension.value[x].value" /> + <min value="1" /> + </element> + <element id="Extension.extension:organizationRole"> + <path value="Extension.extension" /> + <sliceName value="organizationRole" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:organizationRole.url"> + <path value="Extension.extension.url" /> + <fixedUri value="organization-role" /> + </element> + <element id="Extension.extension:organizationRole.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Coding" /> + </type> + </element> + <element id="Extension.extension:organizationRole.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + </element> + <element id="Extension.extension:organizationRole.value[x].code"> + <path value="Extension.extension.value[x].code" /> + <min value="1" /> + </element> + <element id="Extension.url"> + <path value="Extension.url" /> + <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role" /> + </element> + <element id="Extension.value[x]"> + <path value="Extension.value[x]" /> + <max value="0" /> + </element> + </differential> +</StructureDefinition> +``` + +All extensions for the [Read Access Tag](../dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through the extension's `context` element: +```xml +<context> + <type value="element" /> + <expression value="Coding" /> <!-- meta.tag is of type Coding--> +</context> +``` + +That is why the first element we are adding to `meta.tag` is an `extension` element: +```xml +<meta> + <tag> + <extenion> + + </extenion> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +We will now go through the `differential` statement one element at a time, starting at the top: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + <element id="Extension.extension"> + <path value="Extension.extension" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="url" /> + </discriminator> + <rules value="open" /> + </slicing> + </element> + ... + </differential> +</StructureDefinition> +``` + +It defines a [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for the `Extension.extension` element, meaning we are dealing with a nested extension. The `discriminator` element tells us that slices will be identified by the value of their `url` attribute. A `rules` element with value `open` means other types of slices may be added later on e.g. when creating a profile. We do not have to add any elements from here to the `meta.tag.extension` element. Next up is the first slice called `parentOrganization`: + +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:parentOrganization"> + <path value="Extension.extension" /> + <sliceName value="parentOrganization" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:parentOrganization.url"> + <path value="Extension.extension.url" /> + <fixedUri value="parent-organization" /> + </element> + <element id="Extension.extension:parentOrganization.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Identifier" /> + </type> + </element> + <element id="Extension.extension:parentOrganization.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + <fixedUri value="http://dsf.dev/sid/organization-identifier" /> + </element> + <element id="Extension.extension:parentOrganization.value[x].value"> + <path value="Extension.extension.value[x].value" /> + <min value="1" /> + </element> + ... + </differential> +</StructureDefinition> +``` + +The first element defines a slice called `parentOrganization` on the `Extension.extension` element with cardinality `1..1`. The second element defines the url attribute of the `parentOrganization` slice to be fixed to the value `parent-organization`. With this information we can add the next element to `meta.tag`. Since it is defined on `Extension.extension` we will add it to `meta.tag.extension.extension` like this: +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +After that, it defines `parentOrganization.value[x]` to occur at least once and have a type of `Identifier`. To turn this into an element to add to `meta.tag.extension.extension` we have to replace `[x]` with our code in `value[x].type`, which in this case is `Identifier`. It is important to note, that should the value in the code element be lowercase, you will have make it uppercase before replacement. In our case this means we will have a `meta.tag.extension.extension.valueIdentifier` element: +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + <valueIdentifier> + + </valueIdentifier> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +The last two elements define a `system` element with a fixed value and `value` element we can fill in on our own, since it does not have any constraints applied. Notice that the element definition still uses `value[x].system` and `value[x].value`. The replacement mentioned earlier does not happen in the element definition, but since `value[x]` is defined to have the type `Identifier` it is inferred that we mean to reference `Identifier.system` and `Identifier.value`. We will choose an arbitrary `Idenfier` value, but you should be using an actual organization identifier depending on who you want to allow read access to the resource. + +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +Next is the slice is called `organizationRole`: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:organizationRole"> + <path value="Extension.extension" /> + <sliceName value="organizationRole" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:organizationRole.url"> + <path value="Extension.extension.url" /> + <fixedUri value="organization-role" /> + </element> + <element id="Extension.extension:organizationRole.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Coding" /> + </type> + </element> + <element id="Extension.extension:organizationRole.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + </element> + <element id="Extension.extension:organizationRole.value[x].code"> + <path value="Extension.extension.value[x].code" /> + <min value="1" /> + </element> + ... + </differential> +</StructureDefinition> +``` + +Like with `parentOrganization`, we will add an extension element to `meta.tag.extension` with the fixed url value defined above: +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="organization-role"> + + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +Instead of `Identifier`, the `value[x]` element is now defined as a `Coding` type. This means we will add a `valueCoding` element to the extension: +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +A `Coding` has to belong to some [CodeSystem](../fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. For demonstration purposes, we will be using the `DIC` role: +```xml +<meta> + <tag> + <extension> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +Now we only have two elements left in the `differential` statement: + +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.url"> + <path value="Extension.url" /> + <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role" /> + </element> + <element id="Extension.value[x]"> + <path value="Extension.value[x]" /> + <max value="0" /> + </element> + </differential> +</StructureDefinition> +``` + +The `Extension.url` element tells us to add a url attribute to `meta.tag.extension`. The last element makes it so we must not add a `meta.tag.extension.value[x]` element. This leaves us with this final Read Access Tag: + +```xml +<meta> + <tag> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role"> + <extension url="parent-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="organization-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> + <code value="DIC"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ROLE"/> + </tag> +</meta> +``` + +You can follow the same method to configure the other types of Read Access Tags as well. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/creating-activity-definitions.md b/docs/src/process-development/api-v1/guides/creating-activity-definitions.md new file mode 100644 index 000000000..40a7cfb2e --- /dev/null +++ b/docs/src/process-development/api-v1/guides/creating-activity-definitions.md @@ -0,0 +1,750 @@ +--- +title: Creating ActivityDefinitions +icon: creative +--- + +### Creating ActivityDefinitions + +This guide will teach you how to create an ActivityDefinition based on the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile for your process plugin. +It is divided into steps for each of the main components of ActivityDefinitions: +1. Read Access Tag +2. Extension: process authorization +3. BPE Managed Elements +4. Regular Elements + +*Regular elements* are all elements not part of the first 3 main components. + +*We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* + +#### 1. Read Access Tag +Let us start out with an empty [ActivityDefinition](../fhir/activitydefinition.md): +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + +</ActivityDefinition> +``` + +The first element in DSF FHIR resources is always the [Read Access Tag](../dsf/read-access-tag.md). It describes who is allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the [Read Access Tag](../dsf/read-access-tag.md) in [this guide](../dsf/read-access-tag.md). In this case, we will allow read access to everyone: + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> +</ActivityDefinition> +``` + +#### 2. Extension: Process Authorization +This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../fhir/task.md) resources) for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../fhir/activitydefinition.md) for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. This includes the message starting your BPMN process initially. You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the value for the URL from the `Extension.url` element: +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + ... + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + + </extension> +</ActivityDefinition> +``` +*Elements not relevant to the current component are hidden with ... to increase readability.* + +The [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) for the `Extension.extension` element: + +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + <element id="Extension"> + <path value="Extension" /> + <min value="1" /> + </element> + <element id="Extension.extension"> + <path value="Extension.extension" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="url" /> + </discriminator> + <rules value="open" /> + </slicing> + </element> + ... + </differential> +</StructureDefinition> +``` + +The above states that whenever this extension is used in a profile, the profile needs to include this extension at least once (`<min value="1" />`). The [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension` tells us that elements of this [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) are identified by the value of their URL (`<discriminator>`), which is always the case for extensions, and that other extensions can be added to the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) (`<rules value="open" />`). Since there is a [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension`, we are dealing with a nested extension. + +After these initial element definitions come the elements relevant for your process plugin. The first one is the `message-name` slice: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:message-name"> + <path value="Extension.extension" /> + <sliceName value="message-name" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:message-name.url"> + <path value="Extension.extension.url" /> + <fixedUri value="message-name" /> + </element> + <element id="Extension.extension:message-name.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="string" /> + </type> + </element> + ... + </differential> +</StructureDefinition> +``` + +This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../fhir/activitydefinition.md). The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. This results in the following extension element we will add to our [ActivityDefinition](../fhir/activitydefinition.md): +```xml +<extension url="message-name"> + <valueString value="myMessage"/> +</extension> +``` + +For your use case, you have to replace `myMessage` with the name of the [BPMN message event](../bpmn/messaging.md) that is expecting this message. + +<details> +<summary>This is how your ActivityDefinition should look like so far</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + </extension> +</ActivityDefinition> +``` +</details> + +The next slice is called `task-profile`: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:task-profile"> + <path value="Extension.extension" /> + <sliceName value="task-profile" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:task-profile.url"> + <path value="Extension.extension.url" /> + <fixedUri value="task-profile" /> + </element> + <element id="Extension.extension:task-profile.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="canonical" /> + </type> + </element> + ... + </differential> +</StructureDefinition> +``` + +This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. Canonical values referring to [Task](../fhir/task.md) profiles in ActivityDefinitions have to conform to the rules outlined by the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls). From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../fhir/activitydefinition.md): +```xml +<extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> +</extension> +``` + +<details> +<summary>This is how your ActivityDefinition should look like so far</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + <extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> + </extension> + </extension> +</ActivityDefinition> +``` +</details> + +The next slice is `requester`: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:requester"> + <path value="Extension.extension" /> + <sliceName value="requester" /> + <min value="1" /> + </element> + <element id="Extension.extension:requester.url"> + <path value="Extension.extension.url" /> + <fixedUri value="requester" /> + </element> + <element id="Extension.extension:requester.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Coding" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all-practitioner|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization-practitioner|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role-practitioner|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-all|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-organization|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-parent-organization-role|1.0.0" /> + </type> + <binding> + <strength value="required" /> + <valueSet value="http://dsf.dev/fhir/ValueSet/process-authorization-requester|1.0.0" /> + </binding> + </element> + ... + </differential> +</StructureDefinition> +``` +Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../fhir/valueset.md). This is the responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. +Here is what they mean: +- `local-all`: All local requests will be allowed. Local requests are identified by matching the requester's certificate to a thumbprint which was internally marked by the DSF FHIR server as belonging to a local organization. +- `local-organization`: All local requests made from an organization with a specific `organization-identifier` will be allowed. +- `local-parent-organization-role`: All local requests made from an organization having a specific role inside a specific parent organization will be allowed. +- `remote` versions of the above rules work the same but the requester's certificate is instead required to match a thumbprint marked as a remote organization. +- `practitioner` suffixes all work the same. They include the same rules as their prefixes but now additionally require the requester to match a certain `practitioner-role`. A list of them + can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml). This allows + for more granularity when defining authorization rules within an organization and can be integrated into local user management via [OpenID Connect](https://dsf.dev/stable/maintain/fhir/access-control.html). + +As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. You can also find examples of all Codings from above [here](../dsf/requester-and-recipient.md). + +It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../fhir/activitydefinition.md). Let us start out by adding a `requester` element like we did for previous elements: + +```xml +<extension url="requester"> + <valueCoding> + + </valueCoding> +</extension> +``` + +We now have to look at the elements that are defined in one of the profiles to fill in the remaining elements since they are not defined by the `requester` extension. For demonstration purposes, we will choose the [dsf-coding-process-authorization-local-organization-practitioner](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-practitioner-1.0.0.xml) profile. Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4/datatypes.html#codesystem) are optional, we only have to look at the `differential` element from the profile we just selected: +<a id="coding-differential"></a> +```xml +<differential> + <element id="Coding.extension"> + <path value="Coding.extension" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="url" /> + </discriminator> + <rules value="open" /> + </slicing> + </element> + <element id="Coding.extension:organization-practitioner"> + <path value="Coding.extension" /> + <sliceName value="organization-practitioner" /> + <min value="1" /> + <max value="1" /> + <type> + <code value="Extension" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner|1.0.0" /> + </type> + </element> + <element id="Coding.system"> + <path value="Coding.system" /> + <min value="1" /> + <fixedUri value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> + </element> + <element id="Coding.code"> + <path value="Coding.code" /> + <min value="1" /> + <fixedCode value="LOCAL_ORGANIZATION_PRACTITIONER" /> + </element> +</differential> +``` +It defines an extension called `organization-practitioner` which is identified through its url attribute. Again, the extension is only referenced, its location is in a different file. You can find it [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-organization-practitioner-1.0.0.xml). Let us look at its `differential` element in the extension file to see how we need to populate the extension: +```xml +<differential> + <element id="Extension"> + <path value="Extension" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension"> + <path value="Extension.extension" /> + <slicing> + <discriminator> + <type value="value" /> + <path value="url" /> + </discriminator> + <rules value="open" /> + </slicing> + </element> + <element id="Extension.extension:organization"> + <path value="Extension.extension" /> + <sliceName value="organization" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:organization.url"> + <path value="Extension.extension.url" /> + <fixedUri value="organization" /> + </element> + <element id="Extension.extension:organization.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Identifier" /> + </type> + </element> + <element id="Extension.extension:organization.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + <fixedUri value="http://dsf.dev/sid/organization-identifier" /> + </element> + <element id="Extension.extension:organization.value[x].value"> + <path value="Extension.extension.value[x].value" /> + <min value="1" /> + </element> + <element id="Extension.extension:practitionerRole"> + <path value="Extension.extension" /> + <sliceName value="practitionerRole" /> + <min value="1" /> + <max value="1" /> + </element> + <element id="Extension.extension:practitionerRole.url"> + <path value="Extension.extension.url" /> + <fixedUri value="practitioner-role" /> + </element> + <element id="Extension.extension:practitionerRole.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Coding" /> + </type> + </element> + <element id="Extension.extension:practitionerRole.value[x].system"> + <path value="Extension.extension.value[x].system" /> + <min value="1" /> + </element> + <element id="Extension.extension:practitionerRole.value[x].code"> + <path value="Extension.extension.value[x].code" /> + <min value="1" /> + </element> + <element id="Extension.url"> + <path value="Extension.url" /> + <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner" /> + </element> + <element id="Extension.value[x]"> + <path value="Extension.value[x]" /> + <max value="0" /> + </element> +</differential> +``` + +This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element definitions from the Coding resource and adding everything to our [ActivityDefinition](../fhir/activitydefinition.md). + +We will start with the `Extension.url` element, since the `Extension` element is the parent element for all slices on the `Extension.extension` elements: +```xml +<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + +</extension> +``` + +Next, we will add the `organization` slice: +```xml +<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> +</extension> +``` +Finally, we will add the `practitionerRole` slice: + +```xml +<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> +</extension> +``` + +Notice that there is no `binding` element specified for `practitionerRole.value[x]`. This is intentional. In the example we used a code from the [dsf-practitioner-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml) CodeSystem. This CodeSystem includes a standard set of codes which are often sufficient for DSF use cases. You can freely add other CodeSystems if you find these codes do not apply for your use case. The code you set here can be used in the [DSF role config](https://dsf.dev/stable/maintain/fhir/access-control.html) to allow certain users with this `practitioner-role` to send requests. + +Working our way back up to the Coding we selected, we will now add the extension we just created as the `Coding.extension:organization-practitioner` element: +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + </valueCoding> +</extension> +``` +Now might be a good time to look at the [differential](#coding-differential) from the Coding again. Our next elements to be added are `Coding.system` and `Coding.code`: +```xml +<extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> + </valueCoding> +</extension> +``` +Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../fhir/activitydefinition.md) under the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). + +<details> +<summary>This is how your ActivityDefinition should look like so far</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + <extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> + </extension> + <extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> + </valueCoding> + </extension> + </extension> +</ActivityDefinition> +``` +</details> + +Now we are back to looking at the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) again. The last slice for this extension is `recipient`: +```xml +<StructureDefinition xmlns="http://hl7.org/fhir"> + ... + <differential> + ... + <element id="Extension.extension:recipient"> + <path value="Extension.extension" /> + <sliceName value="recipient" /> + <min value="1" /> + </element> + <element id="Extension.extension:recipient.url"> + <path value="Extension.extension.url" /> + <fixedUri value="recipient" /> + </element> + <element id="Extension.extension:recipient.value[x]"> + <path value="Extension.extension.value[x]" /> + <min value="1" /> + <type> + <code value="Coding" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> + <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> + </type> + <binding> + <strength value="required" /> + <valueSet value="http://dsf.dev/fhir/ValueSet/process-authorization-recipient|1.0.0" /> + </binding> + </element> + ... + </differential> +</StructureDefinition> +``` + +The `recipient` will decide which DSF instance is allowed to process that message. That is the reason why you will not find any Codings for `remote` or `practitioner` here. For `requester`, we already decided that we will only allow users with a certain role from our own (local) organization to send this message. So now we will only allow the DSF instance run by that same local organization to process the message. The right Coding for this job is the [coding-process-authorization-local-organization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-1.0.0.xml). The configuration of a local requester and local receiver is often used for the message that starts up the first BPMN process of the plugin. The process of adding the `recipient` slice is the exact same as it is for `requester`. You can follow the steps for the `requester` slice again but just use a different Coding. + +<details> +<summary>Using the Coding we just decided on, this is how your ActivityDefinition should look like</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + <extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> + </extension> + <extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> + </valueCoding> + </extension> + <extension url="recipient"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION"/> + </valueCoding> + </extension> + </extension> +</ActivityDefinition> +``` +</details> + +The last element defined in the [process authorization extension](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) is `Extension.url`. But since we added this element at the very beginning of the working through the extension, we are finished with it here. + +#### 3. BPE Managed Elements + +Some elements of [ActivityDefinitions](../fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values at appropriate times. + +The following elements are managed by the DSF BPE: +- `ActivityDefinition.version` should use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{version}` +- `ActivityDefinition.date` is not required, but should you decide to include it, use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{date}` +- `ActivityDefinition.status` must have a value of `unknown` + +<details> +<summary>Your ActivityDefinition should now look like this</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + <extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> + </extension> + <extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> + </valueCoding> + </extension> + <extension url="recipient"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION"/> + </valueCoding> + </extension> + </extension> + <!-- version managed by bpe --> + <version value="#{version}"/> + <!-- date managed by bpe --> + <date value="#{date}"/> + <!-- status managed by bpe --> + <status value="unknown"/> +</ActivityDefinition> +``` +</details> + +#### 4. Regular Elements + +The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. Check out the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` must have the value `Task`. +All other elements can technically be omitted. Still, we recommend you include the following elements: +- `AcitivityDefinition.name` +- `AcitivityDefinition.title` +- `AcitivityDefinition.subtitle` +- `AcitivityDefinition.experimental` +- `AcitivityDefinition.publisher` +- `AcitivityDefinition.contact` +- `AcitivityDefinition.description` + +<details> +<summary>Your finished ActivityDefinition should now look something like this</summary> + +```xml +<ActivityDefinition xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> + <extension url="message-name"> + <valueString value="myMessage"/> + </extension> + <extension url="task-profile"> + <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> + </extension> + <extension url="requester"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> + <extension url="organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <extension url="practitioner-role"> + <valueCoding> + <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> + <code value="DSF_ADMIN"/> + </valueCoding> + </extension> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> + </valueCoding> + </extension> + <extension url="recipient"> + <valueCoding> + <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> + <valueIdentifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="My_Organization"/> + </valueIdentifier> + </extension> + <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> + <code value="LOCAL_ORGANIZATION"/> + </valueCoding> + </extension> + </extension> + <!-- version managed by bpe --> + <version value="#{version}"/> + <!-- date managed by bpe --> + <date value="#{date}"/> + <!-- status managed by bpe --> + <status value="unknown"/> + <url value="http://dsf.dev/bpe/Process/myProcess"/> + <kind value="Task"/> + <name value="My Process"/> + <title value="My Title For My Process"/> + <subtitle value="Information Processing Process"/> + <experimental value="false"/> + <publisher value="DSF"/> + <contact> + <name value="DSF"/> + <telecom> + <system value="email"/> + <value value="noreply@dsf.dev"/> + </telecom> + </contact> + <description value="My Process processes information"/> +</ActivityDefinition> +``` +</details> \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/creating-codesystems-for-dsf-processes.md b/docs/src/process-development/api-v1/guides/creating-codesystems-for-dsf-processes.md new file mode 100644 index 000000000..5ab6d87f1 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/creating-codesystems-for-dsf-processes.md @@ -0,0 +1,42 @@ +--- +title: Creating CodeSystems for DSF Processes +icon: creative +--- + +### Creating CodeSystems for DSF Processes + +You might find yourself in a situation where you need to create a [CodeSystem](../fhir/codesystem.md). For example, when defining the type of an [Input Parameter](../fhir/task.md#task-input-parameters). [CodeSystems](../fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../fhir/codesystem.md) in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: +```xml +<CodeSystem xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <url value="http://dsf.dev/fhir/CodeSystem/my-code-system" /> <!--dummy value--> + <!-- version managed by bpe --> + <version value="#{version}" /> + <name value="My CodeSystem" /> <!--dummy value--> + <title value="My CodeSystem Title" /> <!--dummy value--> + <!-- status managed by bpe --> + <status value="unknown" /> + <experimental value="false" /> + <!-- date managed by bpe --> + <date value="#{date}" /> + <publisher value="DSF" /> <!--dummy value--> + <description value="CodeSystem with codes for me" /> <!--dummy value--> + <caseSensitive value="true" /> + <hierarchyMeaning value="grouped-by" /> + <versionNeeded value="false" /> + <content value="complete" /> + <concept> + <code value="my-code" /> <!--dummy value--> + <display value="My Code" /> <!--dummy value--> + <definition value="My code used for myself" /> <!--dummy value--> + </concept> +</CodeSystem> +``` +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. You can add as many codes as you like by defining more `concept` elements. + +The DSF BPE server will read your [CodeSystem](../fhir/codesystem.md) from `tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/creating-task-resources-based-on-a-definition.md b/docs/src/process-development/api-v1/guides/creating-task-resources-based-on-a-definition.md new file mode 100644 index 000000000..6306ab128 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/creating-task-resources-based-on-a-definition.md @@ -0,0 +1,231 @@ +--- +title: Creating Task Resources Based on a Definition +icon: creative +--- + +### Creating Task Resources Based on a Definition + +This short guide should help you understand how you can create [Task](../fhir/task.md) resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). As an example, we will create a [Task](../fhir/task.md) resource from the `task-start-dic-process.xml` profile. + +#### 1st Step: Removing Placeholders +`task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, you can either remove or comment these elements, so Forge does not try to perform type checking on them, which would result in an error and Forge not loading the file. + +#### 2nd Step: Differential Chain +If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our case, we will want to aggregate the changes made to the base resource (in this case [Task](../fhir/task.md)) by all profiles to make it more readable. To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: + +![Forge overview](/photos/developer-documentation/forge_overview.png) + +#### 3rd Step: Building the Task Resource +We will now go through each element one by one and include it into our [Task](../fhir/task.md) resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case if we want a [Task](../fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). But, placeholders should be used in [Draft Task Resources](../dsf/draft-task-resources.md) instead of actual values wherever possible, since those are read by the DSF BPE server. This guide will create a [Task](../fhir/task.md) resource without placeholders. We will start out with the base element for all [Task](../fhir/task.md) resources: +```xml +<Task xmlns="http://hl7.org/fhir"> + +</Task> +``` + +Before we start adding any elements listed in Forge's element tree, we have to include the `Task.meta.profile` element. Its requirement cannot be seen here which is why we mention it specifically. This is the only instance you will not see it in the element tree. It should look like this: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> +</Task> +``` + +The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we will create an XML element with the same name and the value according to [URLs](../dsf/versions-placeholders-urls.md#urls): +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> +</Task> +``` +We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct data type (e.g. proper coding value for elements with `coding` type). + +By now your [Task](../fhir/task.md) resources should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> +</Task> +``` +</details> + +Let us look at a more complex element like the `requester` element: + +![Forge requester view](/photos/developer-documentation/forge_requester_view.png) + +We will start the same way we started with primitive elements, by adding the `requester` element: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + + </requester> +</Task> +``` + +Then, we will add primitive elements to `requester` like we did before for `Task`: +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + </requester> +</Task> +``` +*Important to note here that the value for the `status` will always be `requested` for Tasks being posted using cURL and the `type` element for `requester` and `recipient` will always have the value `Organization` in the DSF context.* + +Next, we will add the `identifier` element and its primitive sub-elements just like we started out doing it for the `requester` element. The `identifier.value` in this case will be `dic.dsf.test`. To understand why, take a look at the topic on [organization identifiers](../dsf/organization-identifiers.md): +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> +</Task> +``` +*Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including the actual value for `Fixed value`.* + +You should now be able to fill out all elements in your [Task](../fhir/task.md) resource until you reach the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../fhir/task.md) resource should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> + <restriction> + <recipient> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier" /> + <value value="dic.dsf.test" /> + </identifier> + </recipient> + </restriction> +</Task> +``` +</details> + + +[Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the slice `message-name`: + +![Forge slice message name](/photos/developer-documentation/forge_slice_message_name.png) + +If we were to continue including slices to the [Task](../fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: + +```xml +<Task xmlns="http://hl7.org/fhir"> + ... + <input> + <message-name> + ... + </message-name> + </input> +</Task> +``` + +This approach however, would not work. FHIR processors do not use the name of the slice to map entries in your [Task](../fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Discriminators define the elements a processor needs to distinguish slices by. You can see how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: + +```xml +<Task xmlns="http://hl7.org/fhir"> + ... + <input> + <type> + <coding> + <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> + <code value="message-name" /> + </coding> + </type> + <valueString value="dicProcess" /> + </input> +</Task> +``` + +Now you should be able to add all remaining mandatory elements to your [Task](../fhir/task.md) resource on your own. In the end, it should look something like this: +<details> +<summary>Suggested solution</summary> + +```xml +<Task xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> + </meta> + <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> + <status value="requested"/> + <intent value="order"/> + <authoredOn value="2024-02-08T10:00:00+00:00" /> + <requester> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier"/> + <value value="dic.dsf.test" /> + </identifier> + </requester> + <restriction> + <recipient> + <type value="Organization"/> + <identifier> + <system value="http://dsf.dev/sid/organization-identifier" /> + <value value="dic.dsf.test" /> + </identifier> + </recipient> + </restriction> + <input> + <type> + <coding> + <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> + <code value="message-name" /> + </coding> + </type> + <valueString value="dicProcess"/> + </input> +</Task> +``` +</details> + +**Do not forget to restore the version and date placeholders in `task-start-dic-process.xml`!** \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/creating-valuesets-for-dsf-processes.md b/docs/src/process-development/api-v1/guides/creating-valuesets-for-dsf-processes.md new file mode 100644 index 000000000..f273196ec --- /dev/null +++ b/docs/src/process-development/api-v1/guides/creating-valuesets-for-dsf-processes.md @@ -0,0 +1,63 @@ +--- +title: Creating ValueSets for DSF Processes +icon: creative +--- + +### Creating ValueSets for DSF Processes + +You might find yourself in the situation where you need to create a [ValueSet](../fhir/valueset.md). For example, when adding [Input Parameters](../fhir/task.md#task-input-parameters) to DSF [Task](../fhir/task.md) resources, you will also have to reference a [ValueSet](../fhir/valueset.md) resource in your binding for `Task.input.type` to be able to set the type of your [Input Parameter](../fhir/task.md#task-input-parameters). [ValueSets](../fhir/valueset.md) for the DSF differ from regular [ValueSets](../fhir/valueset.md) in that some element's values are managed by the DSF BPE server. You can use the following template for your +[ValueSet](../fhir/valueset.md): +```xml +<ValueSet xmlns="http://hl7.org/fhir"> + <meta> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> + <code value="ALL" /> + </tag> + </meta> + <url value="http://dsf.dev/fhir/ValueSet/my-value-set"/> <!--dummy value--> + <!-- version managed by bpe --> + <version value="#{version}" /> + <name value="My ValueSet"/> <!--dummy value--> + <title value="My ValueSet Title"/> <!--dummy value--> + <!-- status managed by bpe --> + <status value="unknown" /> + <experimental value="false"/> + <!-- date managed by bpe --> + <date value="#{date}"/> + <publisher value="DSF"/> <!--dummy value--> + <description value="ValueSet with all codes from my-code-system"/> <!--dummy value--> + <immutable value="true"/> + <compose> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> <!--dummy value--> + <version value="#{version}"/> + </include> + </compose> +</ValueSet> +``` +Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. The `compose` element defines the codes included in this [ValueSet](../fhir/valueset.md). It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../fhir/codesystem.md) and contains a list of `concept` elements which in turn contain the actual `code` element. Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: +```xml +<ValueSet xmlns="http://hl7.org/fhir"> + ... + <compose> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> + <version value="#{version}"/> + <concept> + <code value="my-code"/> + </concept> + </include> + <include> + <system value="http://dsf.dev/fhir/CodeSystem/my-other-code-system"/> + <version value="#{version}"/> + <concept> + <code value="my-other-code"/> + </concept> + </include> + </compose> +</ValueSet> +``` +The DSF BPE server will read your [ValueSet](../fhir/valueset.md) from `tutorial-process/src/main/resources/fhir/ValueSet`. + +You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) on how to create [CodeSystems](../fhir/codesystem.md). \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/index.md b/docs/src/process-development/api-v1/guides/index.md new file mode 100644 index 000000000..2841de106 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/index.md @@ -0,0 +1,17 @@ +--- +title: Guides +icon: creative +--- + +## Details +- [Accessing BPMN Process Variables](accessing-bpmn-process-variables.md) +- [Accessing Task Resources During Execution](accessing-task-resources-during-execution.md) +- [Adding Task Input Parameters to Task Profiles](adding-task-input-parameters-to-task-profiles.md) +- [Configuring Read Access Tags](configuring-read-access-tags.md) +- [Creating ActivityDefinitions](creating-activity-definitions.md) +- [Creating CodeSystems for DSF Processes](creating-codesystems-for-dsf-processes.md) +- [Creating Task Resources Based on a Definition](creating-task-resources-based-on-a-definition.md) +- [Creating ValueSets for DSF Processes](creating-valuesets-for-dsf-processes.md) +- [Managing Multiple Incoming Messages and Missing Messages](managing-mutiple-incoming-messages-and-missing-messages.md) +- [Setting Targets for Message Events](setting-targets-for-message-events.md) +- [Starting a Process via Task Resources](starting-a-process-via-task-resources.md) \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/process-development/api-v1/guides/managing-mutiple-incoming-messages-and-missing-messages.md new file mode 100644 index 000000000..a0c8f6120 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/managing-mutiple-incoming-messages-and-missing-messages.md @@ -0,0 +1,18 @@ +--- +title: Managing Multiple Incoming Messages and Missing Messages +icon: creative +--- + +### Managing Multiple Incoming Messages and Missing Messages + +If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../fhir/task.md) may never arrive. Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../fhir/task.md) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. + +At the same time, you might also expect to receive one out of a number of different message types at once. + +In order to solve both problems we can add an [Event Based Gateway](../bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: + +<picture> + <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/event_based_gateway_inverted.svg"> + <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/event_based_gateway.svg"> + <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/event_based_gateway.svg"> +</picture> diff --git a/docs/src/process-development/api-v1/guides/setting-targets-for-message-events.md b/docs/src/process-development/api-v1/guides/setting-targets-for-message-events.md new file mode 100644 index 000000000..68db0b1e0 --- /dev/null +++ b/docs/src/process-development/api-v1/guides/setting-targets-for-message-events.md @@ -0,0 +1,14 @@ +--- +title: Setting Targets for Message Events +icon: creative +--- + +### Setting Targets for Message Events + +Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. You can find these values by visiting the DSF FHIR server's web interface. In the top right corner, click the `Show Bookmarks` button, then select `Endpoint`. You will be taken to a list of all Endpoints available to the FHIR server. There are two ways of adding `targets` to the BPMN execution variables: +#### 1. Adding the target in the message event implementation +In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, add your targets and then call the super-method. +#### 2. Adding the target in a service task right before the message event +This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../bpmn/service-tasks.md). + +In both cases you can access methods to create and set `targets` through the `Variables` instance. diff --git a/docs/src/process-development/api-v1/guides/starting-a-process-via-task-resources.md b/docs/src/process-development/api-v1/guides/starting-a-process-via-task-resources.md new file mode 100644 index 000000000..baa36a7bb --- /dev/null +++ b/docs/src/process-development/api-v1/guides/starting-a-process-via-task-resources.md @@ -0,0 +1,43 @@ +--- +title: Starting a Process via Task Resources +icon: creative +--- + +### Starting a Process via Task Resources + +To start a BPMN process, you need to create new a [Task](../fhir/task.md) resource in the DSF FHIR server by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) +a resource for the first time. Also, remember that the [Task](../fhir/task.md) resource you are sending needs to comply to the [Task](../fhir/task.md) profile of the process you want to start and the [ActivityDefinition's](../fhir/activitydefinition.md) authorization rules. +There are two major ways of making this HTTP request: +1. Using cURL +2. Using the DSF FHIR server's web interface + +#### Using cURL +In order to use cURL, you will have to create an appropriate [Task](../fhir/task.md) resource to post to the DSF FHIR server. There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), or you can check the solution branches for this file if you need ideas on how to fill it out properly. + +Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the instance you want to address. + +##### Linux: +```shell +curl https://<instance-host-name>/fhir/Task \ +--cacert <path/to/ca-certificate-file.pem> \ +--cert <path/to/client-certificate-file.pem>:password \ +--key <path/to/client-private-key-file.pem> \ +-H "Content-Type: application/fhir+xml" \ +-H "Accept: application/fhir+xml" \ +-d @<path/to/example-task.xml> +``` +##### Windows CMD: +```shell +curl https://<instance-host-name>/fhir/Task ^ +--cacert <path/to/ca-certificate-file.pem> ^ +--cert <path/to/client-certificate-file.pem>:password ^ +--key <path/to/client-private-key-file.pem> ^ +-H "Content-Type: application/fhir+xml" ^ +-H "Accept: application/fhir+xml" ^ +-d @<path/to/example-task.xml> +``` +*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* + +#### Using the DSF FHIR Server's Web Interface + +When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../dsf/draft-task-resources.md). These [Task](../fhir/task.md) resources act like a template you can use to instantiate [Task](../fhir/task.md) resources which start BPMN processes. Instead of querying the DSF FHIR server manually, you can use a predefined bookmark to navigate to the query URL. You can find a list of Bookmarks in the top right corner of the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under the `Task` section, and you will be taken to the list of all [Draft Task Resources](../dsf/draft-task-resources.md). Once there, you can select the one which starts your BPMN process. It will take you to a detailed view of the resource where you will also have the chance to fill any [Task Input Parameters](../fhir/task.md#task-input-parameters) you might need to specify. If everything is filled out correctly, you may start your process by clicking `Start Process`. Keep in mind that, for [Draft Task Resources](../dsf/draft-task-resources.md) to be available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. Take a look at [the Process Plugin Definition](../dsf/process-plugin-definition.md) if you need a reminder. \ No newline at end of file diff --git a/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md b/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md new file mode 100644 index 000000000..6bd4ca28b --- /dev/null +++ b/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md @@ -0,0 +1,57 @@ +--- +title: User Tasks in the DSF +icon: creative +--- + +### User Tasks in the DSF + +Creating a [User Task](../concepts/bpmn/user-tasks.md) in a BPMN model, causes the DSF to automatically generate a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) resource according to a [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) you provided in the [User Task's](../concepts/bpmn/user-tasks.md) `Forms` field when the process execution reaches the [User Task](../concepts/bpmn/user-tasks.md). The `Forms` field needs to have a type of `Embedded or External Task Forms` with the `Form key` being the url of your [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource. The [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource needs to be put in the `src/main/resources/fhir/Questionnaire` directory. The generated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) can now be answered by locating the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) in the DSF FHIR server UI through `https://your.dsf.fhir.server/fhir/QuestionnaireResponse?_sort=-_lastUpdated&status=in-progress`. After filling out the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) and submitting it, the process execution will continue with the next BPMN element after the [User Task](../concepts/bpmn/user-tasks.md) and the updated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) will be available through the [Process Plugin Api's](../concepts/dsf/process-api.md) `Variables` instance by calling `getLatestReceivedQuestionnaireResponse()`. + +You also have the option to register a [Task Listener](https://docs.camunda.org/manual/7.21/user-guide/process-engine/delegation-code/#task-listener) on the [User Task](../concepts/bpmn/user-tasks.md). This allows you to manipulate the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) before it is posted to the DSF FHIR server. You do this by extending the `DefaultUserTaskListener` class which provides overrides to interact with the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html). Notice that dynamically changing the `item.text` value of an item in a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) (that is **NOT** of type `display`) is not allowed. For that, you would have to change the `item.text` value of the corresponding [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource as well. Instead, you should have an item of type `display` above the item whose text should change dynamically, like in the template, and change its `item.text` value. In this case, you may also leave out `item.text` element of the item below the display item. + +Below you can find a template for a [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource. Replace `questionnaire-name` with the name of your [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) and have the file be named the same. The items `business-key` and `user-task-id` are required by the DSF and are always included. You can then add any amount of items of your choosing to the [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html). + +### Questionnaire Template +```xml +<Questionnaire xmlns="http://hl7.org/fhir"> + <meta> + <profile value="http://dsf.dev/fhir/StructureDefinition/questionnaire|1.5.0"/> + <tag> + <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> + <code value="ALL"/> + </tag> + </meta> + <url value="http://dsf.dev/fhir/Questionnaire/questionnaire-name"/> <!-- file name should be same as the name of your Questionnaire --> + <!-- version managed by bpe --> + <version value="#{version}"/> + <!-- date managed by bpe --> + <date value="#{date}"/> + <!-- status managed by bpe --> + <status value="unknown"/> + <item> + <!-- required --> + <linkId value="business-key"/> + <type value="string"/> + <text value="The business-key of the process execution"/> + <required value="true"/> + </item> + <item> + <!-- required --> + <linkId value="user-task-id"/> + <type value="string"/> + <text value="The user-task-id of the process execution"/> + <required value="true"/> + </item> + <item> + <linkId value="text-to-display-above-item"/> + <type value="display"/> + <text value="foo"/> + </item> + <item> + <linkId value="item"/> + <type value="boolean"/> + <text value="Item description"/> + <required value="true"/> + </item> +</Questionnaire> +``` \ No newline at end of file diff --git a/docs/src/process-development/api-v1/index.md b/docs/src/process-development/api-v1/index.md new file mode 100644 index 000000000..ca799dea6 --- /dev/null +++ b/docs/src/process-development/api-v1/index.md @@ -0,0 +1,47 @@ +--- +title: Developer Documentation +icon: creative +--- + +## BPMN +- [Conditions](bpmn/conditions.md) +- [Gateways](bpmn/gateways.md) +- [Messaging](bpmn/messaging.md) +- [Sequence Flow](bpmn/sequence-flow.md) +- [Service Tasks](bpmn/service-tasks.md) +- [Timer Intermediate Catching Events](bpmn/timer-intermediate-catching-events.md) + +## FHIR +- [ActivityDefinition](fhir/activitydefinition.md) +- [Codesystem](fhir/codesystem.md) +- [Task](fhir/task.md) +- [ValueSet](fhir/valueset.md) + +## DSF +- [BPMN Process Execution](dsf/bpmn-process-execution.md) +- [BPMN Process Variables](dsf/bpmn-process-variables.md) +- [Draft Task Resources](dsf/draft-task-resources.md) +- [Environment Variables](dsf/environment-variables.md) +- [Message Correlation](dsf/message-correlation.md) +- [Message Delegates](dsf/message-delegates.md) +- [Organization Identifiers](dsf/organization-identifiers.md) +- [Process Plugin API](dsf/process-plugin-api.md) +- [Process Plugin Definition](dsf/process-plugin-definition.md) +- [Read Access Tag](dsf/read-access-tag.md) +- [Requester and Recipient](dsf/requester-and-recipient.md) +- [Service Delegates](dsf/service-delegates.md) +- [Spring Framework Integration](dsf/spring-framework-integration.md) +- [Versions, Placeholders and URLs](dsf/versions-placeholders-urls.md) + +## Guides +- [Accessing BPMN Process Variables](guides/accessing-bpmn-process-variables.md) +- [Accessing Task Resources During Execution](guides/accessing-task-resources-during-execution.md) +- [Adding Task Input Parameters to Task Profiles](guides/adding-task-input-parameters-to-task-profiles.md) +- [Configuring Read Access Tags](guides/configuring-read-access-tags.md) +- [Creating ActivityDefinitions](guides/creating-activity-definitions.md) +- [Creating CodeSystems for DSF Processes](guides/creating-codesystems-for-dsf-processes.md) +- [Creating Task Resources Based on a Definition](guides/creating-task-resources-based-on-a-definition.md) +- [Creating ValueSets for DSF Processes](guides/creating-valuesets-for-dsf-processes.md) +- [Managing Multiple Incoming Messages and Missing Messages](guides/managing-mutiple-incoming-messages-and-missing-messages.md) +- [Setting Targets for Message Events](guides/setting-targets-for-message-events.md) +- [Starting a Process via Task Resources](guides/starting-a-process-via-task-resources.md) \ No newline at end of file From 527e42c7a507e846728b4734b0d13ed1840d679d Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 28 May 2025 11:22:15 +0200 Subject: [PATCH 26/42] minor adjustments --- docs/src/.vuepress/client.ts | 11 + docs/src/.vuepress/config.ts | 1 + docs/src/.vuepress/layouts/PageLayout.vue | 75 ++ .../public/{.well-known => }/security.txt | 4 + docs/src/.vuepress/sidebar/operations-v1.ts | 309 +++++ docs/src/.vuepress/theme.ts | 1079 +---------------- docs/src/explore/README.md | 2 +- docs/src/explore/concepts/README.md | 2 +- docs/src/explore/concepts/process-plugins.md | 4 +- docs/src/for-you/learn.md | 6 +- .../v1/v1.0.0/maintain/upgrade-from-1.md | 6 + .../v1/v1.7.1/maintain/upgrade-from-1.md | 2 +- docs/src/operations/v2/get-started.md | 2 +- docs/src/security/readme.md | 4 +- 14 files changed, 435 insertions(+), 1072 deletions(-) create mode 100644 docs/src/.vuepress/client.ts create mode 100644 docs/src/.vuepress/layouts/PageLayout.vue rename docs/src/.vuepress/public/{.well-known => }/security.txt (76%) create mode 100644 docs/src/.vuepress/sidebar/operations-v1.ts create mode 100644 docs/src/operations/v1/v1.0.0/maintain/upgrade-from-1.md diff --git a/docs/src/.vuepress/client.ts b/docs/src/.vuepress/client.ts new file mode 100644 index 000000000..eb21d4003 --- /dev/null +++ b/docs/src/.vuepress/client.ts @@ -0,0 +1,11 @@ +import { defineClientConfig } from 'vuepress/client' +import { Layout as ParentLayout, NotFound } from "vuepress-theme-hope/client"; + +import Layout from './layouts/PageLayout.vue' + +export default defineClientConfig({ + layouts: { + //ParentLayout, + Layout + }, +}) \ No newline at end of file diff --git a/docs/src/.vuepress/config.ts b/docs/src/.vuepress/config.ts index 79e84ef8b..b8f6542bb 100644 --- a/docs/src/.vuepress/config.ts +++ b/docs/src/.vuepress/config.ts @@ -14,6 +14,7 @@ export default defineUserConfig({ vuePluginOptions: {}, }), + /*locales: { "/": { lang: "en-US", diff --git a/docs/src/.vuepress/layouts/PageLayout.vue b/docs/src/.vuepress/layouts/PageLayout.vue new file mode 100644 index 000000000..20e966a79 --- /dev/null +++ b/docs/src/.vuepress/layouts/PageLayout.vue @@ -0,0 +1,75 @@ +<script setup lang="ts"> +// import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue' +import { Layout as ParentLayout, PageContent } from 'vuepress-theme-hope/client' +import { useRoute, useRouter } from "vue-router"; +import { ref } from 'vue' + +const version = ref(""); + + +function setVersionBasedOnCurrentPath() : void { + if (route.path.startsWith('/operations/')) { + const input = route.path.substring('/operations/'.length); + const firstSlash = input.indexOf("/"); + const secondSlash = input.indexOf("/", firstSlash + 1); + const result = secondSlash !== -1 ? input.slice(0, secondSlash) : input; + + version.value = result; + + + } else { + version.value = ""; + } +} + +const route = useRoute(); + + +const router = useRouter(); +router.afterEach((_to, _from) => { + setVersionBasedOnCurrentPath(); +}); + +setVersionBasedOnCurrentPath(); + +function navigateToNewVersion() { + const input = route.path.substring('/operations/'.length); + const firstSlash = input.indexOf("/"); + const secondSlash = input.indexOf("/", firstSlash + 1); + const result = secondSlash !== -1 ? input.slice(secondSlash + 1) : ""; + router.push('/operations/' + version.value + "/" + result); +} + +</script> + +<template> + <ParentLayout> + <template #sidebarTop> + <div class="version-selector" v-if="route.path.startsWith('/operations/')"> + <label class="vp-sidebar-header" for="version-select">Version: </label> + <select id="version-select" class="vp-sidebar-header" v-model="version" @change="navigateToNewVersion"> + <option value="v2/latest">next (v2.0.0-M2)</option> + <option value="v1/latest">latest (v1.7.1)</option> + <option value="v1/v1.7.0">v1.7.0</option> + <option value="v1/v1.6.0">v1.6.0</option> + <option value="v1/v1.5.2">v1.5.2</option> + <option value="v1/v1.5.1">v1.5.1</option> + <option value="v1/v1.5.0">v1.5.0</option> + <option value="v1/v1.4.0">v1.4.0</option> + <option value="v1/v1.3.2">v1.3.2</option> + <option value="v1/v1.3.1">v1.3.1</option> + <option value="v1/v1.3.0">v1.3.0</option> + <option value="v1/v1.2.0">v1.2.0</option> + <option value="v1/v1.1.0">v1.1.0</option> + <option value="v1/v1.0.0">v1.0.0</option> + </select></div> + </template> + <PageContent id="main-content" class="vp-page"/> + </ParentLayout> +</template> + +<style lang="css"> +.version-selector { + margin-top: 20px; +} +</style> \ No newline at end of file diff --git a/docs/src/.vuepress/public/.well-known/security.txt b/docs/src/.vuepress/public/security.txt similarity index 76% rename from docs/src/.vuepress/public/.well-known/security.txt rename to docs/src/.vuepress/public/security.txt index 71e46f3ec..a6e38efb7 100644 --- a/docs/src/.vuepress/public/.well-known/security.txt +++ b/docs/src/.vuepress/public/security.txt @@ -1,3 +1,7 @@ +--- +layout: none +permalink: .well-known/security.txt +--- Contact: mailto:dsf-security@hs-heilbronn.de Expires: 2040-12-31T22:59:00.000Z Preferred-Languages: de,en diff --git a/docs/src/.vuepress/sidebar/operations-v1.ts b/docs/src/.vuepress/sidebar/operations-v1.ts new file mode 100644 index 000000000..f43e2df87 --- /dev/null +++ b/docs/src/.vuepress/sidebar/operations-v1.ts @@ -0,0 +1,309 @@ +export function generate_v1_latest_sidebar() { + return [ + { + text: "Home", + icon: "home", + link: "/", + }, + { + text: "Maintain a DSF instance", + icon: "tool", + prefix: "maintain/", + link: "maintain/", + children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", "root-certificates", "passwords-secrets", { + text: "FHIR Reverse Proxy", + icon: "module", + prefix: "fhir-reverse-proxy/", + link: "fhir-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "FHIR Server", + icon: "module", + prefix: "fhir/", + link: "fhir/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, { + text: "BPE Reverse Proxy", + icon: "module", + prefix: "bpe-reverse-proxy/", + link: "bpe-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "BPE Server", + icon: "module", + prefix: "bpe/", + link: "bpe/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, + { + text: "Install Plugins", + icon: "plugin", + link: "install-plugins" + }], + }, + ]; +} + + +export function generate_v1_gt_eq_1_7_0_sidebar() { + return [ + { + text: "Home", + icon: "home", + link: "/", + }, + { + text: "Maintain a DSF instance", + icon: "tool", + prefix: "maintain/", + link: "maintain/", + children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", "root-certificates", "passwords-secrets", { + text: "FHIR Reverse Proxy", + icon: "module", + prefix: "fhir-reverse-proxy/", + link: "fhir-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "FHIR Server", + icon: "module", + prefix: "fhir/", + link: "fhir/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, { + text: "BPE Reverse Proxy", + icon: "module", + prefix: "bpe-reverse-proxy/", + link: "bpe-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "BPE Server", + icon: "module", + prefix: "bpe/", + link: "bpe/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, + { + text: "Install Plugins", + icon: "plugin", + link: "install-plugins" + }], + } + ]; +} + +export function generate_v1_gt_eq_1_5_0_sidebar() { + return [ + { + text: "Home", + icon: "home", + link: "/", + }, + { + text: "Maintain a DSF instance", + icon: "tool", + prefix: "maintain/", + link: "maintain/", + children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { + text: "FHIR Reverse Proxy", + icon: "module", + prefix: "fhir-reverse-proxy/", + link: "fhir-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "FHIR Server", + icon: "module", + prefix: "fhir/", + link: "fhir/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, { + text: "BPE Reverse Proxy", + icon: "module", + prefix: "bpe-reverse-proxy/", + link: "bpe-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "BPE Server", + icon: "module", + prefix: "bpe/", + link: "bpe/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, + { + text: "Install Plugins", + icon: "plugin", + link: "install-plugins" + }], + }, + { + text: "Develop process plugins", + icon: "plugin", + prefix: "develop/", + link: "develop/", + children: ["create", "upgrade-from-0" ], + }, + ]; +} + + +export function generate_v1_gt_eq_1_0_0_sidebar() { + return [ + { + text: "Home", + icon: "home", + link: "/", + }, + { + text: "Maintain a DSF instance", + icon: "tool", + prefix: "maintain/", + link: "maintain/", + children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { + text: "FHIR Reverse Proxy", + icon: "module", + prefix: "fhir-reverse-proxy/", + link: "fhir-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "FHIR Server", + icon: "module", + prefix: "fhir/", + link: "fhir/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, { + text: "BPE Server", + icon: "module", + prefix: "bpe/", + link: "bpe/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, + { + text: "Install Plugins", + icon: "plugin", + link: "install-plugins" + }], + }, + { + text: "Develop process plugins", + icon: "plugin", + prefix: "develop/", + link: "develop/", + children: ["create", "upgrade-from-0" ], + }, + ]; +} \ No newline at end of file diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 4d0e01a85..abaecbd1d 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -1,5 +1,6 @@ import { slimsearchPlugin } from "@vuepress/plugin-slimsearch"; import { hopeTheme } from "vuepress-theme-hope"; +import { generate_v1_latest_sidebar, generate_v1_gt_eq_1_7_0_sidebar, generate_v1_gt_eq_1_5_0_sidebar, generate_v1_gt_eq_1_0_0_sidebar } from "./sidebar/operations-v1"; export default hopeTheme({ author: { @@ -11,6 +12,7 @@ export default hopeTheme({ logo: "/photos/home/logo-small.svg", darkmode: "toggle", contributors: false, + navbar: [ { @@ -121,1075 +123,30 @@ export default hopeTheme({ "/hackathon": [], "/spring-school": [], "/news": [], - "/operations/v1/latest/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", "root-certificates", "passwords-secrets", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - } - ], - }, - ], - "/operations/v1/v1.7.1/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - "", - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", "root-certificates", "passwords-secrets", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.7.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", "root-certificates", "passwords-secrets", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.6.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.5.2/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.5.1/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.5.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Reverse Proxy", - icon: "module", - prefix: "bpe-reverse-proxy/", - link: "bpe-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.4.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.3.2/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.3.1/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.3.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, - { - text: "Install Plugins", - icon: "plugin", - link: "install-plugins" - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.2.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.1.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { - text: "FHIR Reverse Proxy", - icon: "module", - prefix: "fhir-reverse-proxy/", - link: "fhir-reverse-proxy/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }, { - text: "FHIR Server", - icon: "module", - prefix: "fhir/", - link: "fhir/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }, { - icon: "config", - text: "Access Control", - link: "access-control" - }, { - icon: "config", - text: "OpenID Connect", - link: "oidc" - }] - }, { - text: "BPE Server", - icon: "module", - prefix: "bpe/", - link: "bpe/", - children: [{ - icon: "config", - text: "Configuration", - link: "configuration" - }] - }], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/operations/v1/v1.0.0/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "Current version", - icon: "update", - link: "/stable/", - }, - { - text: "Maintain a DSF instance", - icon: "tool", - prefix: "maintain/", - link: "maintain/", - children: ["install", "upgrade-from-0", "allowList-mgm", { - text: "Configuration parameters", - icon: "config", - prefix: "configuration/", - link: "configuration/", - children: ["common", "fhir", "bpe", "reverseproxy"] - - } - ], - }, - { - text: "Develop process plugins", - icon: "plugin", - prefix: "develop/", - link: "develop/", - children: ["create", "upgrade-from-0" ], - }, - ], - "/community/": [ - { - text: "Home", - icon: "home", - link: "/", - }, - { - text: "News", - icon: "news", - link: "/tag/news/" - }, - { - text: "Community", - icon: "creative", - prefix: "/community/", - children: [ - "team", - "communication", - "ecosystem", - "contribute/", - "contribute/code", - "contribute/documentation", - "events/", - "consultation-hours" - ], - }, - - ], + "/operations/v1/latest/":generate_v1_latest_sidebar(), + "/operations/v1/v1.7.1/": generate_v1_latest_sidebar(), + "/operations/v1/v1.7.0/": generate_v1_gt_eq_1_7_0_sidebar(), + "/operations/v1/v1.6.0/": generate_v1_gt_eq_1_5_0_sidebar(), + "/operations/v1/v1.5.2/": generate_v1_gt_eq_1_5_0_sidebar(), + "/operations/v1/v1.5.1/": generate_v1_gt_eq_1_5_0_sidebar(), + "/operations/v1/v1.5.0/": generate_v1_gt_eq_1_5_0_sidebar(), + "/operations/v1/v1.4.0/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.3.2/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.3.1/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.3.0/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.2.0/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.1.0/": generate_v1_gt_eq_1_0_0_sidebar(), + "/operations/v1/v1.0.0/": generate_v1_gt_eq_1_0_0_sidebar(), "/process-development": [ { - text: "api v1", + text: "API v1", icon: "", prefix: "api-v1/", link: "api-v1/", children: [ "get-started","concept","create", "publishing/publish-on-dsfhub", "tooling/", "tutorials/",], }, { - text: "api v2", + text: "API v2", icon: "", prefix: "api-v2/", link: "api-v2/", diff --git a/docs/src/explore/README.md b/docs/src/explore/README.md index 529a40158..d14bc7ed3 100644 --- a/docs/src/explore/README.md +++ b/docs/src/explore/README.md @@ -9,6 +9,6 @@ icon: info - [Basics & Standards](concepts/basics.md) - [Architecture](concepts/architecture.md) - [Security](concepts/security.md) - - [Allow Lists](concepts/allowList.md) + - [Allow Lists](concepts/allow-list.md) - [Process Plugins](concepts/process-plugins.md) diff --git a/docs/src/explore/concepts/README.md b/docs/src/explore/concepts/README.md index aa7247613..73d515e72 100644 --- a/docs/src/explore/concepts/README.md +++ b/docs/src/explore/concepts/README.md @@ -43,7 +43,7 @@ DSF is already deployed and operational in *Data Integration Centers* at German -If you're looking to leverage the DSF for your research or you're interested in exploring how it can enhance your data sharing needs, we're here to support you. Visit the **[Learn how to implement your use case](./learn.md)** page to start your journey towards integrating the DSF into your research project. +If you're looking to leverage the DSF for your research or you're interested in exploring how it can enhance your data sharing needs, we're here to support you. Visit the **[Learn how to implement your use case](/for-you/learn.md)** page to start your journey towards integrating the DSF into your research project. Should you have any questions or need personalized assistance, don't hesitate to reach out to the DSF core team directly at **dsf-gecko@hs-heilbronn.de**. diff --git a/docs/src/explore/concepts/process-plugins.md b/docs/src/explore/concepts/process-plugins.md index 41d7533ee..283666954 100644 --- a/docs/src/explore/concepts/process-plugins.md +++ b/docs/src/explore/concepts/process-plugins.md @@ -4,11 +4,11 @@ icon: plugin --- ## Overview -It is important to understand that the DSF is *only* the silent helper in the background: a middleware. The DSF is use case agnostic. This means that process plugins make it possible to execute almost any use case you can imagine with the DSF. Process plugins provide individual functionality. For example, it is possible to use the Ping Pong process to test bilateral communication or the [Feasibility process](/intro/use-cases/feasibility) to perform feasibility queries for research. +It is important to understand that the DSF is *only* the silent helper in the background: a middleware. The DSF is use case agnostic. This means that process plugins make it possible to execute almost any use case you can imagine with the DSF. Process plugins provide individual functionality. For example, it is possible to use the Ping Pong process to test bilateral communication or the [Feasibility process](../use-cases/feasibility) to perform feasibility queries for research. However, it is possible to deploy several process plugins together, even the same process plugin in different versions. A process plugin is basically an archive of BPMN 2.0 models, FHIR R4 resources and Java code. This process plugin is deployed as a Jar file on the BPE. ## BPMN: Example -BPMN models can be created with [Camunda Modeler](https://camunda.com/de). The following model is a BPMN model consisting of two lanes: These are the square boxes, i.e. Organization A and B. This process is intended only as an example to illustrate the formalities. We will look at realistic processes in the next [chapter](/intro/use-cases). +BPMN models can be created with [Camunda Modeler](https://camunda.com/de). The following model is a BPMN model consisting of two lanes: These are the square boxes, i.e. Organization A and B. This process is intended only as an example to illustrate the formalities. We will look at realistic processes in the next [chapter](../use-cases/). ![BPMN: Example](/photos/info/plugins/bpmn-example.png) diff --git a/docs/src/for-you/learn.md b/docs/src/for-you/learn.md index 5d29fd258..a688f26e0 100644 --- a/docs/src/for-you/learn.md +++ b/docs/src/for-you/learn.md @@ -9,8 +9,8 @@ This site is work in progress, please come back later. If you want further information about the DSF and how to implement use cases, please visit: -- [Documentation Overview](../intro/) -- [Getting started](../stable/) -- [Contact us](../about/learnmore/contact.md) +- [Documentation Overview](../explore/) +- [Getting started](../operations/get-started.md) +- [Contact us](../community/communication.md) ::: \ No newline at end of file diff --git a/docs/src/operations/v1/v1.0.0/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.0.0/maintain/upgrade-from-1.md new file mode 100644 index 000000000..6ebdedce0 --- /dev/null +++ b/docs/src/operations/v1/v1.0.0/maintain/upgrade-from-1.md @@ -0,0 +1,6 @@ +--- +title: Upgrade from DSF 1.x +icon: update +--- + +This is the first version of DSF 1.x. No upgrade from previous version possible. \ No newline at end of file diff --git a/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md b/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md index a4532466c..c863b5c2e 100644 --- a/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md +++ b/docs/src/operations/v1/v1.7.1/maintain/upgrade-from-1.md @@ -6,7 +6,7 @@ icon: update Upgrading the DSF from 1.7.0 to 1.7.1 involves modifying the docker-compose.yml files and recreating the containers. ::: warning Update to DSF 1.7.0 first -When upgrading from DSF version < 1.7.0 it is important to migrate to [DSF 1.7.0 first](/v1.7.0/maintain/upgrade-from-1). +When upgrading from DSF version < 1.7.0 it is important to migrate to [DSF 1.7.0 first](../../v1.7.0/maintain/upgrade-from-1). ::: diff --git a/docs/src/operations/v2/get-started.md b/docs/src/operations/v2/get-started.md index 6faf8b011..c31e98179 100644 --- a/docs/src/operations/v2/get-started.md +++ b/docs/src/operations/v2/get-started.md @@ -1 +1 @@ -verlinkung auf stabel/latest \ No newline at end of file +add a redirect to latest when released \ No newline at end of file diff --git a/docs/src/security/readme.md b/docs/src/security/readme.md index 93a270cac..db08ebec7 100644 --- a/docs/src/security/readme.md +++ b/docs/src/security/readme.md @@ -5,9 +5,9 @@ icon: safe We take security of the DSF, its process plugins, services and tools we operate very seriously. -We describe the security mechanisms used by the DSF to implement secure communication on the pages [Architecture](https://dsf.dev/intro/info/architecture.html), [Security](https://dsf.dev/intro/info/security.html) and [Allow List](https://dsf.dev/intro/info/allowList.html). +We describe the security mechanisms used by the DSF to implement secure communication on the pages [Architecture](/explore/concepts/architecture), [Security](/explore/concepts/security) and [Allow List](/explore/concepts/allow-list). -To ensure a high level of security, you should always install the latest DSF version and use the latest versions of the process plugins. Use the [instructions to install](https://dsf.dev/stable/maintain/install.html) the latest version of the DSF or [to upgrade](https://dsf.dev/stable/maintain/upgrade-from-1.html) on the latest version. The instructions described there implement the security configuration recommended by us. +To ensure a high level of security, you should always install the latest DSF version and use the latest versions of the process plugins. Use the [instructions to install](/operations/v1/latest/maintain/install) the latest version of the DSF or [to upgrade](/operations/v1/latest/maintain/upgrade-from-1) on the latest version. The instructions described there implement the security configuration recommended by us. It is also important that you ensure a secure operating environment in which you verify firewall configurations, keep the operating systems on which the DSF is running up to date and harden it according to the latest state of the art. From 75aa2fbf7572cdfd74f50a5876b162075691e1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Wed, 28 May 2025 11:31:27 +0200 Subject: [PATCH 27/42] Removed old documenation folder --- docs/src/develop/bpmn/conditions.md | 8 - docs/src/develop/bpmn/gateways.md | 16 - docs/src/develop/bpmn/index.md | 15 - docs/src/develop/bpmn/messaging.md | 24 - docs/src/develop/bpmn/sequence-flow.md | 7 - docs/src/develop/bpmn/service-tasks.md | 8 - .../timer-intermediate-catching-events.md | 8 - .../src/develop/dsf/bpmn-process-execution.md | 8 - .../src/develop/dsf/bpmn-process-variables.md | 10 - docs/src/develop/dsf/draft-task-resources.md | 21 - docs/src/develop/dsf/environment-variables.md | 10 - docs/src/develop/dsf/index.md | 20 - docs/src/develop/dsf/message-correlation.md | 10 - docs/src/develop/dsf/message-delegates.md | 15 - .../develop/dsf/organization-identifiers.md | 10 - docs/src/develop/dsf/process-plugin-api.md | 32 - .../develop/dsf/process-plugin-definition.md | 16 - docs/src/develop/dsf/read-access-tag.md | 22 - .../develop/dsf/requester-and-recipient.md | 250 ------ docs/src/develop/dsf/service-delegates.md | 12 - .../dsf/spring-framework-integration.md | 14 - .../develop/dsf/versions-placeholders-urls.md | 38 - docs/src/develop/fhir/activitydefinition.md | 23 - docs/src/develop/fhir/codesystem.md | 12 - docs/src/develop/fhir/index.md | 13 - docs/src/develop/fhir/task.md | 19 - docs/src/develop/fhir/valueset.md | 10 - .../accessing-bpmn-process-variables.md | 10 - ...cessing-task-resources-during-execution.md | 12 - ...-task-input-parameters-to-task-profiles.md | 210 ----- .../guides/configuring-read-access-tags.md | 415 ---------- .../guides/creating-activity-definitions.md | 750 ------------------ .../creating-codesystems-for-dsf-processes.md | 42 - ...ng-task-resources-based-on-a-definition.md | 231 ------ .../creating-valuesets-for-dsf-processes.md | 63 -- docs/src/develop/guides/index.md | 17 - ...-incoming-messages-and-missing-messages.md | 18 - .../setting-targets-for-message-events.md | 14 - .../starting-a-process-via-task-resources.md | 43 - docs/src/develop/index.md | 47 -- 40 files changed, 2523 deletions(-) delete mode 100644 docs/src/develop/bpmn/conditions.md delete mode 100644 docs/src/develop/bpmn/gateways.md delete mode 100644 docs/src/develop/bpmn/index.md delete mode 100644 docs/src/develop/bpmn/messaging.md delete mode 100644 docs/src/develop/bpmn/sequence-flow.md delete mode 100644 docs/src/develop/bpmn/service-tasks.md delete mode 100644 docs/src/develop/bpmn/timer-intermediate-catching-events.md delete mode 100644 docs/src/develop/dsf/bpmn-process-execution.md delete mode 100644 docs/src/develop/dsf/bpmn-process-variables.md delete mode 100644 docs/src/develop/dsf/draft-task-resources.md delete mode 100644 docs/src/develop/dsf/environment-variables.md delete mode 100644 docs/src/develop/dsf/index.md delete mode 100644 docs/src/develop/dsf/message-correlation.md delete mode 100644 docs/src/develop/dsf/message-delegates.md delete mode 100644 docs/src/develop/dsf/organization-identifiers.md delete mode 100644 docs/src/develop/dsf/process-plugin-api.md delete mode 100644 docs/src/develop/dsf/process-plugin-definition.md delete mode 100644 docs/src/develop/dsf/read-access-tag.md delete mode 100644 docs/src/develop/dsf/requester-and-recipient.md delete mode 100644 docs/src/develop/dsf/service-delegates.md delete mode 100644 docs/src/develop/dsf/spring-framework-integration.md delete mode 100644 docs/src/develop/dsf/versions-placeholders-urls.md delete mode 100644 docs/src/develop/fhir/activitydefinition.md delete mode 100644 docs/src/develop/fhir/codesystem.md delete mode 100644 docs/src/develop/fhir/index.md delete mode 100644 docs/src/develop/fhir/task.md delete mode 100644 docs/src/develop/fhir/valueset.md delete mode 100644 docs/src/develop/guides/accessing-bpmn-process-variables.md delete mode 100644 docs/src/develop/guides/accessing-task-resources-during-execution.md delete mode 100644 docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md delete mode 100644 docs/src/develop/guides/configuring-read-access-tags.md delete mode 100644 docs/src/develop/guides/creating-activity-definitions.md delete mode 100644 docs/src/develop/guides/creating-codesystems-for-dsf-processes.md delete mode 100644 docs/src/develop/guides/creating-task-resources-based-on-a-definition.md delete mode 100644 docs/src/develop/guides/creating-valuesets-for-dsf-processes.md delete mode 100644 docs/src/develop/guides/index.md delete mode 100644 docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md delete mode 100644 docs/src/develop/guides/setting-targets-for-message-events.md delete mode 100644 docs/src/develop/guides/starting-a-process-via-task-resources.md delete mode 100644 docs/src/develop/index.md diff --git a/docs/src/develop/bpmn/conditions.md b/docs/src/develop/bpmn/conditions.md deleted file mode 100644 index 41447df07..000000000 --- a/docs/src/develop/bpmn/conditions.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Conditions -icon: creative ---- - -### Conditions - -[Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) allow you to change the behaviour of BPMN processes during execution. There are two ways you are able to add decision logic to Conditions. The [Camunda Modeler](https://camunda.com/download/modeler/) refers to them as `Type`. You can find them in the ``Condition`` tab of certain BPMN elements. The first one is `Script`. This allows you to add arbitrary complexity to your decisions logic and is rarely used for process plugins. The more common Type is `Expression`. Expressions have the following syntax: `${expression}`. An example of a simple expression would be a boolean condition like `var == true`. For this to work during BPMN process execution, the variable you want to use for the boolean condition must be available in the BPMN process variables before [Sequence Flow](sequence-flow.md) reaches the evaluation of the expression. You can learn more advanced features of Expressions [here](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/). \ No newline at end of file diff --git a/docs/src/develop/bpmn/gateways.md b/docs/src/develop/bpmn/gateways.md deleted file mode 100644 index 630b26ae0..000000000 --- a/docs/src/develop/bpmn/gateways.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Gateways -icon: creative ---- - -### Gateways - -[Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/) allow you to control the [Sequence Flow](sequence-flow.md). Different types of gateways are useful for different scenarios. - -#### Exclusive Gateways - -[Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) allow you to decide which [Sequence Flow](sequence-flow.md) should be followed based on [conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions). [Conditions](https://docs.camunda.org/manual/7.21/user-guide/process-engine/expression-language/#conditions) are not part of the [Exclusive Gateways](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/) themselves. You set them through the sequence flow exiting the [Exclusive Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/exclusive-gateway/). In the [Camunda Modeler](https://camunda.com/download/modeler/), you can add conditions to [Sequence Flow](sequence-flow.md) by selecting a [Sequence Flow](sequence-flow.md) and opening the `Condition` tab. You can find more information on how to use Conditions [here](conditions.md). - -#### Event-based Gateway - -The [Event-based Gateway](https://docs.camunda.org/manual/7.21/reference/bpmn20/gateways/event-based-gateway/) allows you model scenarios where you are expecting one out of a number of events to occur. \ No newline at end of file diff --git a/docs/src/develop/bpmn/index.md b/docs/src/develop/bpmn/index.md deleted file mode 100644 index d74ae074d..000000000 --- a/docs/src/develop/bpmn/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: BPMN -icon: creative ---- - -## Introduction -The DSF uses BPMN 2.0 to model processes. Specifically, the [Camunda 7](https://docs.camunda.org/manual/7.21/) dialect from the [Camunda Modeler](https://camunda.com/de/download/modeler/). Modeling processes for the DSF requires this modeler or any other modeler which is able to produce the correct Camunda dialect. - -## Details -- [Conditions](conditions.md) -- [Gateways](gateways.md) -- [Messaging](messaging.md) -- [Sequence Flow](sequence-flow.md) -- [Service Tasks](service-tasks.md) -- [Timer Intermediate Catching Events](timer-intermediate-catching-events.md) \ No newline at end of file diff --git a/docs/src/develop/bpmn/messaging.md b/docs/src/develop/bpmn/messaging.md deleted file mode 100644 index 97d05703b..000000000 --- a/docs/src/develop/bpmn/messaging.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Messaging -icon: creative ---- - - -### Messaging - -In order to enable communication with other lanes, pools or even entirely separate processes you need to be able to exchange information. In BPMN, you can use [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) to model this information exchange. Modeling communication with [Message Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/) in the same diagram uses Message Flow. Message Flow is typically represented by a dashed line arrow between BPMN elements with a black (send) or white (receive) envelope icon. The following BPMN collaboration diagram shows message exchange between two processes. - -![BPMN collaboration diagram with two processes using message flow to exchange information between two organizations](/photos/developer-documentation/message_flow.svg) - -#### Message Start Event - -[Message Start Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) allow a BPMN process to be started by an incoming message. In the DSF, all BPMN processes are started via messages. Therefore, you will have to include a [Message Start Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-start-event) at the beginning of all of your BPMN models. - -#### Message Intermediate Throwing Event -[Message Intermediate Throwing Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-throwing-event) are used to send messages during process execution. - -#### Message Intermediate Catching Event -[Message Intermediate Catching Events](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-intermediate-catching-event) serve as the counterpart to [Message Intermediate Throwing Events](messaging.md#message-intermediate-throwing-event). Use them whenever you expect to receive a message from another process or organization during execution. - -#### Message End Event -The [Message End Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/message-events/#message-end-event) will stop the execution of a BPMN process and finish by sending a message. \ No newline at end of file diff --git a/docs/src/develop/bpmn/sequence-flow.md b/docs/src/develop/bpmn/sequence-flow.md deleted file mode 100644 index 3650cc635..000000000 --- a/docs/src/develop/bpmn/sequence-flow.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Sequence Flow -icon: creative ---- - -### Sequence Flow -BPMN 2.0 calls the continuous arrows connecting the BPMN elements in BPMN models, Sequence Flow. Sequence Flow exits one BPMN element and points at the next BPMN element to be processed. diff --git a/docs/src/develop/bpmn/service-tasks.md b/docs/src/develop/bpmn/service-tasks.md deleted file mode 100644 index ebe8ad3c9..000000000 --- a/docs/src/develop/bpmn/service-tasks.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Service Tasks -icon: creative ---- - -### Service Tasks - -One of the most common types of BPMN Tasks used for modeling DSF processes is the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/). They are different from regular BPMN Tasks in that they offer the ability to link an implementation to the [Service Task](https://docs.camunda.org/manual/7.21/reference/bpmn20/tasks/service-task/) which can be called and executed by a BPMN engine. The BPE (Business Process Engine) server of the DSF leverages this engine to execute your BPMN processes. \ No newline at end of file diff --git a/docs/src/develop/bpmn/timer-intermediate-catching-events.md b/docs/src/develop/bpmn/timer-intermediate-catching-events.md deleted file mode 100644 index 49ab4a8fc..000000000 --- a/docs/src/develop/bpmn/timer-intermediate-catching-events.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Timer Intermediate Catching Events -icon: creative ---- - -### Timer Intermediate Catching Events - -A [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event) allows you to model stopwatch behavior. A timer is started once the BPMN execution arrives at the event. The duration until the timer runs out is specified using the [ISO 8601 Durations](http://en.wikipedia.org/wiki/ISO_8601#Durations) format. Examples can be found [here](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#time-duration). After running out, the BPMN process executes the [Sequence Flow](sequence-flow.md) following the [Timer Intermediate Catching Event](https://docs.camunda.org/manual/7.21/reference/bpmn20/events/timer-events/#timer-intermediate-catching-event). \ No newline at end of file diff --git a/docs/src/develop/dsf/bpmn-process-execution.md b/docs/src/develop/dsf/bpmn-process-execution.md deleted file mode 100644 index 8884106e0..000000000 --- a/docs/src/develop/dsf/bpmn-process-execution.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: BPMN Process Execution -icon: creative ---- - -### BPMN Process Execution - -The BPMN process execution is the in-memory representation of a running BPMN process. BPMN processes have their executions structured as a tree hierarchy. Each BPMN process starts with the [process instance](https://docs.camunda.org/manual/7.21/user-guide/process-engine/process-engine-concepts/#process-instances) as its root level execution. If, for example, this root execution reaches a parallel gateway with two paths, it would spawn two child executions under itself for them to process all tasks along their paths on their own. Executions can access all the BPMN elements from the BPMN model as well as the [BPMN process variables](bpmn-process-variables.md). You have access to this representation in your Java code through the `execution` parameter when overriding certain methods in [Service](service-delegates.md) / [Message](message-delegates.md) Delegates like `doExecute` or `getAdditionalInputParameters`. \ No newline at end of file diff --git a/docs/src/develop/dsf/bpmn-process-variables.md b/docs/src/develop/dsf/bpmn-process-variables.md deleted file mode 100644 index 6170e1b1e..000000000 --- a/docs/src/develop/dsf/bpmn-process-variables.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: BPMN Process Variables -icon: creative ---- - -### BPMN Process Variables - -BPMN process variables hold additional information which has to be available during BPMN process execution. Variables can be directly related to BPMN elements like the boolean value for [Conditions](../bpmn/conditions.md), but do not have to be. BPMN process variables are stored as key-value pairs with the key being the variable name. They are accessible during the entirety of the execution to all [Service](service-delegates.md) / [Message](message-delegates.md) Delegates. - -You can learn how to access to the BPMN process variables [here](../guides/accessing-bpmn-process-variables.md). \ No newline at end of file diff --git a/docs/src/develop/dsf/draft-task-resources.md b/docs/src/develop/dsf/draft-task-resources.md deleted file mode 100644 index c1bcaa28c..000000000 --- a/docs/src/develop/dsf/draft-task-resources.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Draft Task Resources -icon: creative ---- - -### Draft Task Resources - -[Task](../fhir/task.md) resources with status `draft` are used to create the DSF FHIR server's functionality of starting processes via its web interface. They are stored in `.../tutorial-process/src/main/resources/fhir/Task`. Compared to regular [Task](../fhir/task.md) resources used to start BPMN processes, this type of [Task](../fhir/task.md) resource requires the status `draft` instead the usual `requested`. It also replaces the value for `authoredOn` with the placeholder `#{date}`, the values of organization identifiers with the placeholder `#{organization}` and all instances of version numbers with `#{version}`. Additionally, it requires setting the `Task.identifier` element. It should look something like this: - -```xml -<identifier> - <system value="http://dsf.dev/sid/task-identifier" /> - <value value="http://dsf.dev/bpe/Process/processKey/#{version}/task-name" /> -</identifier> -``` -`processKey` should be the same one used in [URLs](versions-placeholders-urls.md#urls). -`task-name` can be any String you wish to identify this task with. E.g. you can use the file name of the Draft Task. - -For a complete example you can take a look at the Draft Task Resource in one of the solution branches and compare it to the one needed for cURL. The [Task](../fhir/task.md) resource created for cURL can be found at `.../tutorial-process/src/main/resources/example-task.xml`. - -You might also want to check out [this guide](../guides/creating-task-resources-based-on-a-definition.md) if you do not know how to create [Task](../fhir/task.md) resources in general. \ No newline at end of file diff --git a/docs/src/develop/dsf/environment-variables.md b/docs/src/develop/dsf/environment-variables.md deleted file mode 100644 index fcea6697c..000000000 --- a/docs/src/develop/dsf/environment-variables.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Environment Variables -icon: creative ---- - -### Environment Variables - -Environment variables offer a way to make configuration data available at the start of a [BPMN process execution](bpmn-process-execution.md). They are the same for all running process instances. They can be defined by adding a member variable with the [Spring-Framework @Value](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations) annotation to the configuration class `TutorialConfig`. The value of the annotation uses the `${..}` notation and follows the form `${some.property:defaultValue}`, where each dot in the property name corresponds to an underscore in the equivalent environment variable. Environment variables are always written upper-case. The property `some.property` therefore corresponds to the environment variable `SOME_PROPERTY`. - -The DSF provides a feature to automatically generate documentation of environment variables during the Maven build process. You can use the `@ProcessDocumentation` annotation to automatically generate Markdown documentation for all fields with this annotation. You simply have to add [dsf-tools-documentation-generator](https://mvnrepository.com/artifact/dev.dsf/dsf-tools-documentation-generator) as a maven plugin. You can take a look at the `pom.xml` for the `tutorial-process` submodule [here](https://github.com/datasharingframework/dsf-process-tutorial/blob/main/tutorial-process/pom.xml) to see how you can add it to your own project. Keep in mind to point the `<workingPackage>` field to the package you want documentation for. \ No newline at end of file diff --git a/docs/src/develop/dsf/index.md b/docs/src/develop/dsf/index.md deleted file mode 100644 index f70d7104e..000000000 --- a/docs/src/develop/dsf/index.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: DSF -icon: creative ---- - -## Details -- [BPMN Process Execution](bpmn-process-execution.md) -- [BPMN Process Variables](bpmn-process-variables.md) -- [Draft Task Resources](draft-task-resources.md) -- [Environment Variables](environment-variables.md) -- [Message Correlation](message-correlation.md) -- [Message Delegates](message-delegates.md) -- [Organization Identifiers](organization-identifiers.md) -- [Process Plugin API](process-plugin-api.md) -- [Process Plugin Definition](process-plugin-definition.md) -- [Read Access Tag](read-access-tag.md) -- [Requester and Recipient](requester-and-recipient.md) -- [Service Delegates](service-delegates.md) -- [Spring Framework Integration](spring-framework-integration.md) -- [Versions, Placeholders and URLs](versions-placeholders-urls.md) \ No newline at end of file diff --git a/docs/src/develop/dsf/message-correlation.md b/docs/src/develop/dsf/message-correlation.md deleted file mode 100644 index 23b18e3e3..000000000 --- a/docs/src/develop/dsf/message-correlation.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Message Correlation -icon: creative ---- - -### Message Correlation - -In order for messages to be able to be sent back and forth between organizations with potentially multiple of the same process plugin instances running at the same time and still arriving at the correct process instance, we need some mechanism to map messages to their rightful process instance. This mechanism is called Message Correlation and requires attaching a unique identifier to every process instance. This identifier is called the `business-key`. The `business-key` will get attached to every outgoing message automatically. - -It is possible that the `business-key` is insufficient to map messages to the correct process instance. This happens when you use subprocesses in your BPMN model which all expect messages to be sent to them, not the parent process. To solve this issue, [Task](../fhir/task.md) resources also come with an [Input Parameter](../fhir/task.md#task-input-parameters) called `correlation-key`. This is a secondary identifier you can attach to all messages if you need them to arrive at a specific subprocess. You can learn more about how `correlation-keys` are used by studying the [Ping-Pong Process](https://github.com/datasharingframework/dsf-process-ping-pong). \ No newline at end of file diff --git a/docs/src/develop/dsf/message-delegates.md b/docs/src/develop/dsf/message-delegates.md deleted file mode 100644 index 61a1a06f1..000000000 --- a/docs/src/develop/dsf/message-delegates.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Message Delegates -icon: creative ---- - -### Message Delegates - -Message Delegates are the Java representation of the [Message Events](../bpmn/messaging.md) in your BPMN model. You link a Message Delegate to a certain [Message Event](../bpmn/messaging.md) by selecting the Message Event in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: -``` -org.package.myClass -``` - -You will only need Message Delegates for [Message Send Events](../bpmn/messaging.md). Incoming messages will be resolved to the correct [BPMN process execution](bpmn-process-execution.md) automatically using [Message Correlation](message-correlation.md) and the message inputs will be added to that execution's [process variables](bpmn-process-variables.md). - -To make a Message Delegate for [Message Send Events](../bpmn/messaging.md), your Java class needs to extend `AbstractTaskMessageSend`. Most of the time, you will not be adding any processing logic to your Message Delegates, therefore you usually won't be overwriting the `doExecute` method like with [Service Delegates](service-delegates.md). Instead, you most likely want to aggregate the information you processed in earlier steps and attach it to a message. For this you need to overwrite the `getAdditionalInputParamters` method. The DSF translates BPMN messages into FHIR [Task](../fhir/task.md) resources to execute the communication modeled by your BPMN diagrams. The information you are sending to another BPMN process is specified in the Task.input elements a.k.a. [Input Parameters](../fhir/task.md#task-input-parameters), hence the name of the method. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). diff --git a/docs/src/develop/dsf/organization-identifiers.md b/docs/src/develop/dsf/organization-identifiers.md deleted file mode 100644 index 70d143150..000000000 --- a/docs/src/develop/dsf/organization-identifiers.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Organization Identifiers -icon: creative ---- - -### Organization Identifiers -DSF FHIR server instances always have something called an `organization identifer`. It uniquely identifies the organization the DSF FHIR server instance belongs to for its [Allow-List mechanism](https://dsf.dev/intro/info/allowList.html). It is configured as an [environment variable](https://dsf.dev/stable/maintain/fhir/configuration.html#dev-dsf-fhir-server-organization-identifier-value). You can make a GET request to `https://domain/fhir/Organization` to get a list of all organizations for the DSF FHIR server instance running under `domain`. The results will also include the `organization identifier` of each organization. - -#### Organization Identifiers in Task Resources -[Task](../fhir/task.md) resources require you to reference an organization via its identifier as the `Task.requester` and `Task.restriction.recipient` elements. The exact values for these elements depend on the [ActivityDefinition](../fhir/activitydefinition.md) the [Task](../fhir/task.md) resource should conform to. As a general rule, you will want to put the identifier of your own organization as the `Task.requester` and `Task.restriction.recipient` elements for [Task](../fhir/task.md) resources which initially start processes. All other cases depend on the context of the message being sent during process execution. \ No newline at end of file diff --git a/docs/src/develop/dsf/process-plugin-api.md b/docs/src/develop/dsf/process-plugin-api.md deleted file mode 100644 index 5d1381a5a..000000000 --- a/docs/src/develop/dsf/process-plugin-api.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Process Plugin API -icon: creative ---- - -### Process Plugin API v1 Maven Module - -The [DSF Process Plugin API module](https://mvnrepository.com/artifact/dev.dsf/dsf-bpe-process-api-v1) consists of a set of utility classes designed to provide easy access to solutions for process plugin use cases. This includes for example the `Variables` class, which provides access to the [BPMN process variables](bpmn-process-variables.md). - -Maven Dependency: - -```xml -<dependencies> - <dependency> - <groupId>dev.dsf</groupId> - <artifactId>dsf-bpe-process-api-v1</artifactId> - <version>${dsf.version}</version> - <scope>provided</scope> - </dependency> -</dependencies> -``` - -#### Process Plugin Api -When creating [Service Delegates](service-delegates.md) or [Message Delegates](message-delegates.md) you wil notice that you need to provide a constructor which expects a `ProcessPluginApi` object and forward it to the superclasses' constructor. -This API instance provides a variety of utility classes: -- `ProxyConfig`**:** forward proxy configuration -- `EndpointProvider`**:** access to Endpoint resources -- `FhirContext`**:** HAPI FHIR Context for parsing/serializing -- `FhirWebserviceClientProvider`**:** Webservice client to access DSF FHIR server -- `MailService`**:** for sending automatic E-Mails (if configured) -- `OrganizationProvider`**:** access to Organization resources -- `Variables`**:** access to BPMN execution variables \ No newline at end of file diff --git a/docs/src/develop/dsf/process-plugin-definition.md b/docs/src/develop/dsf/process-plugin-definition.md deleted file mode 100644 index a13bdbe26..000000000 --- a/docs/src/develop/dsf/process-plugin-definition.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Process Plugin Definition -icon: creative ---- - -### Process Plugin Definition - -In order for the DSF BPE server to load your plugin you need to provide it with the following information: -* A plugin [version](versions-placeholders-urls.md#version-pattern) -* A release date -* A plugin name -* The BPMN model files -* The FHIR resources grouped by BPMN process ID. Your plugin may have any number of BPMN models. Each has their own BPMN process ID and FHIR resources specific to that BPMN process (think [Task](../fhir/task.md) resources needed for messages specific to that BPMN model) -* The Class holding your [Spring Framework Configuration](spring-framework-integration.md) - -You will provide this information by implementing the `dev.dsf.bpe.ProcessPluginDefinition` interface. The DSF BPE server then searches for classes implementing this interface using the Java [ServiceLoader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html) mechanism. Therefore, you will have to register your interface implementation in the `src/main/resources/META-INF/services/dev.dsf.bpe.ProcessPluginDefinition` file. For this tutorial, the class implementing the `ProcessPluginDefinition` interface, `TutorialProcessPluginDefinition`, has already been added to the file. You can use it as a reference for later when you want to create your own plugin. \ No newline at end of file diff --git a/docs/src/develop/dsf/read-access-tag.md b/docs/src/develop/dsf/read-access-tag.md deleted file mode 100644 index 47a02b2c1..000000000 --- a/docs/src/develop/dsf/read-access-tag.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Read Access Tag -icon: creative ---- - -### Read Access Tag - -Axiomatically, nobody is allowed to write FHIR resources (except [Task](../fhir/task.md)) to the DSF FHIR server unless it is your own organization. By default, the same applies to reading FHIR resources (again except [Task](../fhir/task.md)). But since the DSF is often used to offer medical data in form of FHIR resources, you will find yourself wanting other organizations to be allowed to read the resources you are offering. The `Resource.meta.tag` element is used define access rules for all FHIR resources in the DSF, with the exception of [Task](../fhir/task.md) resources. We will explain the reason for this exception shortly. For example, allowing read access for all organizations, you would use the following `system` and `code` in your FHIR resource: - -```xml -<meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> -</meta> -``` -You can find all codes for the Read Access Tag in its [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml). - -The read access rules for [Task](../fhir/task.md) resources are defined through the `requester` and `recipient` elements of the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) in your plugin's [ActivityDefinitions](../fhir/activitydefinition.md). Therefore, no `read-access-tag` is needed. - -It is also possible to restrict read access of FHIR resources to organizations with a specific role in a parent organization or a specific identifier. If you want to find out more, you may look at the [guide on configuring the Read Access Tag](../guides/configuring-read-access-tags.md). diff --git a/docs/src/develop/dsf/requester-and-recipient.md b/docs/src/develop/dsf/requester-and-recipient.md deleted file mode 100644 index 8407bb318..000000000 --- a/docs/src/develop/dsf/requester-and-recipient.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: Requester and Recipient -icon: creative ---- - -### Requester and Recipient Elements - -Below you will find a set of examples for each Coding used by `requester` and `recipient` elements from the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). CodeSystems referenced in the examples can be found [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem). Use this collection as a reference point when creating your own [ActivityDefinitions](../fhir/activitydefinition.md). - -#### Requester -The `requester` element uses one of the following Codings: -```xml -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all-practitioner|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization-practitioner|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role-practitioner|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-all|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-organization|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-parent-organization-role|1.0.0" /> -``` - -##### Local All -```xml -<extension url="requester"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ALL" /> - </valueCoding> -</extension> -``` - -##### Local All Practitioner -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-practitioner"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ALL_PRACTITIONER" /> - </valueCoding> -</extension> -``` - -##### Local Organization -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ORGANIZATION" /> - </valueCoding> -</extension> -``` - -##### Local Organization Practitioner -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ORGANIZATION_PRACTITIONER" /> - </valueCoding> -</extension> -``` - -##### Local Parent Organization Role -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ROLE" /> - </valueCoding> -</extension> -``` - -##### Local Parent Organization Role Practitioner -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role-practitioner"> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ROLE_PRACTITIONER" /> - </valueCoding> -</extension> -``` - -##### Remote All -```xml -<extension url="requester"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="REMOTE_ALL" /> - </valueCoding> -</extension> -``` - -##### Remote Organization -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="REMOTE_ORGANIZATION" /> - </valueCoding> -</extension> -``` - -##### Remote Parent Organization Role -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="REMOTE_ROLE" /> - </valueCoding> -</extension> -``` - -#### Recipient -The `recipeint` element uses one of the following Codings: -```xml -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> -<profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> -``` - -##### Local All -```xml -<extension url="recipient"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ALL" /> - </valueCoding> -</extension> -``` - -##### Local Organization -```xml -<extension url="recipient"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ORGANIZATION" /> - </valueCoding> -</extension> -``` - -##### Local Parent Organization Role -```xml -<extension url="recipient"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Parent_Organization"/> <!-- example, replace appropriately --> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> <!-- example, replace appropriately --> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - <code value="LOCAL_ROLE" /> - </valueCoding> -</extension> -``` diff --git a/docs/src/develop/dsf/service-delegates.md b/docs/src/develop/dsf/service-delegates.md deleted file mode 100644 index 278b51e34..000000000 --- a/docs/src/develop/dsf/service-delegates.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Service Delegates -icon: creative ---- - -### Service Delegates - -Service Delegates are the Java representation of the [Service Tasks](../bpmn/service-tasks.md) in your BPMN model. You link a Service Delegate to a certain [Service Task](../bpmn/service-tasks.md) by selecting the [Service Task](../bpmn/service-tasks.md) in the [Camunda Modeler](https://camunda.com/download/modeler/) and adding a Java class to the `Implementation` field. Make sure you use the fully qualified class name. Like this: -``` -org.package.myClass -``` -All that is left is for your Java class to extend `AbstractServiceDelegate` and override the `doExecute` method. This is the place where you can put your actual business logic. The method will be called when the [BPMN process execution](bpmn-process-execution.md) arrives at the [Service Task](../bpmn/service-tasks.md) your Service Delegate is linked to. The constructor of your delegate class should also forward a `ProcessPluginApi` instance to its superclass constructor. You can learn more about the `ProcessPluginApi` [here](process-plugin-api.md). \ No newline at end of file diff --git a/docs/src/develop/dsf/spring-framework-integration.md b/docs/src/develop/dsf/spring-framework-integration.md deleted file mode 100644 index 55f96f342..000000000 --- a/docs/src/develop/dsf/spring-framework-integration.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Spring Framework Integration -icon: creative ---- - -### Spring Framework Integration - -Since the DSF also employs the use of the [Spring Framework](https://spring.io/projects/spring-framework) you will also have to provide some Spring functionality. When deployed, every process plugin exists in its own [Spring context](https://docs.spring.io/spring-framework/reference/core/beans/introduction.html). To make the process plugin work, you have to provide [Spring Beans](https://docs.spring.io/spring-framework/reference/core/beans/definition.html) with `prototype` [scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) for all classes which either extend or implement the following classes/interfaces (as of version 1.4.0): -- `AbstractTaskMessageSend` -- `AbstractServiceDelegate` -- `DefaultUserTaskListener` -- `ProcessPluginDeploymentStateListener` - -A [Spring-Framework configuration class](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java-basic-concepts) located in `spring/config` is expected to provide the Spring Beans. For this tutorial, the `TutorialConfig` class will take this role. If you are unfamiliar with the Spring Framework, you might want to check out the chapter [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) of the Spring Framework documentation, specifically the topics [Using the @Bean Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/bean-annotation.html) and [Using the @Configuration Annotation](https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html). \ No newline at end of file diff --git a/docs/src/develop/dsf/versions-placeholders-urls.md b/docs/src/develop/dsf/versions-placeholders-urls.md deleted file mode 100644 index 0381ec629..000000000 --- a/docs/src/develop/dsf/versions-placeholders-urls.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Versions, Placeholders and URLs -icon: creative ---- - -### Versions, Placeholders and URLs - -#### Version Pattern - -Process plugin versions have to obey the pattern: -``` -\d+\.\d+\.\d+\.\d+ Example: 1.2.3.4 -``` - -The first two numbers (`1.2`) are used in FHIR resources and signal changes which break compatibility with previous process versions. For example, altering FHIR resources usually results in a breaking change. The latter two (`3.4`) signal changes which do not break compatibility with previous process versions. Specifically, the 4th number is reserved for bug-fixes and the 3rd number includes all other non-breaking changes. - -#### Placeholders - -To avoid specifying the version and release date in multiple files, the placeholders `#{version}` and `#{date}` can be used within FHIR resources and BPMN models. They are replaced with the values returned by the methods `ProcessPluginDefinition#getResourceVersion` and `ProcessPluginDefinition#getReleaseDate` respectively during deployment of a process plugin by the DSF BPE server. There is also a placeholder for the organization the DSF instance is running in: `#{organization}`, typically use in [Draft Task Resources](draft-task-resources.md). - -#### URLs - -BPMN models have an ID call process definition key. The BPMN process definition key needs to be specified following the pattern: -``` -^[-a-zA-Z0-9]+_[-a-zA-Z0-9]+$ Example: domainorg_processKey -``` -In addition, the BPMN model needs to specify a version. You should be using the ``#{version}`` [placeholder](#placeholders) for this as well. The DSF will also reference this process in URL form in FHIR resources: -``` -http://domain.org/bpe/Process/processKey|1.2 -``` - -As you can see, the version in the URL ``|1.2`` only uses the resource version and omits the code base version. As mentioned in [Version Pattern](#version-pattern), this means that only changes to the first two version numbers are significant to signal compatibility when communicating with other process plugin instances. The process definition key and URL are also related to each other. The DSF will try to match BPMN models to FHIR resources by transforming the URL into a process definition key. That is why it is important you obey the pattern above. - -You will use the above URL as your instantiatesCanonical value for [Task](../fhir/task.md) profile definitions as well as references to [Task](../fhir/task.md) profiles in other resources. You will also use it as the URL value for your [ActivityDefinitions](../fhir/activitydefinition.md). In this case though, you have to split up the URL into two parts. You will separate the version (``|1.2``) from the URL and use it as a value for the `ActivityDefinition.version` element. Since it refers to the plugin's resource version, you should also use the `#{version}` [placeholder](#placeholders) here instead. Going by the example from above, you will be left with a URL that looks like this: -``` -http://domain.org/bpe/Process/processKey -``` -This will be the value for your `ActivityDefinition.url` element with `#{version}` as the value for your `ActivityDefinition.version` element. \ No newline at end of file diff --git a/docs/src/develop/fhir/activitydefinition.md b/docs/src/develop/fhir/activitydefinition.md deleted file mode 100644 index 5cd27ca91..000000000 --- a/docs/src/develop/fhir/activitydefinition.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: ActivityDefinition -icon: creative ---- - -### ActivityDefinition - -[ActivityDefinitions](http://hl7.org/fhir/R4/activitydefinition.html) are used by the DSF to advertise which processes are available at any given instance and who is allowed to request and who is allowed to execute a process. The DSF defined elements for this purpose in the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile. - - -The most important elements in ActivityDefinitions are: -- `message-name` -- `task-profile` -- `requester` -- `recipient` - -The `message-name` element contains the name of the [BPMN message start event](../bpmn/messaging.md#message-start-event) or [BPMN message intermediate catching event](../bpmn/messaging.md#message-intermediate-catching-event) which expects a [Task](task.md) resource complying to the profile defined by `task-profile`. - -The `requester` and `recipient` elements define the organisation(s) or person(s) who are allowed to request or receive the message specified by `message-name`. The receiving DSF instance is the one who will execute the process connected to the message. - -You will have to create your own [ActivityDefinitions](activitydefinition.md) when developing a process plugin. If you are fluent in reading XML FHIR definitions and translating them into XML resources, you can take a look at the DSF's profile for ActivityDefinitions [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml). ActivityDefinitions also reference other resource definitions. Depending on the resource, you will find them in one of [these folders](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). If you are not as comfortable with these requirements you might want to check out the guide on [creating ActivityDefinitions](../guides/creating-activity-definitions.md). - -You can also find examples for all possible `requester` and `recipient` elements [here](../dsf/requester-and-recipient.md). \ No newline at end of file diff --git a/docs/src/develop/fhir/codesystem.md b/docs/src/develop/fhir/codesystem.md deleted file mode 100644 index e40a365f2..000000000 --- a/docs/src/develop/fhir/codesystem.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: CodeSystem -icon: creative ---- - -### CodeSystem - -[CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) usually represent a set of concepts which can be assigned to a code (think LOINC). If you want to use a Code in a resource, you will usually include them in a [ValueSet](valueset.md). - -Plugin development for the DSF requires the use of [CodeSystems](https://www.hl7.org/fhir/R4/codesystem.html) in two major ways: -1. Using existing [DSF CodeSystems](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem) in other FHIR resources like the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). -2. Creating your own CodeSystem to add additional [Input Parameters](task.md#task-input-parameters) to your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/develop/fhir/index.md b/docs/src/develop/fhir/index.md deleted file mode 100644 index 47e4a6cda..000000000 --- a/docs/src/develop/fhir/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: FHIR -icon: creative ---- - -## Introduction -The DSF uses a variety of [FHIR resources](https://dsf.dev/intro/info/basics.html#why-are-we-using-fhir-and-bpmn). The DSF uses XML as the format for FHIR resources. The most important resources for plugin development are [ActivityDefinitions](activitydefinition.md), [CodeSystems](codesystem.md), [Tasks](task.md) and [ValueSets](valueset.md). There is also a catalog of DSF-specific FHIR resources including CodeSystems, ValueSets and Extensions. For now, you can find them in the official DSF GitHub repository [here](https://github.com/datasharingframework/dsf/tree/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir). - -## Details -- [ActivityDefinition](activitydefinition.md) -- [CodeSystem](codesystem.md) -- [Task](task.md) -- [ValueSet](valueset.md) \ No newline at end of file diff --git a/docs/src/develop/fhir/task.md b/docs/src/develop/fhir/task.md deleted file mode 100644 index a647fc46c..000000000 --- a/docs/src/develop/fhir/task.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Task -icon: creative ---- - -### Task - -The [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource enables the DSF's distributed communication. Whenever a BPMN process instance communicates with a different process instance, the DSF will create a Task resource based on parameters you set in the BPMN model and during execution. It will then automatically send the Task resource to the recipient to start or continue whatever process the Task resource referred to. All Task resources used in the DSF derive from the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). This profile includes a splicing for `Task.input` with three additional [Input Parameters](task.md#task-input-parameters): -- `message-name` -- `business-key` -- `correlation-key` - -When creating your own plugin, you will want to create your own profiles based on the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). - -#### Task Input Parameters - -Task Input Parameters allow you to add additional information to [Task](task.md#task) resources. For example, if your particular data exchange requires additional medical data, you would add a slice to your Task profile in the same way the [dsf-task-base](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml) adds slices to the original [FHIR Task](https://www.hl7.org/fhir/R4/task.html) resource. Notice that this also requires creating a [CodeSystem](codesystem.md) and including it in a [ValueSet](valueset.md) to be able to use it in the Task resource. - -If these instructions are insufficient you can check out the guide on [how to add Task Input Parameters](../guides/adding-task-input-parameters-to-task-profiles.md). \ No newline at end of file diff --git a/docs/src/develop/fhir/valueset.md b/docs/src/develop/fhir/valueset.md deleted file mode 100644 index 6be03a3fb..000000000 --- a/docs/src/develop/fhir/valueset.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: ValueSet -icon: creative ---- - -### ValueSet - -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) bind codes from [CodeSystems](codesystem.md) to coded elements like `code`, `Coding` or `CodeableConcept`. - -[ValueSets](https://www.hl7.org/fhir/R4/valueset.html) are mostly needed to use the [Concepts](https://www.hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.concept) from [CodeSystems](codesystem.md) in your [Task](task.md) profiles. \ No newline at end of file diff --git a/docs/src/develop/guides/accessing-bpmn-process-variables.md b/docs/src/develop/guides/accessing-bpmn-process-variables.md deleted file mode 100644 index f03bee5d0..000000000 --- a/docs/src/develop/guides/accessing-bpmn-process-variables.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Accessing BPMN Process Variables -icon: creative ---- - -### Accessing BPMN Process Variables - -After creating a [Service Delegate](../dsf/service-delegates.md) or [Message Delegate](../dsf/message-delegates.md), you might want to retrieve data from or store data in the [BPMN process variables](../dsf/bpmn-process-variables.md). You can achieve this either through the [BPMN process execution](../dsf/bpmn-process-execution.md) or via the `Variables` class. *It is very much recommended to use the latter method*. - -The `Variables` class provides lots of utility methods to read or write certain types of [BPMN process variables](../dsf/bpmn-process-variables.md). If for some reason you need to fall back on the [BPMN process execution](../dsf/bpmn-process-execution.md) to solve your problem, we would like to learn how the current API of the `Variables` class is limiting you. Contact us, and we might turn it into a feature request ([Contribute](https://dsf.dev/stable/contribute)). diff --git a/docs/src/develop/guides/accessing-task-resources-during-execution.md b/docs/src/develop/guides/accessing-task-resources-during-execution.md deleted file mode 100644 index 196e16381..000000000 --- a/docs/src/develop/guides/accessing-task-resources-during-execution.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Accessing Task Resources During Execution -icon: creative ---- - -### Accessing Task Resources During Execution - -If you want access to the [Task](../fhir/task.md) resources in your [Service](../dsf/service-delegates.md) / [Message](../dsf/message-delegates.md) Delegates, the `Variables` class will provide methods which return certain kinds of [Task](../fhir/task.md) resources. The most commonly used ones are the start [Task](../fhir/task.md), referring to the [Task](../fhir/task.md) / [Message Start Event](../bpmn/messaging.md#message-start-event) responsible for starting the process, and the latest [Task](../fhir/task.md), referring to most recently received [Task](../fhir/task.md) / Message. -In principle, this is sufficient to access all information in a [Task](../fhir/task.md) resource, since you have the [Task](../fhir/task.md) resource's Java object, but very cumbersome. -Instead of navigating the [Task](../fhir/task.md) resource's element tree, you should first try to use the [ProcessPluginApi's](../dsf/process-plugin-api.md) `TaskHelper` in conjunction with the method above. The `TaskHelper` class offers specific methods related to [Task](../fhir/task.md) resources. -The most common use case for this is retrieving data from a [Task's](../fhir/task.md) [Input Parameter](../fhir/task.md#task-input-parameters) or creating a new [Input Parameter](../fhir/task.md#task-input-parameters) for a [Message Delegate's](../dsf/message-delegates.md) `getAdditionalInputParameters` method. When retrieving data from a [Task's](../fhir/task.md) Input Parameter you first have to get to the [Input Parameter](../fhir/task.md#task-input-parameters) you are looking to extract data from. You can use one of the `TaskHelper's` getters for [Input Parameters](../fhir/task.md#task-input-parameters) to find the right one. The methods will try to match the provided [CodeSystem](../fhir/codesystem.md) and Code to any [Input Parameter](../fhir/task.md#task-input-parameters) of the provided [Task](../fhir/task.md) resource. Depending on the method you chose you will for example receive all matches or just the first one. -To create new [Input Parameters](../fhir/task.md#task-input-parameters) to attach to a [Task](../fhir/task.md) resource, you may invoke the `TaskHelper#createInput` method. This is most often used when overriding the `getAdditionalInputParamters` method of you [Message Delegate](../dsf/message-delegates.md). \ No newline at end of file diff --git a/docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md b/docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md deleted file mode 100644 index 7a625d5f4..000000000 --- a/docs/src/develop/guides/adding-task-input-parameters-to-task-profiles.md +++ /dev/null @@ -1,210 +0,0 @@ ---- -title: Adding Task Input Parameters to Task Profiles -icon: creative ---- - -### Adding Task Input Parameters to Task Profiles - -When adding a new [Input Parameter](../fhir/task.md#task-input-parameters) to a [Task](../fhir/task.md) profile, you are essentially adding a new slice to `Task.input`. [Slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) is part of [profiling](https://www.hl7.org/fhir/R4/profiling.html) in FHIR. Profiling lets you create your own FHIR definitions based on pre-existing FHIR definitions. A slicing defines constraints on element lists like `Task.input` e.g. by only allowing the elements to be of certain types. -For example, you might have a list of fruits in a `FruitBasket` resource. Constraining that list to only include fruits of type `Apple`, `Banana` and `Orange` would be considered [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing). -This guide will not cover how slicing works in general, only for the case presented by the DSF FHIR resource context. Our goal will be to add a new [Input Parameter](../fhir/task.md#task-input-parameters) of type `example-input` to the `task-start-dic-process.xml` profile which will be used to submit `integer` values to our `dicProcess`. - -Let us start out by adding a slice to `task-start-dic-process.xml`. Since there is already a slicing defined on `Task.input` by `task-start-dic-process.xml`'s `baseDefinition`, we have to check out this resource first. As a part of the [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement, slicing also uses [Element Definitions](https://www.hl7.org/fhir/R4/elementdefinition.html). -The slicing for `Task.input` is defined in this part of the `baseDefinition`: -```xml -<element id="Task.input"> - <extension url="http://hl7.org/fhir/StructureDefinition/structuredefinition-explicit-type-name"> - <valueString value="Parameter" /> - </extension> - <path value="Task.input" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="type.coding.system" /> - </discriminator> - <discriminator> - <type value="value" /> - <path value="type.coding.code" /> - </discriminator> - <rules value="openAtEnd" /> - </slicing> - <min value="1" /> -</element> -``` -*The resource can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml)* - -We will only need to take a look at the `discrimitator` tag for now. Discriminators define the elements a FHIR processor needs to distinguish slices by. In our case, a processor would look at the values for `type.coding.system` and `type.coding.code` to determine which slice this element belongs to. The discriminator type `value` implies that `type.coding.system` and `type.coding.code` have to be present in all slices and need to have a fixed value. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). - -Let us revisit `task-start-dic-process.xml` and start adding a slice called `example-input` to it: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Task.input:example-input"> - <path value="Task.input" /> - <sliceName value="example-input" /> - <min value="1" /> - <max value="1" /> - </element> - </differential> -</StructureDefinition> -``` -*Irrelevant elements for this guide are hidden by ... placeholders.* - -We have now defined a slice on `Task.input` with the name and id of `example-input` and cardinality of `1..1`. You might want a different cardinality for your use case. We recommend you also take a look at the documentation for [ElementDefinition.id](https://www.hl7.org/fhir/R4/elementdefinition.html#id) and [ElementDefinition.path](https://www.hl7.org/fhir/R4/elementdefinition.html#path). They explain how to create the proper values for these elements. Cardinality is also part of the [element definition](https://www.hl7.org/fhir/R4/elementdefinition.html) hierarchy (see [ElementDefinition.min](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.min) and [ElementDefinition.max](https://www.hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.max)). - -Next up, we need to define the binding for `Task.input:example-input.type`. Because `Task.input.type` is a `CodeableConcept` which uses codings from a [ValueSet](../fhir/valueset.md), the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires us to use `required` as the binding strength: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Task.input:example-input"> - <path value="Task.input" /> - <sliceName value="example-input" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Task.input:example-input.type"> - <path value="Task.input.type" /> - <binding> - <strength value="required"/> - <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> - </binding> - </element> - </differential> -</StructureDefinition> -``` -As you can see, we referenced a [ValueSet](../fhir/valueset.md) in this binding. When adding an actual slice for your use case, you will have to reference an existing [ValueSet](../fhir/valueset.md) resource or create a new one. A guide on how to create them can be found [here](../guides/creating-valuesets-for-dsf-processes.md). - -Since the [discriminator](https://www.hl7.org/fhir/R4/profiling.html#discriminator) requires `Task.input.coding.code` and `Task.input.coding.system` to be present, we will make `Task.input.coding` mandatory as well: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Task.input:example-input"> - <path value="Task.input" /> - <sliceName value="example-input" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Task.input:example-input.type"> - <path value="Task.input.type" /> - <binding> - <strength value="required"/> - <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> - </binding> - </element> - <element id="Task.input:example-input.type.coding"> - <path value="Task.input.type.coding"/> - <min value="1" /> - </element> - </differential> -</StructureDefinition> -``` - -In the beginning we mentioned how `Task.input.type.coding.system` and `Task.input.type.coding.code` have to use fixed values. Here is how we accomplish this: - -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Task.input:example-input"> - <path value="Task.input" /> - <sliceName value="example-input" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Task.input:example-input.type"> - <path value="Task.input.type" /> - <binding> - <strength value="required"/> - <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> - </binding> - </element> - <element id="Task.input:example-input.type.coding"> - <path value="Task.input.type.coding"/> - <min value="1" /> - </element> - <element id="Task.input:example-input.type.coding.system"> - <path value="Task.input.type.coding.system"/> - <min value="1"/> - <fixedUri value="http://dsf.dev/fhir/CodeSystem/example"/> - </element> - <element id="Task.input:example-input.type.coding.code"> - <path value="Task.input.type.coding.code"/> - <min value="1"/> - <fixedCode value="example-input" /> - </element> - </differential> -</StructureDefinition> -``` -*Notice that we also made the two elements mandatory because they are required by the discriminator.* - -For the `type.coding.system` element we referenced a [CodeSystem](../fhir/codesystem.md). The `type.coding.code` element uses a code from this [CodeSystem](../fhir/codesystem.md) called `example-input`. This is the mechanism by which you actually "name" your [Input Parameter](../fhir/task.md#task-input-parameters). The `type.coding.code` value will identify your [Input Parameter](../fhir/task.md#task-input-parameters) when you use it in an actual [Task](../fhir/task.md#task-input-parameters) resource. Here is how this would look like: - -```xml -<Task xmlns="http://hl7.org/fhir"> - ... - <input> - <type> - <coding> - <system value="http://dsf.dev/fhir/CodeSystem/example"/> - <code value="example-input" /> - </coding> - </type> - ... - </input> -</Task> -``` - -When adding an actual slice for your use case, you will also need to reference an existing [CodeSystem](../fhir/codesystem.md) resource or create a new one to reference. A guide on how to create them can be found [here](../guides/creating-codesystems-for-dsf-processes.md). - -`Task.input.value[x]` is the actual value you will submit using your Input Parameter. You can make it any of [these](https://www.hl7.org/fhir/R4/datatypes.html#open) data types. This is because `Type.input.value[x]` refers to `*` instead of any particular type in its [definition](https://www.hl7.org/fhir/R4/task-definitions.html#Task.input.value_x_). Let us define it as an `integer` type`: - -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Task.input:example-input"> - <path value="Task.input" /> - <sliceName value="example-input" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Task.input:example-input.type"> - <path value="Task.input.type" /> - <binding> - <strength value="required"/> - <valueSet value="http://dsf.dev/fhir/ValueSet/example" /> - </binding> - </element> - <element id="Task.input:example-input.type.coding"> - <path value="Task.input.type.coding"/> - <min value="1" /> - </element> - <element id="Task.input:example-input.type.coding.system"> - <path value="Task.input.type.coding.system"/> - <min value="1"/> - <fixedUri value="http://dsf.dev/fhir/CodeSystem/example"/> - </element> - <element id="Task.input:example-input.type.coding.code"> - <path value="Task.input.type.coding.code"/> - <min value="1"/> - <fixedCode value="example-input" /> - </element> - <element id="Task.input:example-input.value[x]"> - <path value="Task.input.value[x]"/> - <type> - <code value="integer"/> - </type> - </element> - </differential> -</StructureDefinition> -``` - -Now we have a new Input Parameter of type `example-input` which accepts any `integer` as its value. diff --git a/docs/src/develop/guides/configuring-read-access-tags.md b/docs/src/develop/guides/configuring-read-access-tags.md deleted file mode 100644 index 404f2286e..000000000 --- a/docs/src/develop/guides/configuring-read-access-tags.md +++ /dev/null @@ -1,415 +0,0 @@ ---- -title: Configuring Read Access Tags -icon: creative ---- - -### Configuring Read Access Tags - -To start off, you want to take a look at the [CodeSystem](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-read-access-tag-1.0.0.xml) defined for the [Read Access Tag](../dsf/read-access-tag.md) and choose one of the codes from it: -```xml -<CodeSystem xmlns="http://hl7.org/fhir"> - ... - <url value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - ... - <concept> - <code value="LOCAL"/> - <display value="Local"/> - <definition value="Read access for local users"/> - </concept> - <concept> - <code value="ORGANIZATION"/> - <display value="Organization"/> - <definition value="Read access for organization specified via extension http://dsf.dev/fhir/StructureDefinition/extension-read-access-organization"/> - </concept> - <concept> - <code value="ROLE"/> - <display value="Role"/> - <definition value="Read access for member organizations with role in consortium (parent organization) specified via extension http://dsf.dev/fhir/StructureDefinition/extension-read-access-consortium-role"/> - </concept> - <concept> - <code value="ALL"/> - <display value="All"/> - <definition value="Read access for remote and local users"/> - </concept> -</CodeSystem> -``` - -The codes `LOCAL` and `ALL` are trivial. Their [Read Access Tag](../dsf/read-access-tag.md) would look like this: -```xml -<meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ALL"/> <!-- or value="LOCAL" respectively--> - </tag> -</meta> -``` - -Let us try to configure a Read Access Tag whose code uses an extension. We will choose `ROLE` for this example. We start out the same way as before: -```xml -<meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -The `definition` element of the `ROLE` code references an extension called [dsf-extension-read-access-parent-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-read-access-parent-organization-role-1.0.0.xml). - -The most important part of it is the `differential` statement. It uses [element definitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to describe how we need to implement the extension: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - <element id="Extension.extension"> - <path value="Extension.extension" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="url" /> - </discriminator> - <rules value="open" /> - </slicing> - </element> - <element id="Extension.extension:parentOrganization"> - <path value="Extension.extension" /> - <sliceName value="parentOrganization" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:parentOrganization.url"> - <path value="Extension.extension.url" /> - <fixedUri value="parent-organization" /> - </element> - <element id="Extension.extension:parentOrganization.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Identifier" /> - </type> - </element> - <element id="Extension.extension:parentOrganization.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - <fixedUri value="http://dsf.dev/sid/organization-identifier" /> - </element> - <element id="Extension.extension:parentOrganization.value[x].value"> - <path value="Extension.extension.value[x].value" /> - <min value="1" /> - </element> - <element id="Extension.extension:organizationRole"> - <path value="Extension.extension" /> - <sliceName value="organizationRole" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:organizationRole.url"> - <path value="Extension.extension.url" /> - <fixedUri value="organization-role" /> - </element> - <element id="Extension.extension:organizationRole.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Coding" /> - </type> - </element> - <element id="Extension.extension:organizationRole.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - </element> - <element id="Extension.extension:organizationRole.value[x].code"> - <path value="Extension.extension.value[x].code" /> - <min value="1" /> - </element> - <element id="Extension.url"> - <path value="Extension.url" /> - <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role" /> - </element> - <element id="Extension.value[x]"> - <path value="Extension.value[x]" /> - <max value="0" /> - </element> - </differential> -</StructureDefinition> -``` - -All extensions for the [Read Access Tag](../dsf/read-access-tag.md) CodeSystem are defined on the `meta.tag.extension` element through the extension's `context` element: -```xml -<context> - <type value="element" /> - <expression value="Coding" /> <!-- meta.tag is of type Coding--> -</context> -``` - -That is why the first element we are adding to `meta.tag` is an `extension` element: -```xml -<meta> - <tag> - <extenion> - - </extenion> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -We will now go through the `differential` statement one element at a time, starting at the top: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - <element id="Extension.extension"> - <path value="Extension.extension" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="url" /> - </discriminator> - <rules value="open" /> - </slicing> - </element> - ... - </differential> -</StructureDefinition> -``` - -It defines a [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for the `Extension.extension` element, meaning we are dealing with a nested extension. The `discriminator` element tells us that slices will be identified by the value of their `url` attribute. A `rules` element with value `open` means other types of slices may be added later on e.g. when creating a profile. We do not have to add any elements from here to the `meta.tag.extension` element. Next up is the first slice called `parentOrganization`: - -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:parentOrganization"> - <path value="Extension.extension" /> - <sliceName value="parentOrganization" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:parentOrganization.url"> - <path value="Extension.extension.url" /> - <fixedUri value="parent-organization" /> - </element> - <element id="Extension.extension:parentOrganization.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Identifier" /> - </type> - </element> - <element id="Extension.extension:parentOrganization.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - <fixedUri value="http://dsf.dev/sid/organization-identifier" /> - </element> - <element id="Extension.extension:parentOrganization.value[x].value"> - <path value="Extension.extension.value[x].value" /> - <min value="1" /> - </element> - ... - </differential> -</StructureDefinition> -``` - -The first element defines a slice called `parentOrganization` on the `Extension.extension` element with cardinality `1..1`. The second element defines the url attribute of the `parentOrganization` slice to be fixed to the value `parent-organization`. With this information we can add the next element to `meta.tag`. Since it is defined on `Extension.extension` we will add it to `meta.tag.extension.extension` like this: -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -After that, it defines `parentOrganization.value[x]` to occur at least once and have a type of `Identifier`. To turn this into an element to add to `meta.tag.extension.extension` we have to replace `[x]` with our code in `value[x].type`, which in this case is `Identifier`. It is important to note, that should the value in the code element be lowercase, you will have make it uppercase before replacement. In our case this means we will have a `meta.tag.extension.extension.valueIdentifier` element: -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - <valueIdentifier> - - </valueIdentifier> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -The last two elements define a `system` element with a fixed value and `value` element we can fill in on our own, since it does not have any constraints applied. Notice that the element definition still uses `value[x].system` and `value[x].value`. The replacement mentioned earlier does not happen in the element definition, but since `value[x]` is defined to have the type `Identifier` it is inferred that we mean to reference `Identifier.system` and `Identifier.value`. We will choose an arbitrary `Idenfier` value, but you should be using an actual organization identifier depending on who you want to allow read access to the resource. - -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -Next is the slice is called `organizationRole`: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:organizationRole"> - <path value="Extension.extension" /> - <sliceName value="organizationRole" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:organizationRole.url"> - <path value="Extension.extension.url" /> - <fixedUri value="organization-role" /> - </element> - <element id="Extension.extension:organizationRole.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Coding" /> - </type> - </element> - <element id="Extension.extension:organizationRole.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - </element> - <element id="Extension.extension:organizationRole.value[x].code"> - <path value="Extension.extension.value[x].code" /> - <min value="1" /> - </element> - ... - </differential> -</StructureDefinition> -``` - -Like with `parentOrganization`, we will add an extension element to `meta.tag.extension` with the fixed url value defined above: -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="organization-role"> - - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -Instead of `Identifier`, the `value[x]` element is now defined as a `Coding` type. This means we will add a `valueCoding` element to the extension: -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -A `Coding` has to belong to some [CodeSystem](../fhir/codesystem.md). The DSF has a CodeSystem called [dsf-organization-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-organization-role-1.0.0.xml). Before creating your own CodeSystem, it is worth taking a look at it to see if an appropriate role already exists for your organization. For demonstration purposes, we will be using the `DIC` role: -```xml -<meta> - <tag> - <extension> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -Now we only have two elements left in the `differential` statement: - -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.url"> - <path value="Extension.url" /> - <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role" /> - </element> - <element id="Extension.value[x]"> - <path value="Extension.value[x]" /> - <max value="0" /> - </element> - </differential> -</StructureDefinition> -``` - -The `Extension.url` element tells us to add a url attribute to `meta.tag.extension`. The last element makes it so we must not add a `meta.tag.extension.value[x]` element. This leaves us with this final Read Access Tag: - -```xml -<meta> - <tag> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role"> - <extension url="parent-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="organization-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/organization-role"/> - <code value="DIC"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag"/> - <code value="ROLE"/> - </tag> -</meta> -``` - -You can follow the same method to configure the other types of Read Access Tags as well. \ No newline at end of file diff --git a/docs/src/develop/guides/creating-activity-definitions.md b/docs/src/develop/guides/creating-activity-definitions.md deleted file mode 100644 index 40a7cfb2e..000000000 --- a/docs/src/develop/guides/creating-activity-definitions.md +++ /dev/null @@ -1,750 +0,0 @@ ---- -title: Creating ActivityDefinitions -icon: creative ---- - -### Creating ActivityDefinitions - -This guide will teach you how to create an ActivityDefinition based on the [dsf-activity-definition](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-activity-definition-1.0.0.xml) profile for your process plugin. -It is divided into steps for each of the main components of ActivityDefinitions: -1. Read Access Tag -2. Extension: process authorization -3. BPE Managed Elements -4. Regular Elements - -*Regular elements* are all elements not part of the first 3 main components. - -*We will assume you know how to translate [ElementDefinitions](https://www.hl7.org/fhir/R4/elementdefinition.html) to actual elements in a FHIR resource. If you do not, you might want to check out the guide on [creating Task resources](../guides/creating-task-resources-based-on-a-definition.md) first.* - -#### 1. Read Access Tag -Let us start out with an empty [ActivityDefinition](../fhir/activitydefinition.md): -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - -</ActivityDefinition> -``` - -The first element in DSF FHIR resources is always the [Read Access Tag](../dsf/read-access-tag.md). It describes who is allowed to read this resource through the DSF FHIR server's REST API. You can learn more complex configurations of the [Read Access Tag](../dsf/read-access-tag.md) in [this guide](../dsf/read-access-tag.md). In this case, we will allow read access to everyone: - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> -</ActivityDefinition> -``` - -#### 2. Extension: Process Authorization -This part of your ActivityDefinition will tell the DSF who is allowed to request and receive messages ([Task](../fhir/task.md) resources) for your BPMN process. If your plugin contains more than one BPMN process, you will have to create one [ActivityDefinition](../fhir/activitydefinition.md) for each BPMN process. It is important to note that you need to include authorization rules for **ALL** messages received in your BPMN process. This includes the message starting your BPMN process initially. You can find the extension [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). Let us continue by adding the [extension element](http://hl7.org/fhir/R4/extensibility.html#extension) with the correct URL. You can get the value for the URL from the `Extension.url` element: -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - ... - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - - </extension> -</ActivityDefinition> -``` -*Elements not relevant to the current component are hidden with ... to increase readability.* - -The [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot) statement starts by defining the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) for the `Extension.extension` element: - -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - <element id="Extension"> - <path value="Extension" /> - <min value="1" /> - </element> - <element id="Extension.extension"> - <path value="Extension.extension" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="url" /> - </discriminator> - <rules value="open" /> - </slicing> - </element> - ... - </differential> -</StructureDefinition> -``` - -The above states that whenever this extension is used in a profile, the profile needs to include this extension at least once (`<min value="1" />`). The [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension` tells us that elements of this [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) are identified by the value of their URL (`<discriminator>`), which is always the case for extensions, and that other extensions can be added to the [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) (`<rules value="open" />`). Since there is a [slicing](https://www.hl7.org/fhir/R4/profiling.html#snapshot) on `Extension.extension`, we are dealing with a nested extension. - -After these initial element definitions come the elements relevant for your process plugin. The first one is the `message-name` slice: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:message-name"> - <path value="Extension.extension" /> - <sliceName value="message-name" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:message-name.url"> - <path value="Extension.extension.url" /> - <fixedUri value="message-name" /> - </element> - <element id="Extension.extension:message-name.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="string" /> - </type> - </element> - ... - </differential> -</StructureDefinition> -``` - -This section tells us that we need to include exactly one extension element from the `message-name` slice in our [ActivityDefinition](../fhir/activitydefinition.md). The extension element will have a URL value of `message-name`. If you remember the `discriminator` configuration, this URL value identifies the element to belong to the `message-name` slice on `Extension.extension`. Lastly, the extension element includes a `valueString` element. In case you are wondering how `value[x]` turned into `valueString`, FHIR does not allow using `value[x]` as actual element. The value in `value[x]` is always strictly bound to some kind of type. FHIR uses the `value[x].type.code` value to determine this type and replaces `[x]` with an uppercase version of `element.type.code`. This results in the following extension element we will add to our [ActivityDefinition](../fhir/activitydefinition.md): -```xml -<extension url="message-name"> - <valueString value="myMessage"/> -</extension> -``` - -For your use case, you have to replace `myMessage` with the name of the [BPMN message event](../bpmn/messaging.md) that is expecting this message. - -<details> -<summary>This is how your ActivityDefinition should look like so far</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - </extension> -</ActivityDefinition> -``` -</details> - -The next slice is called `task-profile`: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:task-profile"> - <path value="Extension.extension" /> - <sliceName value="task-profile" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:task-profile.url"> - <path value="Extension.extension.url" /> - <fixedUri value="task-profile" /> - </element> - <element id="Extension.extension:task-profile.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="canonical" /> - </type> - </element> - ... - </differential> -</StructureDefinition> -``` - -This section has almost the same structure as `message-name`. The only difference is the value for `value[x].type.code`. This means that instead of `valueString`, we will have to use a `valueCanonical` element for `task-profile.value[x]`. Canonical values referring to [Task](../fhir/task.md) profiles in ActivityDefinitions have to conform to the rules outlined by the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls). From the definition above, we will create the following extension element and add it to our [ActivityDefinition](../fhir/activitydefinition.md): -```xml -<extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> -</extension> -``` - -<details> -<summary>This is how your ActivityDefinition should look like so far</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> - </extension> - </extension> -</ActivityDefinition> -``` -</details> - -The next slice is `requester`: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:requester"> - <path value="Extension.extension" /> - <sliceName value="requester" /> - <min value="1" /> - </element> - <element id="Extension.extension:requester.url"> - <path value="Extension.extension.url" /> - <fixedUri value="requester" /> - </element> - <element id="Extension.extension:requester.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Coding" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all-practitioner|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization-practitioner|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role-practitioner|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-all|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-organization|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-remote-parent-organization-role|1.0.0" /> - </type> - <binding> - <strength value="required" /> - <valueSet value="http://dsf.dev/fhir/ValueSet/process-authorization-requester|1.0.0" /> - </binding> - </element> - ... - </differential> -</StructureDefinition> -``` -Instead of a `string` or `canonical` type for `value[x]` we now have a `Coding` type. See the [FHIR documentation on Codings](https://www.hl7.org/fhir/R4/datatypes.html#Coding) for more in-depth information. `Codings` are elements which contain, among other things, a `code` and the `system` the code belongs to. In the same way we transformed `value[x]` into `valueString` or `valueCanonical` before, we will also have to turn `value[x]` into `valueCoding`. To use `Codings` in `valueCoding` elements, they are usually bound to the element through a [ValueSet](../fhir/valueset.md). This is the responsibility of the `binding` element. You can also see that `value[x].type.profile` lists a number of profiles. Instead of defining the elements in the same file, they were defined in different files for better readability. Depending on your use case, you have to pick one of the profiles. -Here is what they mean: -- `local-all`: All local requests will be allowed. Local requests are identified by matching the requester's certificate to a thumbprint which was internally marked by the DSF FHIR server as belonging to a local organization. -- `local-organization`: All local requests made from an organization with a specific `organization-identifier` will be allowed. -- `local-parent-organization-role`: All local requests made from an organization having a specific role inside a specific parent organization will be allowed. -- `remote` versions of the above rules work the same but the requester's certificate is instead required to match a thumbprint marked as a remote organization. -- `practitioner` suffixes all work the same. They include the same rules as their prefixes but now additionally require the requester to match a certain `practitioner-role`. A list of them - can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml). This allows - for more granularity when defining authorization rules within an organization and can be integrated into local user management via [OpenID Connect](https://dsf.dev/stable/maintain/fhir/access-control.html). - -As you can see, there are no `practitioner` versions of `remote` authorization rules. From the perspective of the receiving DSF instance, remote requests are always issued by an organization. They do not hold any information about the local user management of the requesting organization. You can also find examples of all Codings from above [here](../dsf/requester-and-recipient.md). - -It is also good to keep in mind that you are allowed to add any number of `requester` elements into your [ActivityDefinition](../fhir/activitydefinition.md). Let us start out by adding a `requester` element like we did for previous elements: - -```xml -<extension url="requester"> - <valueCoding> - - </valueCoding> -</extension> -``` - -We now have to look at the elements that are defined in one of the profiles to fill in the remaining elements since they are not defined by the `requester` extension. For demonstration purposes, we will choose the [dsf-coding-process-authorization-local-organization-practitioner](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-practitioner-1.0.0.xml) profile. Since all elements listed in the [Coding definition](https://www.hl7.org/fhir/R4/datatypes.html#codesystem) are optional, we only have to look at the `differential` element from the profile we just selected: -<a id="coding-differential"></a> -```xml -<differential> - <element id="Coding.extension"> - <path value="Coding.extension" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="url" /> - </discriminator> - <rules value="open" /> - </slicing> - </element> - <element id="Coding.extension:organization-practitioner"> - <path value="Coding.extension" /> - <sliceName value="organization-practitioner" /> - <min value="1" /> - <max value="1" /> - <type> - <code value="Extension" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner|1.0.0" /> - </type> - </element> - <element id="Coding.system"> - <path value="Coding.system" /> - <min value="1" /> - <fixedUri value="http://dsf.dev/fhir/CodeSystem/process-authorization" /> - </element> - <element id="Coding.code"> - <path value="Coding.code" /> - <min value="1" /> - <fixedCode value="LOCAL_ORGANIZATION_PRACTITIONER" /> - </element> -</differential> -``` -It defines an extension called `organization-practitioner` which is identified through its url attribute. Again, the extension is only referenced, its location is in a different file. You can find it [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-organization-practitioner-1.0.0.xml). Let us look at its `differential` element in the extension file to see how we need to populate the extension: -```xml -<differential> - <element id="Extension"> - <path value="Extension" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension"> - <path value="Extension.extension" /> - <slicing> - <discriminator> - <type value="value" /> - <path value="url" /> - </discriminator> - <rules value="open" /> - </slicing> - </element> - <element id="Extension.extension:organization"> - <path value="Extension.extension" /> - <sliceName value="organization" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:organization.url"> - <path value="Extension.extension.url" /> - <fixedUri value="organization" /> - </element> - <element id="Extension.extension:organization.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Identifier" /> - </type> - </element> - <element id="Extension.extension:organization.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - <fixedUri value="http://dsf.dev/sid/organization-identifier" /> - </element> - <element id="Extension.extension:organization.value[x].value"> - <path value="Extension.extension.value[x].value" /> - <min value="1" /> - </element> - <element id="Extension.extension:practitionerRole"> - <path value="Extension.extension" /> - <sliceName value="practitionerRole" /> - <min value="1" /> - <max value="1" /> - </element> - <element id="Extension.extension:practitionerRole.url"> - <path value="Extension.extension.url" /> - <fixedUri value="practitioner-role" /> - </element> - <element id="Extension.extension:practitionerRole.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Coding" /> - </type> - </element> - <element id="Extension.extension:practitionerRole.value[x].system"> - <path value="Extension.extension.value[x].system" /> - <min value="1" /> - </element> - <element id="Extension.extension:practitionerRole.value[x].code"> - <path value="Extension.extension.value[x].code" /> - <min value="1" /> - </element> - <element id="Extension.url"> - <path value="Extension.url" /> - <fixedUri value="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner" /> - </element> - <element id="Extension.value[x]"> - <path value="Extension.value[x]" /> - <max value="0" /> - </element> -</differential> -``` - -This extension does not reference any other files. This means we reached the "deepest" level. So now we can start working our way back up again from here, by translating this definition into actual extension elements, then inserting it into the Coding we selected, translating the rest of the element definitions from the Coding resource and adding everything to our [ActivityDefinition](../fhir/activitydefinition.md). - -We will start with the `Extension.url` element, since the `Extension` element is the parent element for all slices on the `Extension.extension` elements: -```xml -<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - -</extension> -``` - -Next, we will add the `organization` slice: -```xml -<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> -</extension> -``` -Finally, we will add the `practitionerRole` slice: - -```xml -<extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> -</extension> -``` - -Notice that there is no `binding` element specified for `practitionerRole.value[x]`. This is intentional. In the example we used a code from the [dsf-practitioner-role](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/CodeSystem/dsf-practitioner-role-1.0.0.xml) CodeSystem. This CodeSystem includes a standard set of codes which are often sufficient for DSF use cases. You can freely add other CodeSystems if you find these codes do not apply for your use case. The code you set here can be used in the [DSF role config](https://dsf.dev/stable/maintain/fhir/access-control.html) to allow certain users with this `practitioner-role` to send requests. - -Working our way back up to the Coding we selected, we will now add the extension we just created as the `Coding.extension:organization-practitioner` element: -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - </valueCoding> -</extension> -``` -Now might be a good time to look at the [differential](#coding-differential) from the Coding again. Our next elements to be added are `Coding.system` and `Coding.code`: -```xml -<extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> - </valueCoding> -</extension> -``` -Now we are finished with the `requester` extension and can add it to our [ActivityDefinition](../fhir/activitydefinition.md) under the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml). - -<details> -<summary>This is how your ActivityDefinition should look like so far</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> - </valueCoding> - </extension> - </extension> -</ActivityDefinition> -``` -</details> - -Now we are back to looking at the [dsf-extension-process-authorization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) again. The last slice for this extension is `recipient`: -```xml -<StructureDefinition xmlns="http://hl7.org/fhir"> - ... - <differential> - ... - <element id="Extension.extension:recipient"> - <path value="Extension.extension" /> - <sliceName value="recipient" /> - <min value="1" /> - </element> - <element id="Extension.extension:recipient.url"> - <path value="Extension.extension.url" /> - <fixedUri value="recipient" /> - </element> - <element id="Extension.extension:recipient.value[x]"> - <path value="Extension.extension.value[x]" /> - <min value="1" /> - <type> - <code value="Coding" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-all|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-organization|1.0.0" /> - <profile value="http://dsf.dev/fhir/StructureDefinition/coding-process-authorization-local-parent-organization-role|1.0.0" /> - </type> - <binding> - <strength value="required" /> - <valueSet value="http://dsf.dev/fhir/ValueSet/process-authorization-recipient|1.0.0" /> - </binding> - </element> - ... - </differential> -</StructureDefinition> -``` - -The `recipient` will decide which DSF instance is allowed to process that message. That is the reason why you will not find any Codings for `remote` or `practitioner` here. For `requester`, we already decided that we will only allow users with a certain role from our own (local) organization to send this message. So now we will only allow the DSF instance run by that same local organization to process the message. The right Coding for this job is the [coding-process-authorization-local-organization](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-coding-process-authorization-local-organization-1.0.0.xml). The configuration of a local requester and local receiver is often used for the message that starts up the first BPMN process of the plugin. The process of adding the `recipient` slice is the exact same as it is for `requester`. You can follow the steps for the `requester` slice again but just use a different Coding. - -<details> -<summary>Using the Coding we just decided on, this is how your ActivityDefinition should look like</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> - </valueCoding> - </extension> - <extension url="recipient"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION"/> - </valueCoding> - </extension> - </extension> -</ActivityDefinition> -``` -</details> - -The last element defined in the [process authorization extension](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-extension-process-authorization-1.0.0.xml) is `Extension.url`. But since we added this element at the very beginning of the working through the extension, we are finished with it here. - -#### 3. BPE Managed Elements - -Some elements of [ActivityDefinitions](../fhir/activitydefinition.md) are managed by the DSF BPE and replaced with certain values at appropriate times. - -The following elements are managed by the DSF BPE: -- `ActivityDefinition.version` should use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{version}` -- `ActivityDefinition.date` is not required, but should you decide to include it, use the [placeholder](../dsf/versions-placeholders-urls.md#placeholders) `#{date}` -- `ActivityDefinition.status` must have a value of `unknown` - -<details> -<summary>Your ActivityDefinition should now look like this</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> - </valueCoding> - </extension> - <extension url="recipient"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION"/> - </valueCoding> - </extension> - </extension> - <!-- version managed by bpe --> - <version value="#{version}"/> - <!-- date managed by bpe --> - <date value="#{date}"/> - <!-- status managed by bpe --> - <status value="unknown"/> -</ActivityDefinition> -``` -</details> - -#### 4. Regular Elements - -The only required elements in this set are `ActivityDefinition.url` and `ActivityDefinition.kind`. Check out the documentation on [URLs](../dsf/versions-placeholders-urls.md#urls) on how to choose the correct value for `ActivityDefinition.url`. `ActivityDefinition.kind` must have the value `Task`. -All other elements can technically be omitted. Still, we recommend you include the following elements: -- `AcitivityDefinition.name` -- `AcitivityDefinition.title` -- `AcitivityDefinition.subtitle` -- `AcitivityDefinition.experimental` -- `AcitivityDefinition.publisher` -- `AcitivityDefinition.contact` -- `AcitivityDefinition.description` - -<details> -<summary>Your finished ActivityDefinition should now look something like this</summary> - -```xml -<ActivityDefinition xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"> - <extension url="message-name"> - <valueString value="myMessage"/> - </extension> - <extension url="task-profile"> - <valueCanonical value="http://dsf.dev/fhir/StructureDefinition/my-task|#{version}"/> - </extension> - <extension url="requester"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"> - <extension url="organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <extension url="practitioner-role"> - <valueCoding> - <system value="http://dsf.dev/fhir/CodeSystem/practitioner-role"/> - <code value="DSF_ADMIN"/> - </valueCoding> - </extension> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION_PRACTITIONER"/> - </valueCoding> - </extension> - <extension url="recipient"> - <valueCoding> - <extension url="http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization"> - <valueIdentifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="My_Organization"/> - </valueIdentifier> - </extension> - <system value="http://dsf.dev/fhir/CodeSystem/process-authorization"/> - <code value="LOCAL_ORGANIZATION"/> - </valueCoding> - </extension> - </extension> - <!-- version managed by bpe --> - <version value="#{version}"/> - <!-- date managed by bpe --> - <date value="#{date}"/> - <!-- status managed by bpe --> - <status value="unknown"/> - <url value="http://dsf.dev/bpe/Process/myProcess"/> - <kind value="Task"/> - <name value="My Process"/> - <title value="My Title For My Process"/> - <subtitle value="Information Processing Process"/> - <experimental value="false"/> - <publisher value="DSF"/> - <contact> - <name value="DSF"/> - <telecom> - <system value="email"/> - <value value="noreply@dsf.dev"/> - </telecom> - </contact> - <description value="My Process processes information"/> -</ActivityDefinition> -``` -</details> \ No newline at end of file diff --git a/docs/src/develop/guides/creating-codesystems-for-dsf-processes.md b/docs/src/develop/guides/creating-codesystems-for-dsf-processes.md deleted file mode 100644 index 5ab6d87f1..000000000 --- a/docs/src/develop/guides/creating-codesystems-for-dsf-processes.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Creating CodeSystems for DSF Processes -icon: creative ---- - -### Creating CodeSystems for DSF Processes - -You might find yourself in a situation where you need to create a [CodeSystem](../fhir/codesystem.md). For example, when defining the type of an [Input Parameter](../fhir/task.md#task-input-parameters). [CodeSystems](../fhir/codesystem.md) for the DSF differ from regular [CodeSystems](../fhir/codesystem.md) in that some element's values are managed by the DSF BPE server. You can use the following XML as a template: -```xml -<CodeSystem xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <url value="http://dsf.dev/fhir/CodeSystem/my-code-system" /> <!--dummy value--> - <!-- version managed by bpe --> - <version value="#{version}" /> - <name value="My CodeSystem" /> <!--dummy value--> - <title value="My CodeSystem Title" /> <!--dummy value--> - <!-- status managed by bpe --> - <status value="unknown" /> - <experimental value="false" /> - <!-- date managed by bpe --> - <date value="#{date}" /> - <publisher value="DSF" /> <!--dummy value--> - <description value="CodeSystem with codes for me" /> <!--dummy value--> - <caseSensitive value="true" /> - <hierarchyMeaning value="grouped-by" /> - <versionNeeded value="false" /> - <content value="complete" /> - <concept> - <code value="my-code" /> <!--dummy value--> - <display value="My Code" /> <!--dummy value--> - <definition value="My code used for myself" /> <!--dummy value--> - </concept> -</CodeSystem> -``` -Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. You can add as many codes as you like by defining more `concept` elements. - -The DSF BPE server will read your [CodeSystem](../fhir/codesystem.md) from `tutorial-process/src/main/resources/fhir/CodeSystem`. \ No newline at end of file diff --git a/docs/src/develop/guides/creating-task-resources-based-on-a-definition.md b/docs/src/develop/guides/creating-task-resources-based-on-a-definition.md deleted file mode 100644 index 6306ab128..000000000 --- a/docs/src/develop/guides/creating-task-resources-based-on-a-definition.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Creating Task Resources Based on a Definition -icon: creative ---- - -### Creating Task Resources Based on a Definition - -This short guide should help you understand how you can create [Task](../fhir/task.md) resources for use in [Starting A Process Via Task Resources](../guides/starting-a-process-via-task-resources.md). We will employ the use of the free version of [Forge](https://simplifier.net/forge?utm_source=firely-forge) to help with visualization. You are invited to create a free account and follow along, but we will include screenshots of relevant views either way. Remember that the free version of Forge [must not be used commercially](https://simplifier.net/pricing). As an example, we will create a [Task](../fhir/task.md) resource from the `task-start-dic-process.xml` profile. - -#### 1st Step: Removing Placeholders -`task-start-dic-process.xml` includes placeholders for the `version` and `date` elements. For the duration of this guide, you can either remove or comment these elements, so Forge does not try to perform type checking on them, which would result in an error and Forge not loading the file. - -#### 2nd Step: Differential Chain -If the resource profile is only available as a [differential](https://www.hl7.org/fhir/R4/profiling.html#snapshot), like in our case, we will want to aggregate the changes made to the base resource (in this case [Task](../fhir/task.md)) by all profiles to make it more readable. To do this, we first need all the profiles involved. We already have `task-start-dic-process.xml` in our `StructureDefinition` folder. It lists a resource called `task-base` in its `baseDefinition` element. This resource is part of the DSF and can be found [here](https://github.com/datasharingframework/dsf/blob/main/dsf-fhir/dsf-fhir-validation/src/main/resources/fhir/StructureDefinition/dsf-task-base-1.0.0.xml). Put it into the `StructureDefinition` folder. Since `task-base` has the original FHIR Task as its `baseDefinition` element, we are done with this chain. In forge, you should now be able to open the `StructureDefinition` folder and select the `task-start-dic-process.xml` profile. It should look something like this: - -![Forge overview](/photos/developer-documentation/forge_overview.png) - -#### 3rd Step: Building the Task Resource -We will now go through each element one by one and include it into our [Task](../fhir/task.md) resource, provided it is mandatory (cardinality at least `1..1`) according to the profile. It is important that you not use any placeholders like `#{version}` for resources not read by the DSF BPE server. This is the case if we want a [Task](../fhir/task.md) resource for use with [cURL](../guides/starting-a-process-via-task-resources.md#using-curl). But, placeholders should be used in [Draft Task Resources](../dsf/draft-task-resources.md) instead of actual values wherever possible, since those are read by the DSF BPE server. This guide will create a [Task](../fhir/task.md) resource without placeholders. We will start out with the base element for all [Task](../fhir/task.md) resources: -```xml -<Task xmlns="http://hl7.org/fhir"> - -</Task> -``` - -Before we start adding any elements listed in Forge's element tree, we have to include the `Task.meta.profile` element. Its requirement cannot be seen here which is why we mention it specifically. This is the only instance you will not see it in the element tree. It should look like this: -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> -</Task> -``` - -The first element which can be found in the element tree is the `instantiatesCanonical` element. To add it, we will create an XML element with the same name and the value according to [URLs](../dsf/versions-placeholders-urls.md#urls): -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> -</Task> -``` -We can continue this process for all primitive elements like these. Just make sure you pay attention to use the correct data type (e.g. proper coding value for elements with `coding` type). - -By now your [Task](../fhir/task.md) resources should look something like this: -<details> -<summary>Suggested solution</summary> - -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> -</Task> -``` -</details> - -Let us look at a more complex element like the `requester` element: - -![Forge requester view](/photos/developer-documentation/forge_requester_view.png) - -We will start the same way we started with primitive elements, by adding the `requester` element: -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> - <requester> - - </requester> -</Task> -``` - -Then, we will add primitive elements to `requester` like we did before for `Task`: -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> - <requester> - <type value="Organization"/> - </requester> -</Task> -``` -*Important to note here that the value for the `status` will always be `requested` for Tasks being posted using cURL and the `type` element for `requester` and `recipient` will always have the value `Organization` in the DSF context.* - -Next, we will add the `identifier` element and its primitive sub-elements just like we started out doing it for the `requester` element. The `identifier.value` in this case will be `dic.dsf.test`. To understand why, take a look at the topic on [organization identifiers](../dsf/organization-identifiers.md): -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> - <requester> - <type value="Organization"/> - <identifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="dic.dsf.test" /> - </identifier> - </requester> -</Task> -``` -*Notice that `requester.identifier.system` has a `Fixed value` annotation. You can see what the value is supposed to be by clicking on the `system` element in Forge or looking at the XML for the right Task profile. The right side will have all information about that element, including the actual value for `Fixed value`.* - -You should now be able to fill out all elements in your [Task](../fhir/task.md) resource until you reach the [slicing](https://www.hl7.org/fhir/R4/profiling.html#slicing) for `Task.input`. Your [Task](../fhir/task.md) resource should look something like this: -<details> -<summary>Suggested solution</summary> - -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> - <requester> - <type value="Organization"/> - <identifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="dic.dsf.test" /> - </identifier> - </requester> - <restriction> - <recipient> - <type value="Organization"/> - <identifier> - <system value="http://dsf.dev/sid/organization-identifier" /> - <value value="dic.dsf.test" /> - </identifier> - </recipient> - </restriction> -</Task> -``` -</details> - - -[Slicings](https://www.hl7.org/fhir/R4/profiling.html#slicing) are a bit different from regular elements. Let us look at the slice `message-name`: - -![Forge slice message name](/photos/developer-documentation/forge_slice_message_name.png) - -If we were to continue including slices to the [Task](../fhir/task.md) resource like we did so far, we would add a `message-name` element to our XML like this: - -```xml -<Task xmlns="http://hl7.org/fhir"> - ... - <input> - <message-name> - ... - </message-name> - </input> -</Task> -``` - -This approach however, would not work. FHIR processors do not use the name of the slice to map entries in your [Task](../fhir/task.md) resource to the correct slice. They use [discriminators](https://www.hl7.org/fhir/R4/profiling.html#discriminator). Discriminators define the elements a processor needs to distinguish slices by. You can see how the discriminator is configured by selecting the `input` element in Forge. In our case, a processor would look at the values for `input.type.coding.system` and `input.type.coding.code` to determine which slice this element belongs to. This only works because `input.type.coding.system` and `input.type.coding.code` are present in all slices and have a `Fixed value`. You can learn more about discriminators [here](https://www.hl7.org/fhir/R4/profiling.html#discriminator). All this means is that we effectively ignore the name of the slice as an element and start adding elements like we did before: - -```xml -<Task xmlns="http://hl7.org/fhir"> - ... - <input> - <type> - <coding> - <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> - <code value="message-name" /> - </coding> - </type> - <valueString value="dicProcess" /> - </input> -</Task> -``` - -Now you should be able to add all remaining mandatory elements to your [Task](../fhir/task.md) resource on your own. In the end, it should look something like this: -<details> -<summary>Suggested solution</summary> - -```xml -<Task xmlns="http://hl7.org/fhir"> - <meta> - <profile value="http://dsf.dev/fhir/StructureDefinition/task-start-dic-process|1.0"/> - </meta> - <instantiatesCanonical value="http://dsf.dev/bpe/Process/dicProcess|1.0" /> - <status value="requested"/> - <intent value="order"/> - <authoredOn value="2024-02-08T10:00:00+00:00" /> - <requester> - <type value="Organization"/> - <identifier> - <system value="http://dsf.dev/sid/organization-identifier"/> - <value value="dic.dsf.test" /> - </identifier> - </requester> - <restriction> - <recipient> - <type value="Organization"/> - <identifier> - <system value="http://dsf.dev/sid/organization-identifier" /> - <value value="dic.dsf.test" /> - </identifier> - </recipient> - </restriction> - <input> - <type> - <coding> - <system value="http://dsf.dev/fhir/CodeSystem/bpmn-message" /> - <code value="message-name" /> - </coding> - </type> - <valueString value="dicProcess"/> - </input> -</Task> -``` -</details> - -**Do not forget to restore the version and date placeholders in `task-start-dic-process.xml`!** \ No newline at end of file diff --git a/docs/src/develop/guides/creating-valuesets-for-dsf-processes.md b/docs/src/develop/guides/creating-valuesets-for-dsf-processes.md deleted file mode 100644 index f273196ec..000000000 --- a/docs/src/develop/guides/creating-valuesets-for-dsf-processes.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Creating ValueSets for DSF Processes -icon: creative ---- - -### Creating ValueSets for DSF Processes - -You might find yourself in the situation where you need to create a [ValueSet](../fhir/valueset.md). For example, when adding [Input Parameters](../fhir/task.md#task-input-parameters) to DSF [Task](../fhir/task.md) resources, you will also have to reference a [ValueSet](../fhir/valueset.md) resource in your binding for `Task.input.type` to be able to set the type of your [Input Parameter](../fhir/task.md#task-input-parameters). [ValueSets](../fhir/valueset.md) for the DSF differ from regular [ValueSets](../fhir/valueset.md) in that some element's values are managed by the DSF BPE server. You can use the following template for your -[ValueSet](../fhir/valueset.md): -```xml -<ValueSet xmlns="http://hl7.org/fhir"> - <meta> - <tag> - <system value="http://dsf.dev/fhir/CodeSystem/read-access-tag" /> - <code value="ALL" /> - </tag> - </meta> - <url value="http://dsf.dev/fhir/ValueSet/my-value-set"/> <!--dummy value--> - <!-- version managed by bpe --> - <version value="#{version}" /> - <name value="My ValueSet"/> <!--dummy value--> - <title value="My ValueSet Title"/> <!--dummy value--> - <!-- status managed by bpe --> - <status value="unknown" /> - <experimental value="false"/> - <!-- date managed by bpe --> - <date value="#{date}"/> - <publisher value="DSF"/> <!--dummy value--> - <description value="ValueSet with all codes from my-code-system"/> <!--dummy value--> - <immutable value="true"/> - <compose> - <include> - <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> <!--dummy value--> - <version value="#{version}"/> - </include> - </compose> -</ValueSet> -``` -Replace dummy values with appropriate values of your own. Do not change elements managed by the DSF BPE server. The `compose` element defines the codes included in this [ValueSet](../fhir/valueset.md). It holds at least one `include` element. Each `include` element refers to a [CodeSystem](../fhir/codesystem.md) and contains a list of `concept` elements which in turn contain the actual `code` element. Using one code from `my-code-system` and one code from `my-other-code-system` would result in the following `compose` element: -```xml -<ValueSet xmlns="http://hl7.org/fhir"> - ... - <compose> - <include> - <system value="http://dsf.dev/fhir/CodeSystem/my-code-system"/> - <version value="#{version}"/> - <concept> - <code value="my-code"/> - </concept> - </include> - <include> - <system value="http://dsf.dev/fhir/CodeSystem/my-other-code-system"/> - <version value="#{version}"/> - <concept> - <code value="my-other-code"/> - </concept> - </include> - </compose> -</ValueSet> -``` -The DSF BPE server will read your [ValueSet](../fhir/valueset.md) from `tutorial-process/src/main/resources/fhir/ValueSet`. - -You might also want to check out [this guide](../guides/creating-codesystems-for-dsf-processes.md) on how to create [CodeSystems](../fhir/codesystem.md). \ No newline at end of file diff --git a/docs/src/develop/guides/index.md b/docs/src/develop/guides/index.md deleted file mode 100644 index 2841de106..000000000 --- a/docs/src/develop/guides/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Guides -icon: creative ---- - -## Details -- [Accessing BPMN Process Variables](accessing-bpmn-process-variables.md) -- [Accessing Task Resources During Execution](accessing-task-resources-during-execution.md) -- [Adding Task Input Parameters to Task Profiles](adding-task-input-parameters-to-task-profiles.md) -- [Configuring Read Access Tags](configuring-read-access-tags.md) -- [Creating ActivityDefinitions](creating-activity-definitions.md) -- [Creating CodeSystems for DSF Processes](creating-codesystems-for-dsf-processes.md) -- [Creating Task Resources Based on a Definition](creating-task-resources-based-on-a-definition.md) -- [Creating ValueSets for DSF Processes](creating-valuesets-for-dsf-processes.md) -- [Managing Multiple Incoming Messages and Missing Messages](managing-mutiple-incoming-messages-and-missing-messages.md) -- [Setting Targets for Message Events](setting-targets-for-message-events.md) -- [Starting a Process via Task Resources](starting-a-process-via-task-resources.md) \ No newline at end of file diff --git a/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md b/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md deleted file mode 100644 index a0c8f6120..000000000 --- a/docs/src/develop/guides/managing-mutiple-incoming-messages-and-missing-messages.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Managing Multiple Incoming Messages and Missing Messages -icon: creative ---- - -### Managing Multiple Incoming Messages and Missing Messages - -If an already running process instance is waiting for a message from another organization, the corresponding FHIR [Task](../fhir/task.md) may never arrive. Either because the other organization decides to never send the message or because some technical problem prohibits the [Task](../fhir/task.md) resource from being posted to the DSF FHIR server. This would result in stale process instances that never finish. - -At the same time, you might also expect to receive one out of a number of different message types at once. - -In order to solve both problems we can add an [Event Based Gateway](../bpmn/gateways.md#event-based-gateway) to the process waiting for a response and then either handle a [Task](../fhir/task.md) resource with the response and finish the process in a success state or trigger a [Timer Intermediate Catching Event](../bpmn/timer-intermediate-catching-events.md) after a defined wait period and finish the process in an error state. The following BPMN collaboration diagram shows how the process at the first organization would look like if we wanted to react to multiple different messages or missing messages: - -<picture> - <source media="(prefers-color-scheme: dark)" srcset="/photos/developer-documentation/event_based_gateway_inverted.svg"> - <source media="(prefers-color-scheme: light)" srcset="/photos/developer-documentation/event_based_gateway.svg"> - <img alt="BPMN collaboration diagram with an Event Based Gateway" src="/photos/developer-documentation/event_based_gateway.svg"> -</picture> diff --git a/docs/src/develop/guides/setting-targets-for-message-events.md b/docs/src/develop/guides/setting-targets-for-message-events.md deleted file mode 100644 index 68db0b1e0..000000000 --- a/docs/src/develop/guides/setting-targets-for-message-events.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Setting Targets for Message Events -icon: creative ---- - -### Setting Targets for Message Events - -Setting a target for a message event requires a `Target` object. To create one, you require a target's organization identifier, endpoint identifier and endpoint address. You can find these values by visiting the DSF FHIR server's web interface. In the top right corner, click the `Show Bookmarks` button, then select `Endpoint`. You will be taken to a list of all Endpoints available to the FHIR server. There are two ways of adding `targets` to the BPMN execution variables: -#### 1. Adding the target in the message event implementation -In your message event implementation (the class extending `AbstractTaskMessageSend`), you can override `AbstractTaskMessageSend#doExecute`, add your targets and then call the super-method. -#### 2. Adding the target in a service task right before the message event -This is the preferred method of this tutorial but both methods will work perfectly fine. For our use cases, we usually prefer this one since there is enough complexity to warrant putting it into a separate BPMN [Service Task](../bpmn/service-tasks.md). - -In both cases you can access methods to create and set `targets` through the `Variables` instance. diff --git a/docs/src/develop/guides/starting-a-process-via-task-resources.md b/docs/src/develop/guides/starting-a-process-via-task-resources.md deleted file mode 100644 index baa36a7bb..000000000 --- a/docs/src/develop/guides/starting-a-process-via-task-resources.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Starting a Process via Task Resources -icon: creative ---- - -### Starting a Process via Task Resources - -To start a BPMN process, you need to create new a [Task](../fhir/task.md) resource in the DSF FHIR server by sending an HTTP request according to the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html). Specifically, you need to [create](https://www.hl7.org/fhir/R4/http.html#create) -a resource for the first time. Also, remember that the [Task](../fhir/task.md) resource you are sending needs to comply to the [Task](../fhir/task.md) profile of the process you want to start and the [ActivityDefinition's](../fhir/activitydefinition.md) authorization rules. -There are two major ways of making this HTTP request: -1. Using cURL -2. Using the DSF FHIR server's web interface - -#### Using cURL -In order to use cURL, you will have to create an appropriate [Task](../fhir/task.md) resource to post to the DSF FHIR server. There already is a file called `example-task.xml` located in `tutorial-process/src/main/resources/fhir`. You can use this as your starting point. You can try to follow [this guide](../guides/creating-task-resources-based-on-a-definition.md), or you can check the solution branches for this file if you need ideas on how to fill it out properly. - -Below are some cURL command skeletons. Replace all <>-Placeholders with appropriate values. Host name depends on the instance you want to address. - -##### Linux: -```shell -curl https://<instance-host-name>/fhir/Task \ ---cacert <path/to/ca-certificate-file.pem> \ ---cert <path/to/client-certificate-file.pem>:password \ ---key <path/to/client-private-key-file.pem> \ --H "Content-Type: application/fhir+xml" \ --H "Accept: application/fhir+xml" \ --d @<path/to/example-task.xml> -``` -##### Windows CMD: -```shell -curl https://<instance-host-name>/fhir/Task ^ ---cacert <path/to/ca-certificate-file.pem> ^ ---cert <path/to/client-certificate-file.pem>:password ^ ---key <path/to/client-private-key-file.pem> ^ --H "Content-Type: application/fhir+xml" ^ --H "Accept: application/fhir+xml" ^ --d @<path/to/example-task.xml> -``` -*This may throw an error depending on which version of cURL Windows is using. If this is the case for you after making sure you entered everything correctly, you can try using Git's version of cURL instead by adding it to the very top of your system's PATH environment variable. Git's cURL is usually situated in C:\Program Files\Git\mingw64\bin.* - -#### Using the DSF FHIR Server's Web Interface - -When visiting the web interface of a DSF FHIR server instance (e.g. https://instance-name/fhir), you can query the DSF FHIR server using the [FHIR RESTful API](https://www.hl7.org/fhir/R4/http.html) to return a list of all [Draft Task Resources](../dsf/draft-task-resources.md). These [Task](../fhir/task.md) resources act like a template you can use to instantiate [Task](../fhir/task.md) resources which start BPMN processes. Instead of querying the DSF FHIR server manually, you can use a predefined bookmark to navigate to the query URL. You can find a list of Bookmarks in the top right corner of the web interface. Simply select the bookmark referencing `?_sort=_profile,identifier&status=draft` under the `Task` section, and you will be taken to the list of all [Draft Task Resources](../dsf/draft-task-resources.md). Once there, you can select the one which starts your BPMN process. It will take you to a detailed view of the resource where you will also have the chance to fill any [Task Input Parameters](../fhir/task.md#task-input-parameters) you might need to specify. If everything is filled out correctly, you may start your process by clicking `Start Process`. Keep in mind that, for [Draft Task Resources](../dsf/draft-task-resources.md) to be available, you need to include them in your mapping for your BPMN process ID in `ProcessPluginDefinition#getFhirResourcesByProcessId`. Take a look at [the Process Plugin Definition](../dsf/process-plugin-definition.md) if you need a reminder. \ No newline at end of file diff --git a/docs/src/develop/index.md b/docs/src/develop/index.md deleted file mode 100644 index ca799dea6..000000000 --- a/docs/src/develop/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Developer Documentation -icon: creative ---- - -## BPMN -- [Conditions](bpmn/conditions.md) -- [Gateways](bpmn/gateways.md) -- [Messaging](bpmn/messaging.md) -- [Sequence Flow](bpmn/sequence-flow.md) -- [Service Tasks](bpmn/service-tasks.md) -- [Timer Intermediate Catching Events](bpmn/timer-intermediate-catching-events.md) - -## FHIR -- [ActivityDefinition](fhir/activitydefinition.md) -- [Codesystem](fhir/codesystem.md) -- [Task](fhir/task.md) -- [ValueSet](fhir/valueset.md) - -## DSF -- [BPMN Process Execution](dsf/bpmn-process-execution.md) -- [BPMN Process Variables](dsf/bpmn-process-variables.md) -- [Draft Task Resources](dsf/draft-task-resources.md) -- [Environment Variables](dsf/environment-variables.md) -- [Message Correlation](dsf/message-correlation.md) -- [Message Delegates](dsf/message-delegates.md) -- [Organization Identifiers](dsf/organization-identifiers.md) -- [Process Plugin API](dsf/process-plugin-api.md) -- [Process Plugin Definition](dsf/process-plugin-definition.md) -- [Read Access Tag](dsf/read-access-tag.md) -- [Requester and Recipient](dsf/requester-and-recipient.md) -- [Service Delegates](dsf/service-delegates.md) -- [Spring Framework Integration](dsf/spring-framework-integration.md) -- [Versions, Placeholders and URLs](dsf/versions-placeholders-urls.md) - -## Guides -- [Accessing BPMN Process Variables](guides/accessing-bpmn-process-variables.md) -- [Accessing Task Resources During Execution](guides/accessing-task-resources-during-execution.md) -- [Adding Task Input Parameters to Task Profiles](guides/adding-task-input-parameters-to-task-profiles.md) -- [Configuring Read Access Tags](guides/configuring-read-access-tags.md) -- [Creating ActivityDefinitions](guides/creating-activity-definitions.md) -- [Creating CodeSystems for DSF Processes](guides/creating-codesystems-for-dsf-processes.md) -- [Creating Task Resources Based on a Definition](guides/creating-task-resources-based-on-a-definition.md) -- [Creating ValueSets for DSF Processes](guides/creating-valuesets-for-dsf-processes.md) -- [Managing Multiple Incoming Messages and Missing Messages](guides/managing-mutiple-incoming-messages-and-missing-messages.md) -- [Setting Targets for Message Events](guides/setting-targets-for-message-events.md) -- [Starting a Process via Task Resources](guides/starting-a-process-via-task-resources.md) \ No newline at end of file From e1051bf0115f7506f7cb39fd4e99d6d3acc1dfe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hringer?= <jan.boehringer@hs-heilbronn.de> Date: Wed, 28 May 2025 11:39:26 +0200 Subject: [PATCH 28/42] Fixed broken links --- docs/src/community/README.md | 2 +- .../api-v1/guides/user-tasks-in-the-dsf.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/community/README.md b/docs/src/community/README.md index e057b760c..fe99a37cb 100644 --- a/docs/src/community/README.md +++ b/docs/src/community/README.md @@ -7,5 +7,5 @@ icon: creative - [Consultation Hours](./consultation-hours.md) - [Team](./team.md) - [Communication](./communication.md) -- [Contribute](./contribute/readme.md) +- [Contribute](./contribute/README.md) - [DSF Ecosystem](./ecosystem.md) diff --git a/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md b/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md index 6bd4ca28b..3c987de8a 100644 --- a/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md +++ b/docs/src/process-development/api-v1/guides/user-tasks-in-the-dsf.md @@ -5,9 +5,9 @@ icon: creative ### User Tasks in the DSF -Creating a [User Task](../concepts/bpmn/user-tasks.md) in a BPMN model, causes the DSF to automatically generate a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) resource according to a [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) you provided in the [User Task's](../concepts/bpmn/user-tasks.md) `Forms` field when the process execution reaches the [User Task](../concepts/bpmn/user-tasks.md). The `Forms` field needs to have a type of `Embedded or External Task Forms` with the `Form key` being the url of your [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource. The [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource needs to be put in the `src/main/resources/fhir/Questionnaire` directory. The generated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) can now be answered by locating the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) in the DSF FHIR server UI through `https://your.dsf.fhir.server/fhir/QuestionnaireResponse?_sort=-_lastUpdated&status=in-progress`. After filling out the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) and submitting it, the process execution will continue with the next BPMN element after the [User Task](../concepts/bpmn/user-tasks.md) and the updated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) will be available through the [Process Plugin Api's](../concepts/dsf/process-api.md) `Variables` instance by calling `getLatestReceivedQuestionnaireResponse()`. +Creating a [User Task](../bpmn/user-tasks.md) in a BPMN model, causes the DSF to automatically generate a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) resource according to a [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) you provided in the [User Task's](../bpmn/user-tasks.md) `Forms` field when the process execution reaches the [User Task](../bpmn/user-tasks.md). The `Forms` field needs to have a type of `Embedded or External Task Forms` with the `Form key` being the url of your [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource. The [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource needs to be put in the `src/main/resources/fhir/Questionnaire` directory. The generated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) can now be answered by locating the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) in the DSF FHIR server UI through `https://your.dsf.fhir.server/fhir/QuestionnaireResponse?_sort=-_lastUpdated&status=in-progress`. After filling out the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) and submitting it, the process execution will continue with the next BPMN element after the [User Task](../bpmn/user-tasks.md) and the updated [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) will be available through the [Process Plugin Api's](../dsf/process-plugin-api.md) `Variables` instance by calling `getLatestReceivedQuestionnaireResponse()`. -You also have the option to register a [Task Listener](https://docs.camunda.org/manual/7.21/user-guide/process-engine/delegation-code/#task-listener) on the [User Task](../concepts/bpmn/user-tasks.md). This allows you to manipulate the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) before it is posted to the DSF FHIR server. You do this by extending the `DefaultUserTaskListener` class which provides overrides to interact with the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html). Notice that dynamically changing the `item.text` value of an item in a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) (that is **NOT** of type `display`) is not allowed. For that, you would have to change the `item.text` value of the corresponding [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource as well. Instead, you should have an item of type `display` above the item whose text should change dynamically, like in the template, and change its `item.text` value. In this case, you may also leave out `item.text` element of the item below the display item. +You also have the option to register a [Task Listener](https://docs.camunda.org/manual/7.21/user-guide/process-engine/delegation-code/#task-listener) on the [User Task](../bpmn/user-tasks.md). This allows you to manipulate the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) before it is posted to the DSF FHIR server. You do this by extending the `DefaultUserTaskListener` class which provides overrides to interact with the [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html). Notice that dynamically changing the `item.text` value of an item in a [QuestionnaireResponse](https://www.hl7.org/fhir/R4/questionnaireresponse.html) (that is **NOT** of type `display`) is not allowed. For that, you would have to change the `item.text` value of the corresponding [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource as well. Instead, you should have an item of type `display` above the item whose text should change dynamically, like in the template, and change its `item.text` value. In this case, you may also leave out `item.text` element of the item below the display item. Below you can find a template for a [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) resource. Replace `questionnaire-name` with the name of your [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html) and have the file be named the same. The items `business-key` and `user-task-id` are required by the DSF and are always included. You can then add any amount of items of your choosing to the [Questionnaire](https://www.hl7.org/fhir/R4/questionnaire.html). From 6fc1e806b4595367eaf7add1553af1cfcfecbee6 Mon Sep 17 00:00:00 2001 From: Simon Schweizer <simon-tobias.schweizer@hs-heilbronn.de> Date: Wed, 28 May 2025 12:23:11 +0200 Subject: [PATCH 29/42] add javadoc --- .../javadoc/api-v2/META-INF/MANIFEST.MF | 4 + .../javadoc/api-v2/allclasses-index.html | 344 +++ .../javadoc/api-v2/allpackages-index.html | 101 + .../javadoc/api-v2/constant-values.html | 366 +++ .../public/assets/javadoc/api-v2/copy.svg | 33 + .../dev/dsf/bpe/v2/ProcessPluginApi.html | 279 +++ .../dsf/bpe/v2/ProcessPluginDefinition.html | 387 +++ .../v2/ProcessPluginDeploymentListener.html | 148 ++ .../dev/dsf/bpe/v2/activity/Activity.html | 151 ++ .../v2/activity/DefaultUserTaskListener.html | 271 +++ .../bpe/v2/activity/ExecutionListener.html | 168 ++ .../dsf/bpe/v2/activity/MessageActivity.html | 233 ++ .../dsf/bpe/v2/activity/MessageEndEvent.html | 155 ++ .../MessageIntermediateThrowEvent.html | 155 ++ .../dsf/bpe/v2/activity/MessageSendTask.html | 155 ++ .../dev/dsf/bpe/v2/activity/ServiceTask.html | 170 ++ .../dsf/bpe/v2/activity/UserTaskListener.html | 174 ++ .../bpe/v2/activity/class-use/Activity.html | 132 + .../class-use/DefaultUserTaskListener.html | 62 + .../activity/class-use/ExecutionListener.html | 62 + .../activity/class-use/MessageActivity.html | 93 + .../activity/class-use/MessageEndEvent.html | 62 + .../MessageIntermediateThrowEvent.html | 62 + .../activity/class-use/MessageSendTask.html | 62 + .../v2/activity/class-use/ServiceTask.html | 62 + .../activity/class-use/UserTaskListener.html | 89 + .../dsf/bpe/v2/activity/package-summary.html | 131 + .../dev/dsf/bpe/v2/activity/package-tree.html | 95 + .../dev/dsf/bpe/v2/activity/package-use.html | 101 + .../activity/task/BusinessKeyStrategies.html | 266 ++ .../v2/activity/task/BusinessKeyStrategy.html | 149 ++ .../task/DefaultTaskSender.TaskAndConfig.html | 388 +++ .../v2/activity/task/DefaultTaskSender.html | 456 ++++ .../dsf/bpe/v2/activity/task/TaskSender.html | 147 ++ .../task/class-use/BusinessKeyStrategies.html | 95 + .../task/class-use/BusinessKeyStrategy.html | 140 ++ .../DefaultTaskSender.TaskAndConfig.html | 87 + .../task/class-use/DefaultTaskSender.html | 62 + .../activity/task/class-use/TaskSender.html | 105 + .../bpe/v2/activity/task/package-summary.html | 119 + .../bpe/v2/activity/task/package-tree.html | 111 + .../dsf/bpe/v2/activity/task/package-use.html | 105 + .../CreateQuestionnaireResponseValues.html | 268 +++ .../v2/activity/values/SendTaskValues.html | 287 +++ .../CreateQuestionnaireResponseValues.html | 112 + .../values/class-use/SendTaskValues.html | 223 ++ .../v2/activity/values/package-summary.html | 111 + .../bpe/v2/activity/values/package-tree.html | 81 + .../bpe/v2/activity/values/package-use.html | 125 + .../bpe/v2/class-use/ProcessPluginApi.html | 324 +++ .../v2/class-use/ProcessPluginDefinition.html | 62 + .../ProcessPluginDeploymentListener.html | 62 + .../dsf/bpe/v2/client/dsf/BasicDsfClient.html | 454 ++++ .../dev/dsf/bpe/v2/client/dsf/DsfClient.html | 184 ++ .../v2/client/dsf/PreferReturnMinimal.html | 215 ++ .../dsf/PreferReturnMinimalWithRetry.html | 132 + .../v2/client/dsf/PreferReturnOutcome.html | 215 ++ .../dsf/PreferReturnOutcomeWithRetry.html | 132 + .../v2/client/dsf/PreferReturnResource.html | 215 ++ .../dsf/bpe/v2/client/dsf/RetryClient.html | 294 +++ .../client/dsf/class-use/BasicDsfClient.html | 87 + .../v2/client/dsf/class-use/DsfClient.html | 93 + .../dsf/class-use/PreferReturnMinimal.html | 87 + .../PreferReturnMinimalWithRetry.html | 87 + .../dsf/class-use/PreferReturnOutcome.html | 87 + .../PreferReturnOutcomeWithRetry.html | 87 + .../dsf/class-use/PreferReturnResource.html | 90 + .../v2/client/dsf/class-use/RetryClient.html | 93 + .../bpe/v2/client/dsf/package-summary.html | 110 + .../dsf/bpe/v2/client/dsf/package-tree.html | 97 + .../dsf/bpe/v2/client/dsf/package-use.html | 109 + .../ClientConfig.BasicAuthentication.html | 164 ++ .../ClientConfig.BearerAuthentication.html | 151 ++ ...lientConfig.CertificateAuthentication.html | 164 ++ .../fhir/ClientConfig.OidcAuthentication.html | 260 ++ .../v2/client/fhir/ClientConfig.Proxy.html | 177 ++ .../dsf/bpe/v2/client/fhir/ClientConfig.html | 309 +++ .../dsf/bpe/v2/client/fhir/ClientConfigs.html | 143 ++ .../ClientConfig.BasicAuthentication.html | 87 + .../ClientConfig.BearerAuthentication.html | 87 + ...lientConfig.CertificateAuthentication.html | 87 + .../ClientConfig.OidcAuthentication.html | 103 + .../fhir/class-use/ClientConfig.Proxy.html | 90 + .../client/fhir/class-use/ClientConfig.html | 111 + .../client/fhir/class-use/ClientConfigs.html | 62 + .../bpe/v2/client/fhir/package-summary.html | 108 + .../dsf/bpe/v2/client/fhir/package-tree.html | 78 + .../dsf/bpe/v2/client/fhir/package-use.html | 109 + .../dsf/bpe/v2/client/oidc/Configuration.html | 170 ++ .../dsf/bpe/v2/client/oidc/Jwks.JwksKey.html | 219 ++ .../dev/dsf/bpe/v2/client/oidc/Jwks.html | 167 ++ .../dsf/bpe/v2/client/oidc/OidcClient.html | 224 ++ .../v2/client/oidc/OidcClientException.html | 181 ++ .../client/oidc/class-use/Configuration.html | 100 + .../client/oidc/class-use/Jwks.JwksKey.html | 90 + .../bpe/v2/client/oidc/class-use/Jwks.html | 100 + .../v2/client/oidc/class-use/OidcClient.html | 102 + .../oidc/class-use/OidcClientException.html | 100 + .../bpe/v2/client/oidc/package-summary.html | 108 + .../dsf/bpe/v2/client/oidc/package-tree.html | 97 + .../dsf/bpe/v2/client/oidc/package-use.html | 105 + .../dev/dsf/bpe/v2/config/ProxyConfig.html | 280 +++ .../bpe/v2/config/class-use/ProxyConfig.html | 87 + .../dsf/bpe/v2/config/package-summary.html | 107 + .../dev/dsf/bpe/v2/config/package-tree.html | 72 + .../dev/dsf/bpe/v2/config/package-use.html | 84 + .../v2/constants/BpmnExecutionVariables.html | 253 ++ .../CodeSystems.BpmnMessage.Codes.html | 215 ++ .../v2/constants/CodeSystems.BpmnMessage.html | 278 +++ .../CodeSystems.BpmnUserTask.Codes.html | 181 ++ .../constants/CodeSystems.BpmnUserTask.html | 242 ++ .../CodeSystems.OrganizationRole.Codes.html | 300 +++ .../CodeSystems.OrganizationRole.html | 368 +++ .../CodeSystems.PractitionerRole.Codes.html | 317 +++ .../CodeSystems.PractitionerRole.html | 386 +++ ...odeSystems.ProcessAuthorization.Codes.html | 300 +++ .../CodeSystems.ProcessAuthorization.html | 368 +++ .../dev/dsf/bpe/v2/constants/CodeSystems.html | 147 ++ .../NamingSystems.EndpointIdentifier.html | 209 ++ .../NamingSystems.OrganizationIdentifier.html | 209 ++ .../NamingSystems.PractitionerIdentifier.html | 209 ++ .../NamingSystems.TaskIdentifier.html | 209 ++ .../dsf/bpe/v2/constants/NamingSystems.html | 144 ++ .../class-use/BpmnExecutionVariables.html | 62 + .../CodeSystems.BpmnMessage.Codes.html | 62 + .../class-use/CodeSystems.BpmnMessage.html | 62 + .../CodeSystems.BpmnUserTask.Codes.html | 62 + .../class-use/CodeSystems.BpmnUserTask.html | 62 + .../CodeSystems.OrganizationRole.Codes.html | 62 + .../CodeSystems.OrganizationRole.html | 62 + .../CodeSystems.PractitionerRole.Codes.html | 62 + .../CodeSystems.PractitionerRole.html | 62 + ...odeSystems.ProcessAuthorization.Codes.html | 62 + .../CodeSystems.ProcessAuthorization.html | 62 + .../v2/constants/class-use/CodeSystems.html | 62 + .../NamingSystems.EndpointIdentifier.html | 62 + .../NamingSystems.OrganizationIdentifier.html | 62 + .../NamingSystems.PractitionerIdentifier.html | 62 + .../NamingSystems.TaskIdentifier.html | 62 + .../v2/constants/class-use/NamingSystems.html | 62 + .../dsf/bpe/v2/constants/package-summary.html | 145 ++ .../dsf/bpe/v2/constants/package-tree.html | 92 + .../dev/dsf/bpe/v2/constants/package-use.html | 62 + .../documentation/ProcessDocumentation.html | 242 ++ .../class-use/ProcessDocumentation.html | 62 + .../bpe/v2/documentation/package-summary.html | 109 + .../bpe/v2/documentation/package-tree.html | 72 + .../dsf/bpe/v2/documentation/package-use.html | 62 + .../dsf/bpe/v2/error/ErrorBoundaryEvent.html | 222 ++ .../error/ErrorBoundaryEventErrorHandler.html | 168 ++ .../dev/dsf/bpe/v2/error/ErrorHandler.html | 110 + .../bpe/v2/error/ExceptionErrorHandler.html | 168 ++ .../error/ExecutionListenerErrorHandler.html | 124 + .../v2/error/MessageActivityErrorHandler.html | 171 ++ .../v2/error/MessageEndEventErrorHandler.html | 124 + ...ageIntermediateThrowEventErrorHandler.html | 124 + .../v2/error/MessageSendTaskErrorHandler.html | 127 + .../bpe/v2/error/ServiceTaskErrorHandler.html | 127 + .../error/UserTaskListenerErrorHandler.html | 124 + .../error/class-use/ErrorBoundaryEvent.html | 160 ++ .../ErrorBoundaryEventErrorHandler.html | 130 + .../bpe/v2/error/class-use/ErrorHandler.html | 167 ++ .../class-use/ExceptionErrorHandler.html | 133 + .../ExecutionListenerErrorHandler.html | 106 + .../MessageActivityErrorHandler.html | 118 + .../MessageEndEventErrorHandler.html | 103 + ...ageIntermediateThrowEventErrorHandler.html | 103 + .../MessageSendTaskErrorHandler.html | 106 + .../class-use/ServiceTaskErrorHandler.html | 106 + .../UserTaskListenerErrorHandler.html | 106 + .../v2/error/impl/AbstractErrorHandler.html | 302 +++ .../AbstractMessageActivityErrorHandler.html | 207 ++ .../DefaultExecutionListenerErrorHandler.html | 163 ++ .../DefaultMessageEndEventErrorHandler.html | 218 ++ ...ageIntermediateThrowEventErrorHandler.html | 218 ++ .../DefaultMessageSendTaskErrorHandler.html | 258 ++ .../impl/DefaultServiceTaskErrorHandler.html | 166 ++ .../DefaultUserTaskListenerErrorHandler.html | 163 ++ ...rBoundaryEventTranslationErrorHandler.html | 284 +++ .../impl/class-use/AbstractErrorHandler.html | 105 + .../AbstractMessageActivityErrorHandler.html | 93 + .../DefaultExecutionListenerErrorHandler.html | 62 + .../DefaultMessageEndEventErrorHandler.html | 62 + ...ageIntermediateThrowEventErrorHandler.html | 62 + .../DefaultMessageSendTaskErrorHandler.html | 62 + .../DefaultServiceTaskErrorHandler.html | 62 + .../DefaultUserTaskListenerErrorHandler.html | 62 + ...rBoundaryEventTranslationErrorHandler.html | 62 + .../bpe/v2/error/impl/package-summary.html | 123 + .../dsf/bpe/v2/error/impl/package-tree.html | 90 + .../dsf/bpe/v2/error/impl/package-use.html | 86 + .../dev/dsf/bpe/v2/error/package-summary.html | 131 + .../dev/dsf/bpe/v2/error/package-tree.html | 123 + .../dev/dsf/bpe/v2/error/package-use.html | 152 ++ .../v2/fhir/AbstractFhirResourceModifier.html | 308 +++ .../dsf/bpe/v2/fhir/FhirResourceModifier.html | 246 ++ .../AbstractFhirResourceModifier.html | 62 + .../fhir/class-use/FhirResourceModifier.html | 87 + .../dev/dsf/bpe/v2/fhir/package-summary.html | 114 + .../dev/dsf/bpe/v2/fhir/package-tree.html | 82 + .../dev/dsf/bpe/v2/fhir/package-use.html | 87 + .../dev/dsf/bpe/v2/package-summary.html | 134 ++ .../api-v2/dev/dsf/bpe/v2/package-tree.html | 74 + .../api-v2/dev/dsf/bpe/v2/package-use.html | 131 + .../dsf/bpe/v2/service/CryptoService.Kem.html | 275 +++ .../dev/dsf/bpe/v2/service/CryptoService.html | 849 +++++++ .../dsf/bpe/v2/service/DsfClientProvider.html | 182 ++ .../dsf/bpe/v2/service/EndpointProvider.html | 486 ++++ .../bpe/v2/service/FhirClientProvider.html | 215 ++ .../dev/dsf/bpe/v2/service/MailService.html | 296 +++ .../dsf/bpe/v2/service/MimetypeService.html | 182 ++ .../bpe/v2/service/OidcClientProvider.html | 221 ++ .../bpe/v2/service/OrganizationProvider.html | 374 +++ .../service/QuestionnaireResponseHelper.html | 232 ++ .../dsf/bpe/v2/service/ReadAccessHelper.html | 488 ++++ .../dev/dsf/bpe/v2/service/TaskHelper.html | 862 +++++++ .../service/class-use/CryptoService.Kem.html | 90 + .../v2/service/class-use/CryptoService.html | 87 + .../service/class-use/DsfClientProvider.html | 87 + .../service/class-use/EndpointProvider.html | 87 + .../service/class-use/FhirClientProvider.html | 87 + .../bpe/v2/service/class-use/MailService.html | 87 + .../v2/service/class-use/MimetypeService.html | 87 + .../service/class-use/OidcClientProvider.html | 87 + .../class-use/OrganizationProvider.html | 87 + .../QuestionnaireResponseHelper.html | 87 + .../service/class-use/ReadAccessHelper.html | 87 + .../bpe/v2/service/class-use/TaskHelper.html | 87 + .../dsf/bpe/v2/service/package-summary.html | 164 ++ .../dev/dsf/bpe/v2/service/package-tree.html | 83 + .../dev/dsf/bpe/v2/service/package-use.html | 150 ++ .../dsf/bpe/v2/service/process/Identity.html | 160 ++ .../service/process/OrganizationIdentity.html | 120 + .../service/process/PractitionerIdentity.html | 155 ++ ...sAuthorizationHelper.RecipientFactory.html | 169 ++ ...sAuthorizationHelper.RequesterFactory.html | 241 ++ .../process/ProcessAuthorizationHelper.html | 289 +++ .../dsf/bpe/v2/service/process/Recipient.html | 182 ++ .../dsf/bpe/v2/service/process/Requester.html | 182 ++ .../v2/service/process/WithAuthorization.html | 156 ++ .../service/process/class-use/Identity.html | 112 + .../class-use/OrganizationIdentity.html | 62 + .../class-use/PractitionerIdentity.html | 62 + ...sAuthorizationHelper.RecipientFactory.html | 87 + ...sAuthorizationHelper.RequesterFactory.html | 87 + .../class-use/ProcessAuthorizationHelper.html | 87 + .../service/process/class-use/Recipient.html | 128 + .../service/process/class-use/Requester.html | 168 ++ .../process/class-use/WithAuthorization.html | 90 + .../v2/service/process/package-summary.html | 123 + .../bpe/v2/service/process/package-tree.html | 86 + .../bpe/v2/service/process/package-use.html | 107 + .../spring/ActivityPrototypeBeanCreator.html | 222 ++ .../ActivityPrototypeBeanCreator.html | 62 + .../dsf/bpe/v2/spring/package-summary.html | 109 + .../dev/dsf/bpe/v2/spring/package-tree.html | 76 + .../dev/dsf/bpe/v2/spring/package-use.html | 62 + .../dev/dsf/bpe/v2/variables/Target.html | 198 ++ .../dev/dsf/bpe/v2/variables/Targets.html | 232 ++ .../dev/dsf/bpe/v2/variables/Variables.html | 1921 +++++++++++++++ .../bpe/v2/variables/class-use/Target.html | 239 ++ .../bpe/v2/variables/class-use/Targets.html | 145 ++ .../bpe/v2/variables/class-use/Variables.html | 330 +++ .../dsf/bpe/v2/variables/package-summary.html | 117 + .../dsf/bpe/v2/variables/package-tree.html | 74 + .../dev/dsf/bpe/v2/variables/package-use.html | 162 ++ .../public/assets/javadoc/api-v2/element-list | 17 + .../assets/javadoc/api-v2/help-doc.html | 203 ++ .../assets/javadoc/api-v2/index-all.html | 2139 +++++++++++++++++ .../public/assets/javadoc/api-v2/index.html | 103 + .../api-v2/legal/ADDITIONAL_LICENSE_INFO | 1 + .../javadoc/api-v2/legal/ASSEMBLY_EXCEPTION | 1 + .../assets/javadoc/api-v2/legal/LICENSE | 1 + .../assets/javadoc/api-v2/legal/jquery.md | 26 + .../assets/javadoc/api-v2/legal/jqueryUI.md | 49 + .../public/assets/javadoc/api-v2/link.svg | 31 + .../javadoc/api-v2/member-search-index.js | 1 + .../javadoc/api-v2/module-search-index.js | 1 + .../javadoc/api-v2/overview-summary.html | 26 + .../assets/javadoc/api-v2/overview-tree.html | 300 +++ .../javadoc/api-v2/package-search-index.js | 1 + .../assets/javadoc/api-v2/resources/glass.png | Bin 0 -> 499 bytes .../assets/javadoc/api-v2/resources/x.png | Bin 0 -> 394 bytes .../api-v2/script-dir/jquery-3.7.1.min.js | 2 + .../api-v2/script-dir/jquery-ui.min.css | 6 + .../api-v2/script-dir/jquery-ui.min.js | 6 + .../public/assets/javadoc/api-v2/script.js | 253 ++ .../assets/javadoc/api-v2/search-page.js | 284 +++ .../public/assets/javadoc/api-v2/search.html | 77 + .../public/assets/javadoc/api-v2/search.js | 458 ++++ .../javadoc/api-v2/serialized-form.html | 115 + .../assets/javadoc/api-v2/stylesheet.css | 1272 ++++++++++ .../assets/javadoc/api-v2/tag-search-index.js | 1 + .../javadoc/api-v2/type-search-index.js | 1 + docs/src/.vuepress/theme.ts | 14 +- docs/src/dsf-development/README.md | 2 +- docs/src/dsf-development/v2/fhir-ig.md | 5 + docs/src/dsf-development/v2/javadoc.md | 13 + docs/src/dsf-development/v2/maven.md | 5 + docs/src/dsf-development/v2/readme.md | 5 + docs/src/process-development/api-v1/README.md | 5 - docs/src/process-development/api-v1/index.md | 4 +- 302 files changed, 47871 insertions(+), 11 deletions(-) create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/META-INF/MANIFEST.MF create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/allclasses-index.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/allpackages-index.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/constant-values.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/copy.svg create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginApi.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDefinition.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDeploymentListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/Activity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/DefaultUserTaskListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ExecutionListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageActivity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageEndEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageIntermediateThrowEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageSendTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ServiceTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/UserTaskListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/Activity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/DefaultUserTaskListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ExecutionListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageActivity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageEndEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageIntermediateThrowEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageSendTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ServiceTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/UserTaskListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategies.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategy.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.TaskAndConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/TaskSender.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategies.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategy.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.TaskAndConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/TaskSender.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/CreateQuestionnaireResponseValues.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/SendTaskValues.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/CreateQuestionnaireResponseValues.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/SendTaskValues.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginApi.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDefinition.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDeploymentListener.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/BasicDsfClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/DsfClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimal.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimalWithRetry.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcome.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcomeWithRetry.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnResource.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/RetryClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/BasicDsfClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/DsfClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimal.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimalWithRetry.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcome.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcomeWithRetry.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnResource.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/RetryClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BasicAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BearerAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.CertificateAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.OidcAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.Proxy.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfigs.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BasicAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BearerAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.CertificateAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.OidcAuthentication.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.Proxy.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfigs.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Configuration.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.JwksKey.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClientException.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Configuration.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.JwksKey.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClientException.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/ProxyConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/class-use/ProxyConfig.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/BpmnExecutionVariables.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.EndpointIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.OrganizationIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.PractitionerIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.TaskIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/BpmnExecutionVariables.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.Codes.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.EndpointIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.OrganizationIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.PractitionerIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.TaskIdentifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/ProcessDocumentation.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/class-use/ProcessDocumentation.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExceptionErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExecutionListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageActivityErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageEndEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageIntermediateThrowEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageSendTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ServiceTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/UserTaskListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEvent.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExceptionErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExecutionListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageActivityErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageEndEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageIntermediateThrowEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageSendTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ServiceTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/UserTaskListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractMessageActivityErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultExecutionListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageEndEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageIntermediateThrowEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageSendTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultServiceTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultUserTaskListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/ExceptionToErrorBoundaryEventTranslationErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractMessageActivityErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultExecutionListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageEndEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageIntermediateThrowEventErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageSendTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultServiceTaskErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultUserTaskListenerErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/ExceptionToErrorBoundaryEventTranslationErrorHandler.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/AbstractFhirResourceModifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/FhirResourceModifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/AbstractFhirResourceModifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/FhirResourceModifier.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.Kem.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/DsfClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/EndpointProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/FhirClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MailService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MimetypeService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OidcClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OrganizationProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/QuestionnaireResponseHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/ReadAccessHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/TaskHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.Kem.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/DsfClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/EndpointProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/FhirClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MailService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MimetypeService.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OidcClientProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OrganizationProvider.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/QuestionnaireResponseHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/ReadAccessHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/TaskHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Identity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/OrganizationIdentity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/PractitionerIdentity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RecipientFactory.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RequesterFactory.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Recipient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Requester.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/WithAuthorization.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Identity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/OrganizationIdentity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/PractitionerIdentity.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RecipientFactory.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RequesterFactory.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Recipient.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Requester.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/WithAuthorization.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/ActivityPrototypeBeanCreator.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/class-use/ActivityPrototypeBeanCreator.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Target.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Targets.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Variables.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Target.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Targets.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Variables.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-use.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/element-list create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/help-doc.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/index-all.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/index.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ADDITIONAL_LICENSE_INFO create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ASSEMBLY_EXCEPTION create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/legal/LICENSE create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jquery.md create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jqueryUI.md create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/link.svg create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/member-search-index.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/module-search-index.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/overview-summary.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/overview-tree.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/package-search-index.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/resources/glass.png create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/resources/x.png create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-3.7.1.min.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-ui.min.css create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-ui.min.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/script.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/search-page.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/search.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/search.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/serialized-form.html create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/stylesheet.css create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/tag-search-index.js create mode 100644 docs/src/.vuepress/public/assets/javadoc/api-v2/type-search-index.js create mode 100644 docs/src/dsf-development/v2/javadoc.md create mode 100644 docs/src/dsf-development/v2/maven.md create mode 100644 docs/src/dsf-development/v2/readme.md delete mode 100644 docs/src/process-development/api-v1/README.md diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/META-INF/MANIFEST.MF b/docs/src/.vuepress/public/assets/javadoc/api-v2/META-INF/MANIFEST.MF new file mode 100644 index 000000000..ced1308d2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Created-By: Maven Javadoc Plugin 3.11.2 +Build-Jdk-Spec: 21 + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/allclasses-index.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/allclasses-index.html new file mode 100644 index 000000000..3add45114 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/allclasses-index.html @@ -0,0 +1,344 @@ +<!DOCTYPE HTML> +<html lang> +<head> +<!-- Generated by javadoc (21) on Tue Apr 01 00:38:16 CEST 2025 --> +<title>All Classes and Interfaces (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Classes and Interfaces

+
+
+
+
+
+
Class
+
Description
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Helper class to register Activitys as prototype beans.
+
+ +
 
+ +
+
Defines names of standard process engine variables used by the bpe
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Constants defining standard DSF CodeSystems
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Provides methods for: + + Creating and using RSA and ECDH key encapsulation mechanism + Reading X509 certificates and private-keys (encrypted or not encrypted) + Reading JKS and PKCS12 key-stores + Creating JKS and PKCS12 key-stores based on trusted certificates or private-key and certificate chain + Generating RSA (4096 bit), EC (secp256r1, secp384r1, secp521r1, X25519, X448) key-pairs + Validating key-pairs to check if a private-key belongs to a public-key + Validating certificates + Creating SSLContexts based on a key-store with trusted certificates and/or a key-store with private-key + and certificate chain +
+
+ +
+
Key encapsulation mechanism with encrypt and decrypt methods.
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Default UserTaskListener implementation.
+
+ +
 
+ +
 
+ +
+
Provides clients for DSF FHIR servers.
+
+ +
+
Provides access to Endpoint resources from the DSF FHIR server.
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Provides connection configurations and HAPI FHIR clients for configured (non DSF) FHIR servers and DSF FHIR servers.
+
+ +
+
When implementations of this interface are registered as singleton Bean, modify methods are called during + process plugin loading and before the plugin FHIR resource are stored in the DSF FHIR server.
+
+ +
 
+ +
 
+ +
 
+ +
+
Service for sending e-mail if a connection to an SMTP mail server is configured.
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Constants defining standard DSF NamingSystems
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Client Credentials Grant implementation to receive access tokens from an OIDC provider.
+
+ +
 
+ +
+
Provides access to OidcClients implementing the Client Credentials Grant.
+
+ +
 
+ +
+
Provides access to Organization resources from the DSF FHIR server.
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Annotation for documenting DSF process plugin properties.
+
+ +
+
Gives access to services available to process plugins.
+
+ +
+
A provider configuration file named "dev.dsf.ProcessPluginDefinition" containing the canonical name of the class + implementing this interface needs to be part of the process plugin at "/META-INF/services/".
+
+ +
+
Listener called after process plugin deployment with a list of deployed process-ids from this plugin.
+
+ +
 
+ +
+
Methods for manipulating QuestionnaireResponse resources.
+
+ +
+
Methods to configure read access for FHIR resources on a DSF FHIR server.
+
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
 
+ +
+
Specifies a communication target for FHIR Task resources.
+
+ +
+
Specifies a list of communication targets for FHIR Task resources.
+
+ +
+
Methods for manipulating Task resources.
+
+ +
 
+ +
 
+ +
 
+ +
+
Gives access to process execution variables.
+
+ +
 
+
+
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/allpackages-index.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/allpackages-index.html new file mode 100644 index 000000000..1e7b8cbfb --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/allpackages-index.html @@ -0,0 +1,101 @@ + + + + +All Packages (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + + + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/constant-values.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/constant-values.html new file mode 100644 index 000000000..3b884da2d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/constant-values.html @@ -0,0 +1,366 @@ + + + + +Constant Field Values (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Constant Field Values

+
+
+

Contents

+ +
+
+

dev.dsf.*

+ + + +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/copy.svg b/docs/src/.vuepress/public/assets/javadoc/api-v2/copy.svg new file mode 100644 index 000000000..7c46ab15f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/copy.svg @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginApi.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginApi.html new file mode 100644 index 000000000..2514e3cf7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginApi.html @@ -0,0 +1,279 @@ + + + + +ProcessPluginApi (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessPluginApi

+
+
+
+
public interface ProcessPluginApi
+
Gives access to services available to process plugins. This api and all services excepted Variables can be + injected using Autowired into spring Configuration classes.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getProxyConfig

      +
      ProxyConfig getProxyConfig()
      +
      +
    • +
    • +
      +

      getEndpointProvider

      +
      EndpointProvider getEndpointProvider()
      +
      +
    • +
    • +
      +

      getFhirContext

      +
      ca.uhn.fhir.context.FhirContext getFhirContext()
      +
      +
    • +
    • +
      +

      getDsfClientProvider

      +
      DsfClientProvider getDsfClientProvider()
      +
      +
    • +
    • +
      +

      getFhirClientProvider

      +
      FhirClientProvider getFhirClientProvider()
      +
      +
    • +
    • +
      +

      getOidcClientProvider

      +
      OidcClientProvider getOidcClientProvider()
      +
      +
    • +
    • +
      +

      getMailService

      +
      MailService getMailService()
      +
      +
    • +
    • +
      +

      getMimetypeService

      +
      MimetypeService getMimetypeService()
      +
      +
    • +
    • +
      +

      getObjectMapper

      +
      com.fasterxml.jackson.databind.ObjectMapper getObjectMapper()
      +
      +
    • +
    • +
      +

      getOrganizationProvider

      +
      OrganizationProvider getOrganizationProvider()
      +
      +
    • +
    • +
      +

      getProcessAuthorizationHelper

      +
      ProcessAuthorizationHelper getProcessAuthorizationHelper()
      +
      +
    • +
    • +
      +

      getQuestionnaireResponseHelper

      +
      QuestionnaireResponseHelper getQuestionnaireResponseHelper()
      +
      +
    • +
    • +
      +

      getReadAccessHelper

      +
      ReadAccessHelper getReadAccessHelper()
      +
      +
    • +
    • +
      +

      getTaskHelper

      +
      TaskHelper getTaskHelper()
      +
      +
    • +
    • +
      +

      getCryptoService

      +
      CryptoService getCryptoService()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDefinition.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDefinition.html new file mode 100644 index 000000000..d0dc17264 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDefinition.html @@ -0,0 +1,387 @@ + + + + +ProcessPluginDefinition (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessPluginDefinition

+
+
+
+
public interface ProcessPluginDefinition
+
A provider configuration file named "dev.dsf.ProcessPluginDefinition" containing the canonical name of the class + implementing this interface needs to be part of the process plugin at "/META-INF/services/". For more details on the + content of the provider configuration file, see ServiceLoader.
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      RESOURCE_VERSION_PATTERN_STRING

      +
      static final String RESOURCE_VERSION_PATTERN_STRING
      +
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      PLUGIN_VERSION_PATTERN_STRING

      +
      static final String PLUGIN_VERSION_PATTERN_STRING
      +
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      PLUGIN_VERSION_PATTERN

      +
      static final Pattern PLUGIN_VERSION_PATTERN
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getName

      +
      String getName()
      +
      +
      Returns:
      +
      process plugin name, same as jar name excluding suffix -<version>.jar
      +
      +
      +
    • +
    • +
      +

      getVersion

      +
      String getVersion()
      +
      +
      Returns:
      +
      version of the process plugin, must match "(?<pluginVersion>(?<resourceVersion>\\d+\\.\\d+)\\.\\d+\\.\\d+)"
      +
      +
      +
    • +
    • +
      +

      getResourceVersion

      +
      default String getResourceVersion()
      +
      Placeholder #{version} in FHIR and BPMN files will be replaced with the returned value.
      +
      +
      Returns:
      +
      version of FHIR and BPMN resources, must match "(?<resourceVersion>\\d+\\.\\d+)"
      +
      +
      +
    • +
    • +
      +

      getReleaseDate

      +
      LocalDate getReleaseDate()
      +
      +
      Returns:
      +
      the release date of the process plugin
      +
      +
      +
    • +
    • +
      +

      getResourceReleaseDate

      +
      default LocalDate getResourceReleaseDate()
      +
      Placeholder #{date} in FHIR and BPMN files will be replaced with the returned value.
      +
      +
      Returns:
      +
      the release date of FHIR resources and BPMN files
      +
      +
      +
    • +
    • +
      +

      getProcessModels

      +
      List<String> getProcessModels()
      +
      Return List.of("foo.bpmn"); for a foo.bpmn file located in the root folder of the process plugin + jar. The returned files will be read via ClassLoader.getResourceAsStream(String). +

      + Occurrences of #{version} will be replaced with the value of + getResourceVersion()
      + Occurrences of
      #{date} will be replaced with the value of + getResourceReleaseDate()
      + Occurrences of
      #{organization} will be replaced with the local organization DSF identifier + value, or "null" if no local organization can be found in the allow list
      + Other placeholders of the form
      #{property.name} will be replaced with values from equivalent + environment variable, e.g. PROPERTY_NAME

      +
      +
      Returns:
      +
      *.bpmn files inside the process plugin jar, paths relative to root folder of process plugin
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getFhirResourcesByProcessId

      +
      Map<String,List<String>> getFhirResourcesByProcessId()
      +
      Return Map.of("testcom_process", List.of("foo.xml")); for a foo.xml file located in the root + folder of the process plugin jar needed for a process called testcom_process. The returned files will be read via + ClassLoader.getResourceAsStream(String). +

      + Supported metadata resource types are ActivityDefinition, CodeSystem, Library, Measure, NamingSystem, + Questionnaire, StructureDefinition, Task and ValueSet. +

      + Occurrences of #{version} will be replaced with the value of + getResourceVersion()
      + Occurrences of
      #{date} will be replaced with the value of + getResourceReleaseDate()
      + Occurrences of
      #{organization} will be replaced with the local organization DSF identifier + value, or "null" if no local organization can be found in the allow list
      + Other placeholders of the form
      #{property.name} will be replaced with values from equivalent + environment variable, e.g. PROPERTY_NAME

      +
      +
      Returns:
      +
      *.xml or *.json files inside the process plugin jar per process, paths relative to root folder of process + plugin
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getSpringConfigurations

      +
      List<Class<?>> getSpringConfigurations()
      +
      List of Configuration annotated spring configuration classes. +

      + All services defined in ProcessPluginApi and ProcessPluginApi itself can be Autowired + in Configuration classes. +

      + All implementations used for BPMN service tasks, message send tasks and throw events as well as task- and user + task listeners need to be declared as spring Beans with Scope "prototype". + Other classes not directly used within BPMN activities should be declared with the default singleton scope. +

      + Configuration classes that defined private fields annotated with Value defining property placeholders, + can be configured via environment variables. A field private boolean specialFunction; + annotated with @Value("${org.test.process.special:false}") can be configured with the + environment variable ORG_TEST_PROCESS_SPECIAL. To take advantage of the + "dsf-tools-documentation-generator" maven plugin to generate a markdown file with configuration options for the + plugin also add the ProcessDocumentation annotation.

      +
      +
      Returns:
      +
      Configuration annotated classes, defining Bean annotated factory methods
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDeploymentListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDeploymentListener.html new file mode 100644 index 000000000..4ba6b7f05 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/ProcessPluginDeploymentListener.html @@ -0,0 +1,148 @@ + + + + +ProcessPluginDeploymentListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessPluginDeploymentListener

+
+
+
+
public interface ProcessPluginDeploymentListener
+
Listener called after process plugin deployment with a list of deployed process-ids from this plugin. List contains + all processes deployed in the bpe depending on the exclusion and retired config. +

+ Register a singleton Bean implementing this interface to execute custom code like connection tests if a + process has been deployed.

+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      onProcessesDeployed

      +
      void onProcessesDeployed(List<String> processes)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/Activity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/Activity.html new file mode 100644 index 000000000..f996eb871 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/Activity.html @@ -0,0 +1,151 @@ + + + + +Activity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Activity

+
+
+
+
All Known Subinterfaces:
+
ExecutionListener, MessageActivity, MessageEndEvent, MessageIntermediateThrowEvent, MessageSendTask, ServiceTask, UserTaskListener
+
+
+
All Known Implementing Classes:
+
DefaultUserTaskListener
+
+
+
public interface Activity
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getErrorHandler

      +
      ErrorHandler getErrorHandler()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/DefaultUserTaskListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/DefaultUserTaskListener.html new file mode 100644 index 000000000..e9af78188 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/DefaultUserTaskListener.html @@ -0,0 +1,271 @@ + + + + +DefaultUserTaskListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultUserTaskListener

+
+
java.lang.Object +
dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
+
+
+
All Implemented Interfaces:
+
Activity, UserTaskListener
+
+
+
public class DefaultUserTaskListener +extends Object +implements UserTaskListener
+
Default UserTaskListener implementation. This listener will be added to user tasks if no other + UserTaskListener is defined for the 'create' event type. +

+ BPMN user tasks need to define the form to be used with type 'Embedded or External Task Forms' and the canonical URL + of the a Questionnaire resource as the form key. +

+ To modify the behavior of the listener, for example to set default values in the created 'in-progress' + QuestionnaireResponse, extend this class, register it as a prototype Bean and specify the class name + as a task listener with event type 'create' in the BPMN.

+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultUserTaskListener

      +
      public DefaultUserTaskListener()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      notify

      +
      public void notify(ProcessPluginApi api, + Variables variables, + CreateQuestionnaireResponseValues createQuestionnaireResponseValues) + throws Exception
      +
      +
      Specified by:
      +
      notify in interface UserTaskListener
      +
      Throws:
      +
      Exception
      +
      +
      +
    • +
    • +
      +

      createQuestionnaireResponse

      +
      protected org.hl7.fhir.r4.model.QuestionnaireResponse createQuestionnaireResponse(ProcessPluginApi api, + org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
      +
      +
    • +
    • +
      +

      beforeQuestionnaireResponseCreate

      +
      protected void beforeQuestionnaireResponseCreate(ProcessPluginApi api, + Variables variables, + CreateQuestionnaireResponseValues createQuestionnaireResponseValues, + org.hl7.fhir.r4.model.QuestionnaireResponse beforeCreate)
      +
      Override this method to modify the QuestionnaireResponse before it will be created in state + QuestionnaireResponse.QuestionnaireResponseStatus.INPROGRESS on the DSF FHIR server
      +
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      createQuestionnaireResponseValues - not null
      +
      beforeCreate - not null, containing an answer placeholder for every item in the corresponding + Questionnaire
      +
      +
      +
    • +
    • +
      +

      afterQuestionnaireResponseCreate

      +
      protected void afterQuestionnaireResponseCreate(ProcessPluginApi api, + Variables variables, + CreateQuestionnaireResponseValues createQuestionnaireResponseValues, + org.hl7.fhir.r4.model.QuestionnaireResponse afterCreate)
      +
      Override this method to execute code after the QuestionnaireResponse resource has been created on the + DSF FHIR server
      +
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      createQuestionnaireResponseValues - not null
      +
      afterCreate - not null, created on the DSF FHIR server
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ExecutionListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ExecutionListener.html new file mode 100644 index 000000000..e83beac46 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ExecutionListener.html @@ -0,0 +1,168 @@ + + + + +ExecutionListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ExecutionListener

+
+
+
+
All Superinterfaces:
+
Activity
+
+
+
public interface ExecutionListener +extends Activity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageActivity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageActivity.html new file mode 100644 index 000000000..dd47d2869 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageActivity.html @@ -0,0 +1,233 @@ + + + + +MessageActivity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageActivity

+
+
+
+
All Superinterfaces:
+
Activity
+
+
+
All Known Subinterfaces:
+
MessageEndEvent, MessageIntermediateThrowEvent, MessageSendTask
+
+
+
public interface MessageActivity +extends Activity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageEndEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageEndEvent.html new file mode 100644 index 000000000..b9796b2ee --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageEndEvent.html @@ -0,0 +1,155 @@ + + + + +MessageEndEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageEndEvent

+
+
+
+
All Superinterfaces:
+
Activity, MessageActivity
+
+
+
public interface MessageEndEvent +extends MessageActivity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageIntermediateThrowEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageIntermediateThrowEvent.html new file mode 100644 index 000000000..850e100bf --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageIntermediateThrowEvent.html @@ -0,0 +1,155 @@ + + + + +MessageIntermediateThrowEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageIntermediateThrowEvent

+
+
+
+
All Superinterfaces:
+
Activity, MessageActivity
+
+
+
public interface MessageIntermediateThrowEvent +extends MessageActivity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageSendTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageSendTask.html new file mode 100644 index 000000000..2443989b6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/MessageSendTask.html @@ -0,0 +1,155 @@ + + + + +MessageSendTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageSendTask

+
+
+
+
All Superinterfaces:
+
Activity, MessageActivity
+
+
+
public interface MessageSendTask +extends MessageActivity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ServiceTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ServiceTask.html new file mode 100644 index 000000000..907660c79 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/ServiceTask.html @@ -0,0 +1,170 @@ + + + + +ServiceTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ServiceTask

+
+
+
+
All Superinterfaces:
+
Activity
+
+
+
public interface ServiceTask +extends Activity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/UserTaskListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/UserTaskListener.html new file mode 100644 index 000000000..0cbdeb946 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/UserTaskListener.html @@ -0,0 +1,174 @@ + + + + +UserTaskListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UserTaskListener

+
+
+
+
All Superinterfaces:
+
Activity
+
+
+
All Known Implementing Classes:
+
DefaultUserTaskListener
+
+
+
public interface UserTaskListener +extends Activity
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/Activity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/Activity.html new file mode 100644 index 000000000..fbc0c94f5 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/Activity.html @@ -0,0 +1,132 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.Activity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.Activity

+
+
Packages that use Activity
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/DefaultUserTaskListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/DefaultUserTaskListener.html new file mode 100644 index 000000000..f4d650717 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/DefaultUserTaskListener.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.activity.DefaultUserTaskListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.activity.DefaultUserTaskListener

+
+No usage of dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ExecutionListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ExecutionListener.html new file mode 100644 index 000000000..ec2792555 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ExecutionListener.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.ExecutionListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.ExecutionListener

+
+No usage of dev.dsf.bpe.v2.activity.ExecutionListener
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageActivity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageActivity.html new file mode 100644 index 000000000..d7976c030 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageActivity.html @@ -0,0 +1,93 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.MessageActivity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.MessageActivity

+
+
Packages that use MessageActivity
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageEndEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageEndEvent.html new file mode 100644 index 000000000..9b9da13e2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageEndEvent.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.MessageEndEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.MessageEndEvent

+
+No usage of dev.dsf.bpe.v2.activity.MessageEndEvent
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageIntermediateThrowEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageIntermediateThrowEvent.html new file mode 100644 index 000000000..fdda4617a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageIntermediateThrowEvent.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.MessageIntermediateThrowEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.MessageIntermediateThrowEvent

+
+No usage of dev.dsf.bpe.v2.activity.MessageIntermediateThrowEvent
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageSendTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageSendTask.html new file mode 100644 index 000000000..51c695550 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/MessageSendTask.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.MessageSendTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.MessageSendTask

+
+No usage of dev.dsf.bpe.v2.activity.MessageSendTask
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ServiceTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ServiceTask.html new file mode 100644 index 000000000..7a58e513f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/ServiceTask.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.ServiceTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.ServiceTask

+
+No usage of dev.dsf.bpe.v2.activity.ServiceTask
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/UserTaskListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/UserTaskListener.html new file mode 100644 index 000000000..d9f986352 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/class-use/UserTaskListener.html @@ -0,0 +1,89 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.UserTaskListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.UserTaskListener

+
+
Packages that use UserTaskListener
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-summary.html new file mode 100644 index 000000000..042f622ea --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-summary.html @@ -0,0 +1,131 @@ + + + + +dev.dsf.bpe.v2.activity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.activity

+
+
+
package dev.dsf.bpe.v2.activity
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-tree.html new file mode 100644 index 000000000..e9c7253bf --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-tree.html @@ -0,0 +1,95 @@ + + + + +dev.dsf.bpe.v2.activity Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.activity

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-use.html new file mode 100644 index 000000000..30d2f7eec --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/package-use.html @@ -0,0 +1,101 @@ + + + + +Uses of Package dev.dsf.bpe.v2.activity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.activity

+
+
Packages that use dev.dsf.bpe.v2.activity
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategies.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategies.html new file mode 100644 index 000000000..bc9d0b47e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategies.html @@ -0,0 +1,266 @@ + + + + +BusinessKeyStrategies (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Enum Class BusinessKeyStrategies

+
+
java.lang.Object +
java.lang.Enum<BusinessKeyStrategies> +
dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
+
+
+
All Implemented Interfaces:
+
BusinessKeyStrategy, Serializable, Comparable<BusinessKeyStrategies>, Constable
+
+
+
public enum BusinessKeyStrategies +extends Enum<BusinessKeyStrategies> +implements BusinessKeyStrategy
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    +
      +
    • +
      +

      SAME

      +
      public static final BusinessKeyStrategies SAME
      +
      Uses the business-key from the current process instance when sending Task resources. +

      + The target can reply to this process instance with the send key.

      +
      +
    • +
    • +
      +

      ALTERNATIVE

      +
      public static final BusinessKeyStrategies ALTERNATIVE
      +
      Generates an alternative buisness-key for the current process instance and uses the alternative when sending Task + resources. +

      + This can be used to hide the current business-key from the target, but allows the target to reply using the send + alternative business-key.

      +
      +
    • +
    • +
      +

      NEW

      +
      public static final BusinessKeyStrategies NEW
      +
      Generates a new business-key for every Task send. +

      + This does not allow the target to reply to the current process instance.

      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static BusinessKeyStrategies[] values()
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum class, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static BusinessKeyStrategies valueOf(String name)
      +
      Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum class has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategy.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategy.html new file mode 100644 index 000000000..31cba8a4e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/BusinessKeyStrategy.html @@ -0,0 +1,149 @@ + + + + +BusinessKeyStrategy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BusinessKeyStrategy

+
+
+
+
All Known Implementing Classes:
+
BusinessKeyStrategies
+
+
+
public interface BusinessKeyStrategy
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    get(Variables variables, + Target target)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.TaskAndConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.TaskAndConfig.html new file mode 100644 index 000000000..40fcf228b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.TaskAndConfig.html @@ -0,0 +1,388 @@ + + + + +DefaultTaskSender.TaskAndConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class DefaultTaskSender.TaskAndConfig

+
+
java.lang.Object +
java.lang.Record +
dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
+
+
+
Enclosing class:
+
DefaultTaskSender
+
+
+
protected static record DefaultTaskSender.TaskAndConfig(org.hl7.fhir.r4.model.Task task, String instantiatesCanonical, String organizationIdentifierValue, String endpointIdentifierValue, String endpointUrl, String businessKey, String correlationKey, String messageName) +extends Record
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Modifier
    +
    Constructor
    +
    Description
    +
    protected
    +
    TaskAndConfig(org.hl7.fhir.r4.model.Task task, + String instantiatesCanonical, + String organizationIdentifierValue, + String endpointIdentifierValue, + String endpointUrl, + String businessKey, + String correlationKey, + String messageName)
    +
    +
    Creates an instance of a TaskAndConfig record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Returns the value of the businessKey record component.
    +
    + + +
    +
    Returns the value of the correlationKey record component.
    +
    + + +
    +
    Returns the value of the endpointIdentifierValue record component.
    +
    + + +
    +
    Returns the value of the endpointUrl record component.
    +
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    + + +
    +
    Returns the value of the instantiatesCanonical record component.
    +
    + + +
    +
    Returns the value of the messageName record component.
    +
    + + +
    +
    Returns the value of the organizationIdentifierValue record component.
    +
    +
    org.hl7.fhir.r4.model.Task
    + +
    +
    Returns the value of the task record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TaskAndConfig

      +
      protected TaskAndConfig(org.hl7.fhir.r4.model.Task task, + String instantiatesCanonical, + String organizationIdentifierValue, + String endpointIdentifierValue, + String endpointUrl, + String businessKey, + String correlationKey, + String messageName)
      +
      Creates an instance of a TaskAndConfig record class.
      +
      +
      Parameters:
      +
      task - the value for the task record component
      +
      instantiatesCanonical - the value for the instantiatesCanonical record component
      +
      organizationIdentifierValue - the value for the organizationIdentifierValue record component
      +
      endpointIdentifierValue - the value for the endpointIdentifierValue record component
      +
      endpointUrl - the value for the endpointUrl record component
      +
      businessKey - the value for the businessKey record component
      +
      correlationKey - the value for the correlationKey record component
      +
      messageName - the value for the messageName record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      task

      +
      public org.hl7.fhir.r4.model.Task task()
      +
      Returns the value of the task record component.
      +
      +
      Returns:
      +
      the value of the task record component
      +
      +
      +
    • +
    • +
      +

      instantiatesCanonical

      +
      public String instantiatesCanonical()
      +
      Returns the value of the instantiatesCanonical record component.
      +
      +
      Returns:
      +
      the value of the instantiatesCanonical record component
      +
      +
      +
    • +
    • +
      +

      organizationIdentifierValue

      +
      public String organizationIdentifierValue()
      +
      Returns the value of the organizationIdentifierValue record component.
      +
      +
      Returns:
      +
      the value of the organizationIdentifierValue record component
      +
      +
      +
    • +
    • +
      +

      endpointIdentifierValue

      +
      public String endpointIdentifierValue()
      +
      Returns the value of the endpointIdentifierValue record component.
      +
      +
      Returns:
      +
      the value of the endpointIdentifierValue record component
      +
      +
      +
    • +
    • +
      +

      endpointUrl

      +
      public String endpointUrl()
      +
      Returns the value of the endpointUrl record component.
      +
      +
      Returns:
      +
      the value of the endpointUrl record component
      +
      +
      +
    • +
    • +
      +

      businessKey

      +
      public String businessKey()
      +
      Returns the value of the businessKey record component.
      +
      +
      Returns:
      +
      the value of the businessKey record component
      +
      +
      +
    • +
    • +
      +

      correlationKey

      +
      public String correlationKey()
      +
      Returns the value of the correlationKey record component.
      +
      +
      Returns:
      +
      the value of the correlationKey record component
      +
      +
      +
    • +
    • +
      +

      messageName

      +
      public String messageName()
      +
      Returns the value of the messageName record component.
      +
      +
      Returns:
      +
      the value of the messageName record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.html new file mode 100644 index 000000000..b92ff8fad --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/DefaultTaskSender.html @@ -0,0 +1,456 @@ + + + + +DefaultTaskSender (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultTaskSender

+
+
java.lang.Object +
dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
+
+
+
All Implemented Interfaces:
+
TaskSender
+
+
+
public class DefaultTaskSender +extends Object +implements TaskSender
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      api

      +
      protected final ProcessPluginApi api
      +
      +
    • +
    • +
      +

      variables

      +
      protected final Variables variables
      +
      +
    • +
    • +
      +

      sendTaskValues

      +
      protected final SendTaskValues sendTaskValues
      +
      +
    • +
    • +
      +

      businessKeyStrategy

      +
      protected final BusinessKeyStrategy businessKeyStrategy
      +
      +
    • +
    • +
      +

      additionalInputParameters

      +
      protected final Function<Target,List<org.hl7.fhir.r4.model.Task.ParameterComponent>> additionalInputParameters
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      send

      +
      public void send()
      +
      +
      Specified by:
      +
      send in interface TaskSender
      +
      +
      +
    • +
    • +
      +

      doSend

      +
      protected org.hl7.fhir.r4.model.IdType doSend(org.hl7.fhir.r4.model.Task task, + String targetEndpointUrl)
      +
      +
    • +
    • +
      +

      createTaskAndConfig

      +
      protected DefaultTaskSender.TaskAndConfig createTaskAndConfig(BusinessKeyStrategy businessKeyStrategy)
      +
      +
    • +
    • +
      +

      getTarget

      +
      protected Target getTarget()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getProfile

      +
      protected String getProfile(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getRequester

      +
      protected org.hl7.fhir.r4.model.Reference getRequester(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getRecipient

      +
      protected org.hl7.fhir.r4.model.Reference getRecipient(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getInstantiatesCanonical

      +
      protected String getInstantiatesCanonical(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getMessageName

      +
      protected String getMessageName(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getCorrelationKey

      +
      protected String getCorrelationKey(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getOrganizationIdentifierValue

      +
      protected String getOrganizationIdentifierValue(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getEndpointIdentifierValue

      +
      protected String getEndpointIdentifierValue(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getEndpointUrl

      +
      protected String getEndpointUrl(Target target)
      +
      +
      Parameters:
      +
      target - not null
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/TaskSender.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/TaskSender.html new file mode 100644 index 000000000..3194fe2dc --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/TaskSender.html @@ -0,0 +1,147 @@ + + + + +TaskSender (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TaskSender

+
+
+
+
All Known Implementing Classes:
+
DefaultTaskSender
+
+
+
public interface TaskSender
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      send

      +
      void send()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategies.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategies.html new file mode 100644 index 000000000..eb0ebb388 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategies.html @@ -0,0 +1,95 @@ + + + + +Uses of Enum Class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum Class
dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies

+
+
Packages that use BusinessKeyStrategies
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategy.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategy.html new file mode 100644 index 000000000..ae05c4e87 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/BusinessKeyStrategy.html @@ -0,0 +1,140 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy

+
+
Packages that use BusinessKeyStrategy
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.TaskAndConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.TaskAndConfig.html new file mode 100644 index 000000000..6116078e5 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.TaskAndConfig.html @@ -0,0 +1,87 @@ + + + + +Uses of Record Class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.html new file mode 100644 index 000000000..7993ef0c1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/DefaultTaskSender.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.activity.task.DefaultTaskSender (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.activity.task.DefaultTaskSender

+
+No usage of dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/TaskSender.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/TaskSender.html new file mode 100644 index 000000000..9b8592cc2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/class-use/TaskSender.html @@ -0,0 +1,105 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.activity.task.TaskSender (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.activity.task.TaskSender

+
+
Packages that use TaskSender
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-summary.html new file mode 100644 index 000000000..eb228a123 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-summary.html @@ -0,0 +1,119 @@ + + + + +dev.dsf.bpe.v2.activity.task (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.activity.task

+
+
+
package dev.dsf.bpe.v2.activity.task
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-tree.html new file mode 100644 index 000000000..d7d858cdc --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-tree.html @@ -0,0 +1,111 @@ + + + + +dev.dsf.bpe.v2.activity.task Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.activity.task

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-use.html new file mode 100644 index 000000000..a601c371d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/task/package-use.html @@ -0,0 +1,105 @@ + + + + +Uses of Package dev.dsf.bpe.v2.activity.task (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.activity.task

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/CreateQuestionnaireResponseValues.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/CreateQuestionnaireResponseValues.html new file mode 100644 index 000000000..4191f7af1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/CreateQuestionnaireResponseValues.html @@ -0,0 +1,268 @@ + + + + +CreateQuestionnaireResponseValues (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class CreateQuestionnaireResponseValues

+
+
java.lang.Object +
java.lang.Record +
dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
+
+
+
public record CreateQuestionnaireResponseValues(String userTaskId, String formKey) +extends Record
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    + +
    +
    Creates an instance of a CreateQuestionnaireResponseValues record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    + + +
    +
    Returns the value of the formKey record component.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    + + +
    +
    Returns the value of the userTaskId record component.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      CreateQuestionnaireResponseValues

      +
      public CreateQuestionnaireResponseValues(String userTaskId, + String formKey)
      +
      Creates an instance of a CreateQuestionnaireResponseValues record class.
      +
      +
      Parameters:
      +
      userTaskId - the value for the userTaskId record component
      +
      formKey - the value for the formKey record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      userTaskId

      +
      public String userTaskId()
      +
      Returns the value of the userTaskId record component.
      +
      +
      Returns:
      +
      the value of the userTaskId record component
      +
      +
      +
    • +
    • +
      +

      formKey

      +
      public String formKey()
      +
      Returns the value of the formKey record component.
      +
      +
      Returns:
      +
      the value of the formKey record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/SendTaskValues.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/SendTaskValues.html new file mode 100644 index 000000000..712d0fd96 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/SendTaskValues.html @@ -0,0 +1,287 @@ + + + + +SendTaskValues (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class SendTaskValues

+
+
java.lang.Object +
java.lang.Record +
dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
+
+
+
public record SendTaskValues(String instantiatesCanonical, String messageName, String profile) +extends Record
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    SendTaskValues(String instantiatesCanonical, + String messageName, + String profile)
    +
    +
    Creates an instance of a SendTaskValues record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    + + +
    +
    Returns the value of the instantiatesCanonical record component.
    +
    + + +
    +
    Returns the value of the messageName record component.
    +
    + + +
    +
    Returns the value of the profile record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      SendTaskValues

      +
      public SendTaskValues(String instantiatesCanonical, + String messageName, + String profile)
      +
      Creates an instance of a SendTaskValues record class.
      +
      +
      Parameters:
      +
      instantiatesCanonical - the value for the instantiatesCanonical record component
      +
      messageName - the value for the messageName record component
      +
      profile - the value for the profile record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      instantiatesCanonical

      +
      public String instantiatesCanonical()
      +
      Returns the value of the instantiatesCanonical record component.
      +
      +
      Returns:
      +
      the value of the instantiatesCanonical record component
      +
      +
      +
    • +
    • +
      +

      messageName

      +
      public String messageName()
      +
      Returns the value of the messageName record component.
      +
      +
      Returns:
      +
      the value of the messageName record component
      +
      +
      +
    • +
    • +
      +

      profile

      +
      public String profile()
      +
      Returns the value of the profile record component.
      +
      +
      Returns:
      +
      the value of the profile record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/CreateQuestionnaireResponseValues.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/CreateQuestionnaireResponseValues.html new file mode 100644 index 000000000..a29cf0f39 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/CreateQuestionnaireResponseValues.html @@ -0,0 +1,112 @@ + + + + +Uses of Record Class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/SendTaskValues.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/SendTaskValues.html new file mode 100644 index 000000000..9feaf7edb --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/class-use/SendTaskValues.html @@ -0,0 +1,223 @@ + + + + +Uses of Record Class dev.dsf.bpe.v2.activity.values.SendTaskValues (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
dev.dsf.bpe.v2.activity.values.SendTaskValues

+
+
Packages that use SendTaskValues
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-summary.html new file mode 100644 index 000000000..8ff7d0ec2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-summary.html @@ -0,0 +1,111 @@ + + + + +dev.dsf.bpe.v2.activity.values (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.activity.values

+
+
+
package dev.dsf.bpe.v2.activity.values
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-tree.html new file mode 100644 index 000000000..07a700ab3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-tree.html @@ -0,0 +1,81 @@ + + + + +dev.dsf.bpe.v2.activity.values Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.activity.values

+
+Package Hierarchies: + +
+

Record Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-use.html new file mode 100644 index 000000000..393345b35 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/activity/values/package-use.html @@ -0,0 +1,125 @@ + + + + +Uses of Package dev.dsf.bpe.v2.activity.values (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.activity.values

+
+ + +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginApi.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginApi.html new file mode 100644 index 000000000..783abf367 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginApi.html @@ -0,0 +1,324 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.ProcessPluginApi (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.ProcessPluginApi

+
+
Packages that use ProcessPluginApi
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDefinition.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDefinition.html new file mode 100644 index 000000000..4063c9cf3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDefinition.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.ProcessPluginDefinition (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.ProcessPluginDefinition

+
+No usage of dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDeploymentListener.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDeploymentListener.html new file mode 100644 index 000000000..6710db51e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/class-use/ProcessPluginDeploymentListener.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.ProcessPluginDeploymentListener (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.ProcessPluginDeploymentListener

+
+No usage of dev.dsf.bpe.v2.ProcessPluginDeploymentListener
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/BasicDsfClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/BasicDsfClient.html new file mode 100644 index 000000000..4ed13ac6a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/BasicDsfClient.html @@ -0,0 +1,454 @@ + + + + +BasicDsfClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BasicDsfClient

+
+
+
+
All Superinterfaces:
+
PreferReturnResource
+
+
+
All Known Subinterfaces:
+
DsfClient
+
+
+
public interface BasicDsfClient +extends PreferReturnResource
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    +
    delete(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + String id)
    +
     
    +
    void
    +
    deleteConditionaly(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + Map<String,List<String>> criteria)
    +
     
    +
    void
    +
    deletePermanently(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + String id)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    boolean
    +
    exists(Class<R> resourceType, + String id)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    boolean
    +
    exists(Class<R> resourceType, + String id, + String version)
    +
     
    +
    boolean
    +
    exists(org.hl7.fhir.r4.model.IdType resourceTypeIdVersion)
    +
     
    +
    org.hl7.fhir.r4.model.StructureDefinition
    + +
     
    +
    org.hl7.fhir.r4.model.StructureDefinition
    +
    generateSnapshot(org.hl7.fhir.r4.model.StructureDefinition differential)
    +
     
    +
    org.hl7.fhir.r4.model.CapabilityStatement
    + +
     
    +
    default org.hl7.fhir.r4.model.Bundle
    + +
     
    +
    default org.hl7.fhir.r4.model.Bundle
    +
    history(int page, + int count)
    +
     
    +
    default org.hl7.fhir.r4.model.Bundle
    +
    history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType)
    +
     
    +
    default org.hl7.fhir.r4.model.Bundle
    +
    history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + int page, + int count)
    +
     
    +
    default org.hl7.fhir.r4.model.Bundle
    +
    history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + String id)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + String id, + int page, + int count)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    read(Class<R> resourceType, + String id)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    read(Class<R> resourceType, + String id, + String version)
    +
     
    +
    org.hl7.fhir.r4.model.Resource
    +
    read(String resourceTypeName, + String id)
    +
     
    +
    org.hl7.fhir.r4.model.Resource
    +
    read(String resourceTypeName, + String id, + String version)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    read(R oldValue)
    +
    +
    Uses If-None-Match and If-Modified-Since Headers based on the version and lastUpdated values in oldValue + to check if the resource has been modified.
    +
    + +
    readBinary(String id, + jakarta.ws.rs.core.MediaType mediaType)
    +
     
    + +
    readBinary(String id, + String version, + jakarta.ws.rs.core.MediaType mediaType)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    search(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + Map<String,List<String>> parameters)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    searchWithStrictHandling(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + Map<String,List<String>> parameters)
    +
     
    +
    +
    +
    +
    +

    Methods inherited from interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource

    +create, createBinary, createConditionaly, postBundle, update, updateBinary, updateConditionaly
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      delete

      +
      void delete(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + String id)
      +
      +
    • +
    • +
      +

      deleteConditionaly

      +
      void deleteConditionaly(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + Map<String,List<String>> criteria)
      +
      +
    • +
    • +
      +

      deletePermanently

      +
      void deletePermanently(Class<? extends org.hl7.fhir.r4.model.Resource> resourceClass, + String id)
      +
      +
    • +
    • +
      +

      read

      +
      org.hl7.fhir.r4.model.Resource read(String resourceTypeName, + String id)
      +
      +
    • +
    • +
      +

      read

      +
      <R extends org.hl7.fhir.r4.model.Resource> R read(Class<R> resourceType, + String id)
      +
      +
      Type Parameters:
      +
      R -
      +
      Parameters:
      +
      resourceType - not null
      +
      id - not null
      +
      Returns:
      +
      +
      +
    • +
    • +
      +

      read

      +
      <R extends org.hl7.fhir.r4.model.Resource> R read(R oldValue)
      +
      Uses If-None-Match and If-Modified-Since Headers based on the version and lastUpdated values in oldValue + to check if the resource has been modified.
      +
      +
      Type Parameters:
      +
      R -
      +
      Parameters:
      +
      oldValue - not null
      +
      Returns:
      +
      oldValue (same object) if server send 304 - Not Modified, else value returned from server
      +
      +
      +
    • +
    • +
      +

      exists

      +
      <R extends org.hl7.fhir.r4.model.Resource> boolean exists(Class<R> resourceType, + String id)
      +
      +
    • +
    • +
      +

      readBinary

      +
      InputStream readBinary(String id, + jakarta.ws.rs.core.MediaType mediaType)
      +
      +
      Parameters:
      +
      id - not null
      +
      mediaType - not null
      +
      Returns:
      +
      InputStream needs to be closed
      +
      +
      +
    • +
    • +
      +

      read

      +
      org.hl7.fhir.r4.model.Resource read(String resourceTypeName, + String id, + String version)
      +
      +
      Parameters:
      +
      resourceTypeName - not null
      +
      id - not null
      +
      version - not null
      +
      Returns:
      +
      Resource
      +
      +
      +
    • +
    • +
      +

      read

      +
      <R extends org.hl7.fhir.r4.model.Resource> R read(Class<R> resourceType, + String id, + String version)
      +
      +
    • +
    • +
      +

      exists

      +
      <R extends org.hl7.fhir.r4.model.Resource> boolean exists(Class<R> resourceType, + String id, + String version)
      +
      +
    • +
    • +
      +

      readBinary

      +
      InputStream readBinary(String id, + String version, + jakarta.ws.rs.core.MediaType mediaType)
      +
      +
      Parameters:
      +
      id - not null
      +
      version - not null
      +
      mediaType - not null
      +
      Returns:
      +
      InputStream needs to be closed
      +
      +
      +
    • +
    • +
      +

      exists

      +
      boolean exists(org.hl7.fhir.r4.model.IdType resourceTypeIdVersion)
      +
      +
    • +
    • +
      +

      search

      +
      org.hl7.fhir.r4.model.Bundle search(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + Map<String,List<String>> parameters)
      +
      +
    • +
    • +
      +

      searchWithStrictHandling

      +
      org.hl7.fhir.r4.model.Bundle searchWithStrictHandling(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + Map<String,List<String>> parameters)
      +
      +
    • +
    • +
      +

      getConformance

      +
      org.hl7.fhir.r4.model.CapabilityStatement getConformance()
      +
      +
    • +
    • +
      +

      generateSnapshot

      +
      org.hl7.fhir.r4.model.StructureDefinition generateSnapshot(String url)
      +
      +
    • +
    • +
      +

      generateSnapshot

      +
      org.hl7.fhir.r4.model.StructureDefinition generateSnapshot(org.hl7.fhir.r4.model.StructureDefinition differential)
      +
      +
    • +
    • +
      +

      history

      +
      default org.hl7.fhir.r4.model.Bundle history()
      +
      +
    • +
    • +
      +

      history

      +
      default org.hl7.fhir.r4.model.Bundle history(int page, + int count)
      +
      +
    • +
    • +
      +

      history

      +
      default org.hl7.fhir.r4.model.Bundle history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType)
      +
      +
    • +
    • +
      +

      history

      +
      default org.hl7.fhir.r4.model.Bundle history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + int page, + int count)
      +
      +
    • +
    • +
      +

      history

      +
      default org.hl7.fhir.r4.model.Bundle history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + String id)
      +
      +
    • +
    • +
      +

      history

      +
      org.hl7.fhir.r4.model.Bundle history(Class<? extends org.hl7.fhir.r4.model.Resource> resourceType, + String id, + int page, + int count)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/DsfClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/DsfClient.html new file mode 100644 index 000000000..f378fac1c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/DsfClient.html @@ -0,0 +1,184 @@ + + + + +DsfClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DsfClient

+
+
+
+
All Superinterfaces:
+
BasicDsfClient, PreferReturnResource, RetryClient<BasicDsfClient>
+
+
+
public interface DsfClient +extends BasicDsfClient, RetryClient<BasicDsfClient>
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimal.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimal.html new file mode 100644 index 000000000..2e7592c89 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimal.html @@ -0,0 +1,215 @@ + + + + +PreferReturnMinimal (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PreferReturnMinimal

+
+
+
+
All Known Subinterfaces:
+
PreferReturnMinimalWithRetry
+
+
+
public interface PreferReturnMinimal
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.IdType
    +
    create(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    org.hl7.fhir.r4.model.IdType
    +
    createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    org.hl7.fhir.r4.model.IdType
    +
    createConditionaly(org.hl7.fhir.r4.model.Resource resource, + String ifNoneExistCriteria)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    postBundle(org.hl7.fhir.r4.model.Bundle bundle)
    +
     
    +
    org.hl7.fhir.r4.model.IdType
    +
    update(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    org.hl7.fhir.r4.model.IdType
    +
    updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    org.hl7.fhir.r4.model.IdType
    +
    updateConditionaly(org.hl7.fhir.r4.model.Resource resource, + Map<String,List<String>> criteria)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      create

      +
      org.hl7.fhir.r4.model.IdType create(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      createConditionaly

      +
      org.hl7.fhir.r4.model.IdType createConditionaly(org.hl7.fhir.r4.model.Resource resource, + String ifNoneExistCriteria)
      +
      +
    • +
    • +
      +

      createBinary

      +
      org.hl7.fhir.r4.model.IdType createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      update

      +
      org.hl7.fhir.r4.model.IdType update(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      updateConditionaly

      +
      org.hl7.fhir.r4.model.IdType updateConditionaly(org.hl7.fhir.r4.model.Resource resource, + Map<String,List<String>> criteria)
      +
      +
    • +
    • +
      +

      updateBinary

      +
      org.hl7.fhir.r4.model.IdType updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      postBundle

      +
      org.hl7.fhir.r4.model.Bundle postBundle(org.hl7.fhir.r4.model.Bundle bundle)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimalWithRetry.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimalWithRetry.html new file mode 100644 index 000000000..9b9494386 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnMinimalWithRetry.html @@ -0,0 +1,132 @@ + + + + +PreferReturnMinimalWithRetry (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PreferReturnMinimalWithRetry

+
+
+
+
All Superinterfaces:
+
PreferReturnMinimal, RetryClient<PreferReturnMinimal>
+
+
+
public interface PreferReturnMinimalWithRetry +extends PreferReturnMinimal, RetryClient<PreferReturnMinimal>
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcome.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcome.html new file mode 100644 index 000000000..91d427644 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcome.html @@ -0,0 +1,215 @@ + + + + +PreferReturnOutcome (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PreferReturnOutcome

+
+
+
+
All Known Subinterfaces:
+
PreferReturnOutcomeWithRetry
+
+
+
public interface PreferReturnOutcome
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    create(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    createConditionaly(org.hl7.fhir.r4.model.Resource resource, + String ifNoneExistCriteria)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    postBundle(org.hl7.fhir.r4.model.Bundle bundle)
    +
     
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    update(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    org.hl7.fhir.r4.model.OperationOutcome
    +
    updateConditionaly(org.hl7.fhir.r4.model.Resource resource, + Map<String,List<String>> criteria)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      create

      +
      org.hl7.fhir.r4.model.OperationOutcome create(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      createConditionaly

      +
      org.hl7.fhir.r4.model.OperationOutcome createConditionaly(org.hl7.fhir.r4.model.Resource resource, + String ifNoneExistCriteria)
      +
      +
    • +
    • +
      +

      createBinary

      +
      org.hl7.fhir.r4.model.OperationOutcome createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      update

      +
      org.hl7.fhir.r4.model.OperationOutcome update(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      updateConditionaly

      +
      org.hl7.fhir.r4.model.OperationOutcome updateConditionaly(org.hl7.fhir.r4.model.Resource resource, + Map<String,List<String>> criteria)
      +
      +
    • +
    • +
      +

      updateBinary

      +
      org.hl7.fhir.r4.model.OperationOutcome updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      postBundle

      +
      org.hl7.fhir.r4.model.Bundle postBundle(org.hl7.fhir.r4.model.Bundle bundle)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcomeWithRetry.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcomeWithRetry.html new file mode 100644 index 000000000..386c17e8f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnOutcomeWithRetry.html @@ -0,0 +1,132 @@ + + + + +PreferReturnOutcomeWithRetry (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PreferReturnOutcomeWithRetry

+
+
+
+
All Superinterfaces:
+
PreferReturnOutcome, RetryClient<PreferReturnOutcome>
+
+
+
public interface PreferReturnOutcomeWithRetry +extends PreferReturnOutcome, RetryClient<PreferReturnOutcome>
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnResource.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnResource.html new file mode 100644 index 000000000..d1189b404 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/PreferReturnResource.html @@ -0,0 +1,215 @@ + + + + +PreferReturnResource (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PreferReturnResource

+
+
+
+
All Known Subinterfaces:
+
BasicDsfClient, DsfClient
+
+
+
public interface PreferReturnResource
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    create(R resource)
    +
     
    +
    org.hl7.fhir.r4.model.Binary
    +
    createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    createConditionaly(R resource, + String ifNoneExistCriteria)
    +
     
    +
    org.hl7.fhir.r4.model.Bundle
    +
    postBundle(org.hl7.fhir.r4.model.Bundle bundle)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    update(R resource)
    +
     
    +
    org.hl7.fhir.r4.model.Binary
    +
    updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
    +
     
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    updateConditionaly(R resource, + Map<String,List<String>> criteria)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      create

      +
      <R extends org.hl7.fhir.r4.model.Resource> R create(R resource)
      +
      +
    • +
    • +
      +

      createConditionaly

      +
      <R extends org.hl7.fhir.r4.model.Resource> R createConditionaly(R resource, + String ifNoneExistCriteria)
      +
      +
    • +
    • +
      +

      createBinary

      +
      org.hl7.fhir.r4.model.Binary createBinary(InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      update

      +
      <R extends org.hl7.fhir.r4.model.Resource> R update(R resource)
      +
      +
    • +
    • +
      +

      updateConditionaly

      +
      <R extends org.hl7.fhir.r4.model.Resource> R updateConditionaly(R resource, + Map<String,List<String>> criteria)
      +
      +
    • +
    • +
      +

      updateBinary

      +
      org.hl7.fhir.r4.model.Binary updateBinary(String id, + InputStream in, + jakarta.ws.rs.core.MediaType mediaType, + String securityContextReference)
      +
      +
    • +
    • +
      +

      postBundle

      +
      org.hl7.fhir.r4.model.Bundle postBundle(org.hl7.fhir.r4.model.Bundle bundle)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/RetryClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/RetryClient.html new file mode 100644 index 000000000..bd226bd40 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/RetryClient.html @@ -0,0 +1,294 @@ + + + + +RetryClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RetryClient<T>

+
+
+
+
All Known Subinterfaces:
+
DsfClient, PreferReturnMinimalWithRetry, PreferReturnOutcomeWithRetry
+
+
+
public interface RetryClient<T>
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/BasicDsfClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/BasicDsfClient.html new file mode 100644 index 000000000..892b20d69 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/BasicDsfClient.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.BasicDsfClient

+
+
Packages that use BasicDsfClient
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/DsfClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/DsfClient.html new file mode 100644 index 000000000..329a1e42b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/DsfClient.html @@ -0,0 +1,93 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.DsfClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.DsfClient

+
+
Packages that use DsfClient
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimal.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimal.html new file mode 100644 index 000000000..6d57e9a2c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimal.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal

+
+
Packages that use PreferReturnMinimal
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimalWithRetry.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimalWithRetry.html new file mode 100644 index 000000000..5b6d96645 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnMinimalWithRetry.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimalWithRetry (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.PreferReturnMinimalWithRetry

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcome.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcome.html new file mode 100644 index 000000000..26c625bc9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcome.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome

+
+
Packages that use PreferReturnOutcome
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcomeWithRetry.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcomeWithRetry.html new file mode 100644 index 000000000..ddf2380ed --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnOutcomeWithRetry.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcomeWithRetry (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.PreferReturnOutcomeWithRetry

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnResource.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnResource.html new file mode 100644 index 000000000..e91457142 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/PreferReturnResource.html @@ -0,0 +1,90 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.PreferReturnResource

+
+
Packages that use PreferReturnResource
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/RetryClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/RetryClient.html new file mode 100644 index 000000000..8685a7603 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/class-use/RetryClient.html @@ -0,0 +1,93 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.dsf.RetryClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.dsf.RetryClient

+
+
Packages that use RetryClient
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-summary.html new file mode 100644 index 000000000..1b3f33503 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-summary.html @@ -0,0 +1,110 @@ + + + + +dev.dsf.bpe.v2.client.dsf (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.client.dsf

+
+
+
package dev.dsf.bpe.v2.client.dsf
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-tree.html new file mode 100644 index 000000000..f2e4b8cc4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-tree.html @@ -0,0 +1,97 @@ + + + + +dev.dsf.bpe.v2.client.dsf Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.client.dsf

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-use.html new file mode 100644 index 000000000..084bb43c2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/dsf/package-use.html @@ -0,0 +1,109 @@ + + + + +Uses of Package dev.dsf.bpe.v2.client.dsf (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.client.dsf

+
+
Packages that use dev.dsf.bpe.v2.client.dsf
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BasicAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BasicAuthentication.html new file mode 100644 index 000000000..23ae495d9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BasicAuthentication.html @@ -0,0 +1,164 @@ + + + + +ClientConfig.BasicAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig.BasicAuthentication

+
+
+
+
Enclosing interface:
+
ClientConfig
+
+
+
public static interface ClientConfig.BasicAuthentication
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    char[]
    + +
     
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getUsername

      +
      String getUsername()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getPassword

      +
      char[] getPassword()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BearerAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BearerAuthentication.html new file mode 100644 index 000000000..1cf0b021b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.BearerAuthentication.html @@ -0,0 +1,151 @@ + + + + +ClientConfig.BearerAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig.BearerAuthentication

+
+
+
+
Enclosing interface:
+
ClientConfig
+
+
+
public static interface ClientConfig.BearerAuthentication
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    char[]
    + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getToken

      +
      char[] getToken()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.CertificateAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.CertificateAuthentication.html new file mode 100644 index 000000000..ab074a605 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.CertificateAuthentication.html @@ -0,0 +1,164 @@ + + + + +ClientConfig.CertificateAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig.CertificateAuthentication

+
+
+
+
Enclosing interface:
+
ClientConfig
+
+
+
public static interface ClientConfig.CertificateAuthentication
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getKeyStore

      +
      KeyStore getKeyStore()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getKeyStorePassword

      +
      char[] getKeyStorePassword()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.OidcAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.OidcAuthentication.html new file mode 100644 index 000000000..4f9c9a8b4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.OidcAuthentication.html @@ -0,0 +1,260 @@ + + + + +ClientConfig.OidcAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig.OidcAuthentication

+
+
+
+
Enclosing interface:
+
ClientConfig
+
+
+
public static interface ClientConfig.OidcAuthentication
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getBaseUrl

      +
      String getBaseUrl()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getDiscoveryPath

      +
      String getDiscoveryPath()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      isStartupConnectionTestEnabled

      +
      boolean isStartupConnectionTestEnabled()
      +
      +
    • +
    • +
      +

      isDebugLoggingEnabled

      +
      boolean isDebugLoggingEnabled()
      +
      +
    • +
    • +
      +

      getConnectTimeout

      +
      Duration getConnectTimeout()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getReadTimeout

      +
      Duration getReadTimeout()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getTrustStore

      +
      KeyStore getTrustStore()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getClientId

      +
      String getClientId()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getClientSecret

      +
      char[] getClientSecret()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getProxy

      +
      ClientConfig.Proxy getProxy()
      +
      +
      Returns:
      +
      null if not enabled or configured as no-proxy url
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.Proxy.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.Proxy.html new file mode 100644 index 000000000..2b25b825f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.Proxy.html @@ -0,0 +1,177 @@ + + + + +ClientConfig.Proxy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig.Proxy

+
+
+
+
Enclosing interface:
+
ClientConfig
+
+
+
public static interface ClientConfig.Proxy
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    char[]
    + +
     
    + + +
     
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getUrl

      +
      String getUrl()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getUsername

      +
      String getUsername()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getPassword

      +
      char[] getPassword()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.html new file mode 100644 index 000000000..fae4f9932 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfig.html @@ -0,0 +1,309 @@ + + + + +ClientConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfig

+
+
+
+
public interface ClientConfig
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getFhirServerId

      +
      String getFhirServerId()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getBaseUrl

      +
      String getBaseUrl()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      isStartupConnectionTestEnabled

      +
      boolean isStartupConnectionTestEnabled()
      +
      +
    • +
    • +
      +

      isDebugLoggingEnabled

      +
      boolean isDebugLoggingEnabled()
      +
      +
    • +
    • +
      +

      getConnectTimeout

      +
      Duration getConnectTimeout()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getReadTimeout

      +
      Duration getReadTimeout()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getTrustStore

      +
      KeyStore getTrustStore()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getCertificateAuthentication

      +
      ClientConfig.CertificateAuthentication getCertificateAuthentication()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getBasicAuthentication

      +
      ClientConfig.BasicAuthentication getBasicAuthentication()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getBearerAuthentication

      +
      ClientConfig.BearerAuthentication getBearerAuthentication()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getOidcAuthentication

      +
      ClientConfig.OidcAuthentication getOidcAuthentication()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getProxy

      +
      ClientConfig.Proxy getProxy()
      +
      +
      Returns:
      +
      null if not enabled or configured as no-proxy url
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfigs.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfigs.html new file mode 100644 index 000000000..861930abe --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/ClientConfigs.html @@ -0,0 +1,143 @@ + + + + +ClientConfigs (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientConfigs

+
+
+
+
public interface ClientConfigs
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BasicAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BasicAuthentication.html new file mode 100644 index 000000000..9d0343dba --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BasicAuthentication.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig.BasicAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig.BasicAuthentication

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BearerAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BearerAuthentication.html new file mode 100644 index 000000000..c77d50d05 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.BearerAuthentication.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig.BearerAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig.BearerAuthentication

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.CertificateAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.CertificateAuthentication.html new file mode 100644 index 000000000..4546f8110 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.CertificateAuthentication.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig.CertificateAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig.CertificateAuthentication

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.OidcAuthentication.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.OidcAuthentication.html new file mode 100644 index 000000000..20d7bbb96 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.OidcAuthentication.html @@ -0,0 +1,103 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.Proxy.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.Proxy.html new file mode 100644 index 000000000..97fd28014 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.Proxy.html @@ -0,0 +1,90 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig.Proxy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig.Proxy

+
+
Packages that use ClientConfig.Proxy
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.html new file mode 100644 index 000000000..cb33a454a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfig.html @@ -0,0 +1,111 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfig

+
+
Packages that use ClientConfig
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfigs.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfigs.html new file mode 100644 index 000000000..8dd91e44f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/class-use/ClientConfigs.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.fhir.ClientConfigs (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.fhir.ClientConfigs

+
+No usage of dev.dsf.bpe.v2.client.fhir.ClientConfigs
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-summary.html new file mode 100644 index 000000000..d59ec7d36 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-summary.html @@ -0,0 +1,108 @@ + + + + +dev.dsf.bpe.v2.client.fhir (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.client.fhir

+
+
+
package dev.dsf.bpe.v2.client.fhir
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-tree.html new file mode 100644 index 000000000..cd05bd71c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-tree.html @@ -0,0 +1,78 @@ + + + + +dev.dsf.bpe.v2.client.fhir Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.client.fhir

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-use.html new file mode 100644 index 000000000..384aaf043 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/fhir/package-use.html @@ -0,0 +1,109 @@ + + + + +Uses of Package dev.dsf.bpe.v2.client.fhir (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.client.fhir

+
+
Packages that use dev.dsf.bpe.v2.client.fhir
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Configuration.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Configuration.html new file mode 100644 index 000000000..fbf1c0412 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Configuration.html @@ -0,0 +1,170 @@ + + + + +Configuration (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Configuration

+
+
+
+
public interface Configuration
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getIssuer

      +
      String getIssuer()
      +
      +
    • +
    • +
      +

      getTokenEndpoint

      +
      String getTokenEndpoint()
      +
      +
    • +
    • +
      +

      getJwksUri

      +
      String getJwksUri()
      +
      +
    • +
    • +
      +

      getGrantTypesSupported

      +
      Set<String> getGrantTypesSupported()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.JwksKey.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.JwksKey.html new file mode 100644 index 000000000..e1c61a3c6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.JwksKey.html @@ -0,0 +1,219 @@ + + + + +Jwks.JwksKey (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Jwks.JwksKey

+
+
+
+
Enclosing interface:
+
Jwks
+
+
+
public static interface Jwks.JwksKey
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getKid

      +
      String getKid()
      +
      +
    • +
    • +
      +

      getKty

      +
      String getKty()
      +
      +
    • +
    • +
      +

      getAlg

      +
      String getAlg()
      +
      +
    • +
    • +
      +

      getCrv

      +
      String getCrv()
      +
      +
    • +
    • +
      +

      getUse

      +
      String getUse()
      +
      +
    • +
    • +
      +

      getN

      +
      String getN()
      +
      +
    • +
    • +
      +

      getE

      +
      String getE()
      +
      +
    • +
    • +
      +

      getX

      +
      String getX()
      +
      +
    • +
    • +
      +

      getY

      +
      String getY()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.html new file mode 100644 index 000000000..9693d68c4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/Jwks.html @@ -0,0 +1,167 @@ + + + + +Jwks (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Jwks

+
+
+
+
public interface Jwks
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    Nested Classes
    +
    +
    Modifier and Type
    +
    Interface
    +
    Description
    +
    static interface 
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClient.html new file mode 100644 index 000000000..dd8aa9d1a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClient.html @@ -0,0 +1,224 @@ + + + + +OidcClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OidcClient

+
+
+
+
public interface OidcClient
+
Client Credentials Grant implementation to receive access tokens from an OIDC provider.
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClientException.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClientException.html new file mode 100644 index 000000000..8663f8c4e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/OidcClientException.html @@ -0,0 +1,181 @@ + + + + +OidcClientException (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class OidcClientException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
dev.dsf.bpe.v2.client.oidc.OidcClientException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class OidcClientException +extends RuntimeException
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      OidcClientException

      +
      public OidcClientException(String message, + Throwable cause)
      +
      +
    • +
    • +
      +

      OidcClientException

      +
      public OidcClientException(String message)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Configuration.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Configuration.html new file mode 100644 index 000000000..9501c43a8 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Configuration.html @@ -0,0 +1,100 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.oidc.Configuration (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.oidc.Configuration

+
+
Packages that use Configuration
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.JwksKey.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.JwksKey.html new file mode 100644 index 000000000..51d271866 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.JwksKey.html @@ -0,0 +1,90 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey

+
+
Packages that use Jwks.JwksKey
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.html new file mode 100644 index 000000000..74758d936 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/Jwks.html @@ -0,0 +1,100 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.oidc.Jwks (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.oidc.Jwks

+
+
Packages that use Jwks
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClient.html new file mode 100644 index 000000000..e9c256487 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClient.html @@ -0,0 +1,102 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.client.oidc.OidcClient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.client.oidc.OidcClient

+
+
Packages that use OidcClient
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClientException.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClientException.html new file mode 100644 index 000000000..b9d8697f1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/class-use/OidcClientException.html @@ -0,0 +1,100 @@ + + + + +Uses of Class dev.dsf.bpe.v2.client.oidc.OidcClientException (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.client.oidc.OidcClientException

+
+
Packages that use OidcClientException
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-summary.html new file mode 100644 index 000000000..c159114c7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-summary.html @@ -0,0 +1,108 @@ + + + + +dev.dsf.bpe.v2.client.oidc (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.client.oidc

+
+
+
package dev.dsf.bpe.v2.client.oidc
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-tree.html new file mode 100644 index 000000000..a569c1986 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-tree.html @@ -0,0 +1,97 @@ + + + + +dev.dsf.bpe.v2.client.oidc Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.client.oidc

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-use.html new file mode 100644 index 000000000..1154e29f6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/client/oidc/package-use.html @@ -0,0 +1,105 @@ + + + + +Uses of Package dev.dsf.bpe.v2.client.oidc (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.client.oidc

+
+
Packages that use dev.dsf.bpe.v2.client.oidc
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/ProxyConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/ProxyConfig.html new file mode 100644 index 000000000..6b8325b3d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/ProxyConfig.html @@ -0,0 +1,280 @@ + + + + +ProxyConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProxyConfig

+
+
+
+
public interface ProxyConfig
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getUrl

      +
      String getUrl()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      isEnabled

      +
      boolean isEnabled()
      +
      +
      Returns:
      +
      true if a proxy url is configured and '*' is not set as a no-proxy url
      +
      +
      +
    • +
    • +
      +

      isEnabled

      +
      boolean isEnabled(String targetUrl)
      +
      +
      Parameters:
      +
      targetUrl - may be null
      +
      Returns:
      +
      true if a proxy url is configured, '*' is not set as a no-proxy url and the given + targetUrl is not set as a no-proxy url, false if the given targetUrl is + null, blank or configured as a no-proxy url
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getUsername

      +
      String getUsername()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getPassword

      +
      char[] getPassword()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    • +
      +

      getNoProxyUrls

      +
      List<String> getNoProxyUrls()
      +
      +
      Returns:
      +
      never null, may be empty
      +
      +
      +
    • +
    • +
      +

      isNoProxyUrl

      +
      boolean isNoProxyUrl(String url)
      +
      Returns true if the given url is not null and the domain + port of the given + url is configured as a no-proxy URL based on the environment configuration. +

      + Configured no-proxy URLs are matched exactly and against sub-domains. If a port is configured, only URLs with the + same port (or default port) return a true result. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      No-Proxy URL examples
      ConfiguredGivenResult
      foo.bar, test.com:8080https://foo.bar/fhirtrue
      foo.bar, test.com:8080https://baz.foo.bar/testtrue
      foo.bar, test.com:8080https://test.com:8080/fhirtrue
      foo.bar, test.com:8080https://test.com/fhirfalse
      foo.bar:443https://foo.bar/fhirtrue

      +
      +
      Parameters:
      +
      url - may be null
      +
      Returns:
      +
      true if the given url is not null and is configured as a no-proxy url
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/class-use/ProxyConfig.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/class-use/ProxyConfig.html new file mode 100644 index 000000000..fb7396dd1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/class-use/ProxyConfig.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.config.ProxyConfig (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.config.ProxyConfig

+
+
Packages that use ProxyConfig
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-summary.html new file mode 100644 index 000000000..5f47d317b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-summary.html @@ -0,0 +1,107 @@ + + + + +dev.dsf.bpe.v2.config (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.config

+
+
+
package dev.dsf.bpe.v2.config
+
+
    +
  • + +
  • +
  • +
    +
    Interfaces
    +
    +
    Class
    +
    Description
    + +
     
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-tree.html new file mode 100644 index 000000000..f2d545ff4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-tree.html @@ -0,0 +1,72 @@ + + + + +dev.dsf.bpe.v2.config Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.config

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-use.html new file mode 100644 index 000000000..a28df9d06 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/config/package-use.html @@ -0,0 +1,84 @@ + + + + +Uses of Package dev.dsf.bpe.v2.config (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.config

+
+
Packages that use dev.dsf.bpe.v2.config
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/BpmnExecutionVariables.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/BpmnExecutionVariables.html new file mode 100644 index 000000000..7c4b49bc2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/BpmnExecutionVariables.html @@ -0,0 +1,253 @@ + + + + +BpmnExecutionVariables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class BpmnExecutionVariables

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
+
+
public final class BpmnExecutionVariables +extends Object
+
Defines names of standard process engine variables used by the bpe
+
+
See Also:
+
+ +
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.Codes.html new file mode 100644 index 000000000..d9c689f61 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.Codes.html @@ -0,0 +1,215 @@ + + + + +CodeSystems.BpmnMessage.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.BpmnMessage.Codes

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
+
+
+
Enclosing class:
+
CodeSystems.BpmnMessage
+
+
+
public static final class CodeSystems.BpmnMessage.Codes +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.html new file mode 100644 index 000000000..8f74fe387 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnMessage.html @@ -0,0 +1,278 @@ + + + + +CodeSystems.BpmnMessage (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.BpmnMessage

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
+
+
+
Enclosing class:
+
CodeSystems
+
+
+
public static final class CodeSystems.BpmnMessage +extends Object
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    Nested Classes
    +
    +
    Modifier and Type
    +
    Class
    +
    Description
    +
    static final class 
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    static final String
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final boolean
    +
    isBusinessKey(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isCorrelationKey(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isError(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isMessageName(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static org.hl7.fhir.r4.model.Coding
    + +
     
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCode

      +
      public static org.hl7.fhir.r4.model.Coding withCode(String code)
      +
      +
    • +
    • +
      +

      messageName

      +
      public static final org.hl7.fhir.r4.model.Coding messageName()
      +
      +
    • +
    • +
      +

      businessKey

      +
      public static final org.hl7.fhir.r4.model.Coding businessKey()
      +
      +
    • +
    • +
      +

      correlationKey

      +
      public static final org.hl7.fhir.r4.model.Coding correlationKey()
      +
      +
    • +
    • +
      +

      error

      +
      public static final org.hl7.fhir.r4.model.Coding error()
      +
      +
    • +
    • +
      +

      isMessageName

      +
      public static final boolean isMessageName(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isBusinessKey

      +
      public static final boolean isBusinessKey(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isCorrelationKey

      +
      public static final boolean isCorrelationKey(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isError

      +
      public static final boolean isError(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.Codes.html new file mode 100644 index 000000000..ccc9a56e0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.Codes.html @@ -0,0 +1,181 @@ + + + + +CodeSystems.BpmnUserTask.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.BpmnUserTask.Codes

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes
+
+
+
+
Enclosing class:
+
CodeSystems.BpmnUserTask
+
+
+
public static final class CodeSystems.BpmnUserTask.Codes +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.html new file mode 100644 index 000000000..794b3e70a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.BpmnUserTask.html @@ -0,0 +1,242 @@ + + + + +CodeSystems.BpmnUserTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.BpmnUserTask

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
+
+
+
Enclosing class:
+
CodeSystems
+
+
+
public static final class CodeSystems.BpmnUserTask +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCode

      +
      public static org.hl7.fhir.r4.model.Coding withCode(String code)
      +
      +
    • +
    • +
      +

      businessKey

      +
      public static final org.hl7.fhir.r4.model.Coding businessKey()
      +
      +
    • +
    • +
      +

      userTaskId

      +
      public static final org.hl7.fhir.r4.model.Coding userTaskId()
      +
      +
    • +
    • +
      +

      isBusinessKey

      +
      public static final boolean isBusinessKey(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isUserTaskId

      +
      public static final boolean isUserTaskId(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.Codes.html new file mode 100644 index 000000000..1633f554c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.Codes.html @@ -0,0 +1,300 @@ + + + + +CodeSystems.OrganizationRole.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.OrganizationRole.Codes

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
+
+
+
Enclosing class:
+
CodeSystems.OrganizationRole
+
+
+
public static final class CodeSystems.OrganizationRole.Codes +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.html new file mode 100644 index 000000000..cae3e96ca --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.OrganizationRole.html @@ -0,0 +1,368 @@ + + + + +CodeSystems.OrganizationRole (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.OrganizationRole

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
+
+
+
Enclosing class:
+
CodeSystems
+
+
+
public static final class CodeSystems.OrganizationRole +extends Object
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    Nested Classes
    +
    +
    Modifier and Type
    +
    Class
    +
    Description
    +
    static final class 
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    static final String
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    ams()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    cos()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    crr()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    dic()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    dms()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    dts()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    hrp()
    +
     
    +
    static final boolean
    +
    isAms(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isCos(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isCrr(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDic(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDms(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDts(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isHrp(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isTtp(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isUac(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    ttp()
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    +
    uac()
    +
     
    +
    static org.hl7.fhir.r4.model.Coding
    + +
     
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCode

      +
      public static org.hl7.fhir.r4.model.Coding withCode(String code)
      +
      +
    • +
    • +
      +

      uac

      +
      public static final org.hl7.fhir.r4.model.Coding uac()
      +
      +
    • +
    • +
      +

      cos

      +
      public static final org.hl7.fhir.r4.model.Coding cos()
      +
      +
    • +
    • +
      +

      crr

      +
      public static final org.hl7.fhir.r4.model.Coding crr()
      +
      +
    • +
    • +
      +

      dic

      +
      public static final org.hl7.fhir.r4.model.Coding dic()
      +
      +
    • +
    • +
      +

      dms

      +
      public static final org.hl7.fhir.r4.model.Coding dms()
      +
      +
    • +
    • +
      +

      dts

      +
      public static final org.hl7.fhir.r4.model.Coding dts()
      +
      +
    • +
    • +
      +

      hrp

      +
      public static final org.hl7.fhir.r4.model.Coding hrp()
      +
      +
    • +
    • +
      +

      ttp

      +
      public static final org.hl7.fhir.r4.model.Coding ttp()
      +
      +
    • +
    • +
      +

      ams

      +
      public static final org.hl7.fhir.r4.model.Coding ams()
      +
      +
    • +
    • +
      +

      isUac

      +
      public static final boolean isUac(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isCos

      +
      public static final boolean isCos(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isCrr

      +
      public static final boolean isCrr(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDic

      +
      public static final boolean isDic(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDms

      +
      public static final boolean isDms(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDts

      +
      public static final boolean isDts(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isHrp

      +
      public static final boolean isHrp(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isTtp

      +
      public static final boolean isTtp(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isAms

      +
      public static final boolean isAms(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.Codes.html new file mode 100644 index 000000000..78748f2a4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.Codes.html @@ -0,0 +1,317 @@ + + + + +CodeSystems.PractitionerRole.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.PractitionerRole.Codes

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
+
+
+
Enclosing class:
+
CodeSystems.PractitionerRole
+
+
+
public static final class CodeSystems.PractitionerRole.Codes +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.html new file mode 100644 index 000000000..b2053e0fe --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.PractitionerRole.html @@ -0,0 +1,386 @@ + + + + +CodeSystems.PractitionerRole (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.PractitionerRole

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
+
+
+
Enclosing class:
+
CodeSystems
+
+
+
public static final class CodeSystems.PractitionerRole +extends Object
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    Nested Classes
    +
    +
    Modifier and Type
    +
    Class
    +
    Description
    +
    static final class 
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    static final String
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final boolean
    +
    isAmsUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isCosUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isCrrUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDicUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDmsUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDsfAdmin(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isDtsUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isHrpUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isTtpUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final boolean
    +
    isUacUser(org.hl7.fhir.r4.model.Coding coding)
    +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static final org.hl7.fhir.r4.model.Coding
    + +
     
    +
    static org.hl7.fhir.r4.model.Coding
    + +
     
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCode

      +
      public static org.hl7.fhir.r4.model.Coding withCode(String code)
      +
      +
    • +
    • +
      +

      uacUser

      +
      public static final org.hl7.fhir.r4.model.Coding uacUser()
      +
      +
    • +
    • +
      +

      cosUser

      +
      public static final org.hl7.fhir.r4.model.Coding cosUser()
      +
      +
    • +
    • +
      +

      crrUser

      +
      public static final org.hl7.fhir.r4.model.Coding crrUser()
      +
      +
    • +
    • +
      +

      dicUser

      +
      public static final org.hl7.fhir.r4.model.Coding dicUser()
      +
      +
    • +
    • +
      +

      dmsUser

      +
      public static final org.hl7.fhir.r4.model.Coding dmsUser()
      +
      +
    • +
    • +
      +

      dtsUser

      +
      public static final org.hl7.fhir.r4.model.Coding dtsUser()
      +
      +
    • +
    • +
      +

      hrpUser

      +
      public static final org.hl7.fhir.r4.model.Coding hrpUser()
      +
      +
    • +
    • +
      +

      ttpUser

      +
      public static final org.hl7.fhir.r4.model.Coding ttpUser()
      +
      +
    • +
    • +
      +

      amsUser

      +
      public static final org.hl7.fhir.r4.model.Coding amsUser()
      +
      +
    • +
    • +
      +

      dsfAdmin

      +
      public static final org.hl7.fhir.r4.model.Coding dsfAdmin()
      +
      +
    • +
    • +
      +

      isUacUser

      +
      public static final boolean isUacUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isCosUser

      +
      public static final boolean isCosUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isCrrUser

      +
      public static final boolean isCrrUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDicUser

      +
      public static final boolean isDicUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDmsUser

      +
      public static final boolean isDmsUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDtsUser

      +
      public static final boolean isDtsUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isHrpUser

      +
      public static final boolean isHrpUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isTtpUser

      +
      public static final boolean isTtpUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isAmsUser

      +
      public static final boolean isAmsUser(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isDsfAdmin

      +
      public static final boolean isDsfAdmin(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.Codes.html new file mode 100644 index 000000000..6abf7af65 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.Codes.html @@ -0,0 +1,300 @@ + + + + +CodeSystems.ProcessAuthorization.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.ProcessAuthorization.Codes

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
+
+
+
Enclosing class:
+
CodeSystems.ProcessAuthorization
+
+
+
public static final class CodeSystems.ProcessAuthorization.Codes +extends Object
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.html new file mode 100644 index 000000000..70b27c105 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.ProcessAuthorization.html @@ -0,0 +1,368 @@ + + + + +CodeSystems.ProcessAuthorization (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems.ProcessAuthorization

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
+
+
+
Enclosing class:
+
CodeSystems
+
+
+
public static final class CodeSystems.ProcessAuthorization +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCode

      +
      public static org.hl7.fhir.r4.model.Coding withCode(String code)
      +
      +
    • +
    • +
      +

      localOrganization

      +
      public static final org.hl7.fhir.r4.model.Coding localOrganization()
      +
      +
    • +
    • +
      +

      localOrganizationPractitioner

      +
      public static final org.hl7.fhir.r4.model.Coding localOrganizationPractitioner()
      +
      +
    • +
    • +
      +

      remoteOrganization

      +
      public static final org.hl7.fhir.r4.model.Coding remoteOrganization()
      +
      +
    • +
    • +
      +

      localRole

      +
      public static final org.hl7.fhir.r4.model.Coding localRole()
      +
      +
    • +
    • +
      +

      localRolePractitioner

      +
      public static final org.hl7.fhir.r4.model.Coding localRolePractitioner()
      +
      +
    • +
    • +
      +

      remoteRole

      +
      public static final org.hl7.fhir.r4.model.Coding remoteRole()
      +
      +
    • +
    • +
      +

      localAll

      +
      public static final org.hl7.fhir.r4.model.Coding localAll()
      +
      +
    • +
    • +
      +

      localAllPractitioner

      +
      public static final org.hl7.fhir.r4.model.Coding localAllPractitioner()
      +
      +
    • +
    • +
      +

      remoteAll

      +
      public static final org.hl7.fhir.r4.model.Coding remoteAll()
      +
      +
    • +
    • +
      +

      isLocalOrganization

      +
      public static final boolean isLocalOrganization(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isLocalOrganizationPractitioner

      +
      public static final boolean isLocalOrganizationPractitioner(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isRemoteOrganization

      +
      public static final boolean isRemoteOrganization(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isLocalRole

      +
      public static final boolean isLocalRole(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isLocalRolePractitioner

      +
      public static final boolean isLocalRolePractitioner(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isRemoteRole

      +
      public static final boolean isRemoteRole(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isLocalAll

      +
      public static final boolean isLocalAll(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isLocalAllPractitioner

      +
      public static final boolean isLocalAllPractitioner(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    • +
      +

      isRemoteAll

      +
      public static final boolean isRemoteAll(org.hl7.fhir.r4.model.Coding coding)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.html new file mode 100644 index 000000000..750cfea30 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/CodeSystems.html @@ -0,0 +1,147 @@ + + + + +CodeSystems (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class CodeSystems

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.CodeSystems
+
+
+
+
public final class CodeSystems +extends Object
+
Constants defining standard DSF CodeSystems
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.EndpointIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.EndpointIdentifier.html new file mode 100644 index 000000000..da5fa33be --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.EndpointIdentifier.html @@ -0,0 +1,209 @@ + + + + +NamingSystems.EndpointIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class NamingSystems.EndpointIdentifier

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
+
+
+
Enclosing class:
+
NamingSystems
+
+
+
public static final class NamingSystems.EndpointIdentifier +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withValue

      +
      public static org.hl7.fhir.r4.model.Identifier withValue(String value)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(org.hl7.fhir.r4.model.Endpoint endpoint)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(Optional<org.hl7.fhir.r4.model.Endpoint> endpoint)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.OrganizationIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.OrganizationIdentifier.html new file mode 100644 index 000000000..71efacd5d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.OrganizationIdentifier.html @@ -0,0 +1,209 @@ + + + + +NamingSystems.OrganizationIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class NamingSystems.OrganizationIdentifier

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
+
+
+
Enclosing class:
+
NamingSystems
+
+
+
public static final class NamingSystems.OrganizationIdentifier +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withValue

      +
      public static org.hl7.fhir.r4.model.Identifier withValue(String value)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(org.hl7.fhir.r4.model.Organization organization)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(Optional<org.hl7.fhir.r4.model.Organization> organization)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.PractitionerIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.PractitionerIdentifier.html new file mode 100644 index 000000000..db0257e28 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.PractitionerIdentifier.html @@ -0,0 +1,209 @@ + + + + +NamingSystems.PractitionerIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class NamingSystems.PractitionerIdentifier

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
+
+
+
Enclosing class:
+
NamingSystems
+
+
+
public static final class NamingSystems.PractitionerIdentifier +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withValue

      +
      public static org.hl7.fhir.r4.model.Identifier withValue(String value)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(org.hl7.fhir.r4.model.Practitioner practitioner)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(Optional<org.hl7.fhir.r4.model.Practitioner> practitioner)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.TaskIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.TaskIdentifier.html new file mode 100644 index 000000000..0f8e892b9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.TaskIdentifier.html @@ -0,0 +1,209 @@ + + + + +NamingSystems.TaskIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class NamingSystems.TaskIdentifier

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
+
+
+
Enclosing class:
+
NamingSystems
+
+
+
public static final class NamingSystems.TaskIdentifier +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withValue

      +
      public static org.hl7.fhir.r4.model.Identifier withValue(String value)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(org.hl7.fhir.r4.model.Task task)
      +
      +
    • +
    • +
      +

      findFirst

      +
      public static Optional<org.hl7.fhir.r4.model.Identifier> findFirst(Optional<org.hl7.fhir.r4.model.Task> task)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.html new file mode 100644 index 000000000..71de3eb30 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/NamingSystems.html @@ -0,0 +1,144 @@ + + + + +NamingSystems (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class NamingSystems

+
+
java.lang.Object +
dev.dsf.bpe.v2.constants.NamingSystems
+
+
+
+
public final class NamingSystems +extends Object
+
Constants defining standard DSF NamingSystems
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/BpmnExecutionVariables.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/BpmnExecutionVariables.html new file mode 100644 index 000000000..82dede411 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/BpmnExecutionVariables.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.BpmnExecutionVariables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.BpmnExecutionVariables

+
+No usage of dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.Codes.html new file mode 100644 index 000000000..9b2dd380d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.Codes.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.html new file mode 100644 index 000000000..ffb8a4924 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnMessage.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.Codes.html new file mode 100644 index 000000000..e9abea6ab --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.Codes.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.html new file mode 100644 index 000000000..1ca3dc788 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.BpmnUserTask.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.Codes.html new file mode 100644 index 000000000..f50fb5b91 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.Codes.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.html new file mode 100644 index 000000000..3c841812e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.OrganizationRole.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.Codes.html new file mode 100644 index 000000000..48b5f6af1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.Codes.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.html new file mode 100644 index 000000000..567c04ef7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.PractitionerRole.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.Codes.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.Codes.html new file mode 100644 index 000000000..064869985 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.Codes.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.html new file mode 100644 index 000000000..0247e6c41 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.ProcessAuthorization.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.html new file mode 100644 index 000000000..3ee20a414 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/CodeSystems.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.CodeSystems (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.CodeSystems

+
+No usage of dev.dsf.bpe.v2.constants.CodeSystems
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.EndpointIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.EndpointIdentifier.html new file mode 100644 index 000000000..66f20e1d0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.EndpointIdentifier.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier

+
+No usage of dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.OrganizationIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.OrganizationIdentifier.html new file mode 100644 index 000000000..0db9a5ea2 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.OrganizationIdentifier.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier

+
+No usage of dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.PractitionerIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.PractitionerIdentifier.html new file mode 100644 index 000000000..3047612ee --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.PractitionerIdentifier.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier

+
+No usage of dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.TaskIdentifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.TaskIdentifier.html new file mode 100644 index 000000000..65fad84ee --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.TaskIdentifier.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier

+
+No usage of dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.html new file mode 100644 index 000000000..e92567437 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/class-use/NamingSystems.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.constants.NamingSystems (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.constants.NamingSystems

+
+No usage of dev.dsf.bpe.v2.constants.NamingSystems
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-summary.html new file mode 100644 index 000000000..d33679730 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-summary.html @@ -0,0 +1,145 @@ + + + + +dev.dsf.bpe.v2.constants (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.constants

+
+
+
package dev.dsf.bpe.v2.constants
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-tree.html new file mode 100644 index 000000000..efb3b3cdf --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-tree.html @@ -0,0 +1,92 @@ + + + + +dev.dsf.bpe.v2.constants Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.constants

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-use.html new file mode 100644 index 000000000..d0f11b708 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/constants/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package dev.dsf.bpe.v2.constants (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.constants

+
+No usage of dev.dsf.bpe.v2.constants
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/ProcessDocumentation.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/ProcessDocumentation.html new file mode 100644 index 000000000..690aaf1c3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/ProcessDocumentation.html @@ -0,0 +1,242 @@ + + + + +ProcessDocumentation (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface ProcessDocumentation

+
+
+
+
@Retention(RUNTIME) +@Target(FIELD) +public @interface ProcessDocumentation
+
Annotation for documenting DSF process plugin properties. Add this annotation in addition to Value to fields + of your spring Configuration class in order to take advantage of the "dsf-tools-documentation-generator" + maven plugin to generate a markdown file. +

+ Example: + +

+ @ProcessDocumentation(description = "Set to `true` to enable a special function", processNames = "testorg_process")
+ @Value("${org.test.process.special:false}")
+ private boolean specialFunction;
+ 
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Element Details

    +
      +
    • +
      +

      required

      +
      boolean required
      +
      +
      Returns:
      +
      true if this property is required for processes listed in + processNames()
      +
      +
      +
      Default:
      +
      false
      +
      +
      +
    • +
    • +
      +

      processNames

      +
      String[] processNames
      +
      +
      Returns:
      +
      an empty array if all processes use this property or an array of length >= 1 containing only + specific processes that use this property, but not all
      +
      +
      +
      Default:
      +
      {}
      +
      +
      +
    • +
    • +
      +

      description

      +
      String description
      +
      +
      Returns:
      +
      description helping to configure this property
      +
      +
      +
    • +
    • +
      +

      example

      +
      String example
      +
      +
      Returns:
      +
      example value helping to configure this property
      +
      +
      +
      Default:
      +
      ""
      +
      +
      +
    • +
    • +
      +

      recommendation

      +
      String recommendation
      +
      +
      Returns:
      +
      recommendation helping to configure this property
      +
      +
      +
      Default:
      +
      ""
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/class-use/ProcessDocumentation.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/class-use/ProcessDocumentation.html new file mode 100644 index 000000000..36a87e42c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/class-use/ProcessDocumentation.html @@ -0,0 +1,62 @@ + + + + +Uses of Annotation Interface dev.dsf.bpe.v2.documentation.ProcessDocumentation (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
dev.dsf.bpe.v2.documentation.ProcessDocumentation

+
+No usage of dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-summary.html new file mode 100644 index 000000000..a35a83350 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-summary.html @@ -0,0 +1,109 @@ + + + + +dev.dsf.bpe.v2.documentation (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.documentation

+
+
+
package dev.dsf.bpe.v2.documentation
+
+
    +
  • + +
  • +
  • +
    +
    Annotation Interfaces
    +
    +
    Class
    +
    Description
    + +
    +
    Annotation for documenting DSF process plugin properties.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-tree.html new file mode 100644 index 000000000..d2ee1b74e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-tree.html @@ -0,0 +1,72 @@ + + + + +dev.dsf.bpe.v2.documentation Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.documentation

+
+Package Hierarchies: + +
+

Annotation Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-use.html new file mode 100644 index 000000000..9b4a4c6a5 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/documentation/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package dev.dsf.bpe.v2.documentation (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.documentation

+
+No usage of dev.dsf.bpe.v2.documentation
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEvent.html new file mode 100644 index 000000000..b8c531838 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEvent.html @@ -0,0 +1,222 @@ + + + + +ErrorBoundaryEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class ErrorBoundaryEvent

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
dev.dsf.bpe.v2.error.ErrorBoundaryEvent
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class ErrorBoundaryEvent +extends RuntimeException
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ErrorBoundaryEvent

      +
      public ErrorBoundaryEvent(String errorCode, + String errorMessage)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getErrorCode

      +
      public String getErrorCode()
      +
      +
    • +
    • +
      +

      getErrorMessage

      +
      public String getErrorMessage()
      +
      +
    • +
    • +
      +

      getMessage

      +
      public String getMessage()
      +
      +
      Overrides:
      +
      getMessage in class Throwable
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEventErrorHandler.html new file mode 100644 index 000000000..44dc17790 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorBoundaryEventErrorHandler.html @@ -0,0 +1,168 @@ + + + + +ErrorBoundaryEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ErrorBoundaryEventErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler
+
+
+
All Known Subinterfaces:
+
MessageSendTaskErrorHandler, ServiceTaskErrorHandler
+
+
+
All Known Implementing Classes:
+
AbstractErrorHandler, AbstractMessageActivityErrorHandler, DefaultExecutionListenerErrorHandler, DefaultMessageEndEventErrorHandler, DefaultMessageIntermediateThrowEventErrorHandler, DefaultMessageSendTaskErrorHandler, DefaultServiceTaskErrorHandler, DefaultUserTaskListenerErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface ErrorBoundaryEventErrorHandler +extends ErrorHandler
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorHandler.html new file mode 100644 index 000000000..0334be58c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ErrorHandler.html @@ -0,0 +1,110 @@ + + + + +ErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ + +
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExceptionErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExceptionErrorHandler.html new file mode 100644 index 000000000..b120ab340 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExceptionErrorHandler.html @@ -0,0 +1,168 @@ + + + + +ExceptionErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ExceptionErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler
+
+
+
All Known Subinterfaces:
+
ExecutionListenerErrorHandler, ServiceTaskErrorHandler, UserTaskListenerErrorHandler
+
+
+
All Known Implementing Classes:
+
AbstractErrorHandler, AbstractMessageActivityErrorHandler, DefaultExecutionListenerErrorHandler, DefaultMessageEndEventErrorHandler, DefaultMessageIntermediateThrowEventErrorHandler, DefaultMessageSendTaskErrorHandler, DefaultServiceTaskErrorHandler, DefaultUserTaskListenerErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface ExceptionErrorHandler +extends ErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      handleException

      +
      Exception handleException(ProcessPluginApi api, + Variables variables, + Exception exception)
      +
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      exception - not null
      +
      Returns:
      +
      null to prevent the process from being stopped
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExecutionListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExecutionListenerErrorHandler.html new file mode 100644 index 000000000..a4988279f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ExecutionListenerErrorHandler.html @@ -0,0 +1,124 @@ + + + + +ExecutionListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ExecutionListenerErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler, ExceptionErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultExecutionListenerErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface ExecutionListenerErrorHandler +extends ErrorHandler, ExceptionErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageActivityErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageActivityErrorHandler.html new file mode 100644 index 000000000..decacda79 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageActivityErrorHandler.html @@ -0,0 +1,171 @@ + + + + +MessageActivityErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageActivityErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler
+
+
+
All Known Subinterfaces:
+
MessageEndEventErrorHandler, MessageIntermediateThrowEventErrorHandler, MessageSendTaskErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultMessageEndEventErrorHandler, DefaultMessageIntermediateThrowEventErrorHandler, DefaultMessageSendTaskErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface MessageActivityErrorHandler +extends ErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      handleException

      +
      Exception handleException(ProcessPluginApi api, + Variables variables, + SendTaskValues sendTaskValues, + Exception exception)
      +
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      sendTaskValues - not null
      +
      exception - not null
      +
      Returns:
      +
      null to prevent the process from being stopped
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageEndEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageEndEventErrorHandler.html new file mode 100644 index 000000000..e418195ab --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageEndEventErrorHandler.html @@ -0,0 +1,124 @@ + + + + +MessageEndEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageEndEventErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler, MessageActivityErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultMessageEndEventErrorHandler
+
+
+
public interface MessageEndEventErrorHandler +extends ErrorHandler, MessageActivityErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageIntermediateThrowEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageIntermediateThrowEventErrorHandler.html new file mode 100644 index 000000000..1ac3517fd --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageIntermediateThrowEventErrorHandler.html @@ -0,0 +1,124 @@ + + + + +MessageIntermediateThrowEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageIntermediateThrowEventErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler, MessageActivityErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultMessageIntermediateThrowEventErrorHandler
+
+
+
public interface MessageIntermediateThrowEventErrorHandler +extends ErrorHandler, MessageActivityErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageSendTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageSendTaskErrorHandler.html new file mode 100644 index 000000000..b0f5e7c47 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/MessageSendTaskErrorHandler.html @@ -0,0 +1,127 @@ + + + + +MessageSendTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MessageSendTaskErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, MessageActivityErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultMessageSendTaskErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface MessageSendTaskErrorHandler +extends ErrorHandler, MessageActivityErrorHandler, ErrorBoundaryEventErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ServiceTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ServiceTaskErrorHandler.html new file mode 100644 index 000000000..bfc8fe0b8 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/ServiceTaskErrorHandler.html @@ -0,0 +1,127 @@ + + + + +ServiceTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ServiceTaskErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultServiceTaskErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface ServiceTaskErrorHandler +extends ErrorHandler, ErrorBoundaryEventErrorHandler, ExceptionErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/UserTaskListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/UserTaskListenerErrorHandler.html new file mode 100644 index 000000000..677f6ab31 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/UserTaskListenerErrorHandler.html @@ -0,0 +1,124 @@ + + + + +UserTaskListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UserTaskListenerErrorHandler

+
+
+
+
All Superinterfaces:
+
ErrorHandler, ExceptionErrorHandler
+
+
+
All Known Implementing Classes:
+
DefaultUserTaskListenerErrorHandler, ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
public interface UserTaskListenerErrorHandler +extends ErrorHandler, ExceptionErrorHandler
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEvent.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEvent.html new file mode 100644 index 000000000..207da972a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEvent.html @@ -0,0 +1,160 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.ErrorBoundaryEvent (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.ErrorBoundaryEvent

+
+
Packages that use ErrorBoundaryEvent
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEventErrorHandler.html new file mode 100644 index 000000000..e6c778257 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorBoundaryEventErrorHandler.html @@ -0,0 +1,130 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.ErrorBoundaryEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.ErrorBoundaryEventErrorHandler

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorHandler.html new file mode 100644 index 000000000..94e8699fe --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ErrorHandler.html @@ -0,0 +1,167 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.ErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.ErrorHandler

+
+
Packages that use ErrorHandler
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExceptionErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExceptionErrorHandler.html new file mode 100644 index 000000000..904b8c3c7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExceptionErrorHandler.html @@ -0,0 +1,133 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.ExceptionErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.ExceptionErrorHandler

+
+
Packages that use ExceptionErrorHandler
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExecutionListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExecutionListenerErrorHandler.html new file mode 100644 index 000000000..b8dcc77b6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ExecutionListenerErrorHandler.html @@ -0,0 +1,106 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.ExecutionListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.ExecutionListenerErrorHandler

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageActivityErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageActivityErrorHandler.html new file mode 100644 index 000000000..e1a324b62 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageActivityErrorHandler.html @@ -0,0 +1,118 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.MessageActivityErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.MessageActivityErrorHandler

+
+
Packages that use MessageActivityErrorHandler
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageEndEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageEndEventErrorHandler.html new file mode 100644 index 000000000..8a1082941 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageEndEventErrorHandler.html @@ -0,0 +1,103 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.MessageEndEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.MessageEndEventErrorHandler

+
+
Packages that use MessageEndEventErrorHandler
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageIntermediateThrowEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageIntermediateThrowEventErrorHandler.html new file mode 100644 index 000000000..b4af51691 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageIntermediateThrowEventErrorHandler.html @@ -0,0 +1,103 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.MessageIntermediateThrowEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.MessageIntermediateThrowEventErrorHandler

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageSendTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageSendTaskErrorHandler.html new file mode 100644 index 000000000..b8bcca721 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/MessageSendTaskErrorHandler.html @@ -0,0 +1,106 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.MessageSendTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.MessageSendTaskErrorHandler

+
+
Packages that use MessageSendTaskErrorHandler
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ServiceTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ServiceTaskErrorHandler.html new file mode 100644 index 000000000..2741cef0a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/ServiceTaskErrorHandler.html @@ -0,0 +1,106 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.ServiceTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.ServiceTaskErrorHandler

+
+
Packages that use ServiceTaskErrorHandler
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/UserTaskListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/UserTaskListenerErrorHandler.html new file mode 100644 index 000000000..73124cf83 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/class-use/UserTaskListenerErrorHandler.html @@ -0,0 +1,106 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.error.UserTaskListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.error.UserTaskListenerErrorHandler

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractErrorHandler.html new file mode 100644 index 000000000..f09f772e7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractErrorHandler.html @@ -0,0 +1,302 @@ + + + + +AbstractErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class AbstractErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler
+
+
+
Direct Known Subclasses:
+
AbstractMessageActivityErrorHandler, DefaultExecutionListenerErrorHandler, DefaultServiceTaskErrorHandler, DefaultUserTaskListenerErrorHandler
+
+
+
public abstract class AbstractErrorHandler +extends Object +implements ErrorBoundaryEventErrorHandler, ExceptionErrorHandler
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractMessageActivityErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractMessageActivityErrorHandler.html new file mode 100644 index 000000000..633e203a7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/AbstractMessageActivityErrorHandler.html @@ -0,0 +1,207 @@ + + + + +AbstractMessageActivityErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class AbstractMessageActivityErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler +
dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler
+
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler
+
+
+
Direct Known Subclasses:
+
DefaultMessageEndEventErrorHandler, DefaultMessageIntermediateThrowEventErrorHandler, DefaultMessageSendTaskErrorHandler
+
+
+
public class AbstractMessageActivityErrorHandler +extends AbstractErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AbstractMessageActivityErrorHandler

      +
      public AbstractMessageActivityErrorHandler()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultExecutionListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultExecutionListenerErrorHandler.html new file mode 100644 index 000000000..a53a0f438 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultExecutionListenerErrorHandler.html @@ -0,0 +1,163 @@ + + + + +DefaultExecutionListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultExecutionListenerErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler +
dev.dsf.bpe.v2.error.impl.DefaultExecutionListenerErrorHandler
+
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, ExecutionListenerErrorHandler
+
+
+
public class DefaultExecutionListenerErrorHandler +extends AbstractErrorHandler +implements ExecutionListenerErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultExecutionListenerErrorHandler

      +
      public DefaultExecutionListenerErrorHandler()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageEndEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageEndEventErrorHandler.html new file mode 100644 index 000000000..3338742f0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageEndEventErrorHandler.html @@ -0,0 +1,218 @@ + + + + +DefaultMessageEndEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultMessageEndEventErrorHandler

+
+ +
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, MessageActivityErrorHandler, MessageEndEventErrorHandler
+
+
+
public class DefaultMessageEndEventErrorHandler +extends AbstractMessageActivityErrorHandler +implements MessageEndEventErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultMessageEndEventErrorHandler

      +
      public DefaultMessageEndEventErrorHandler()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      handleException

      +
      public Exception handleException(ProcessPluginApi api, + Variables variables, + SendTaskValues sendTaskValues, + Exception exception)
      +
      Logs the given Exception, updates all received Task resource with Task.TaskStatus.INPROGRESS + to Task.TaskStatus.FAILED and adds a Task.TaskOutputComponent of type CodeSystems.BpmnMessage.error(). +

      + Exceptions thrown while updating the Task resources to status failed are logged. +

      + Returns null resulting in a continuing process instance.

      +
      +
      Specified by:
      +
      handleException in interface MessageActivityErrorHandler
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      sendTaskValues - not null
      +
      exception - not null
      +
      Returns:
      +
      null to prevent the process from being stopped
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageIntermediateThrowEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageIntermediateThrowEventErrorHandler.html new file mode 100644 index 000000000..8a5875f4d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageIntermediateThrowEventErrorHandler.html @@ -0,0 +1,218 @@ + + + + +DefaultMessageIntermediateThrowEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultMessageIntermediateThrowEventErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler +
dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler +
dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler
+
+
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, MessageActivityErrorHandler, MessageIntermediateThrowEventErrorHandler
+
+
+
public class DefaultMessageIntermediateThrowEventErrorHandler +extends AbstractMessageActivityErrorHandler +implements MessageIntermediateThrowEventErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultMessageIntermediateThrowEventErrorHandler

      +
      public DefaultMessageIntermediateThrowEventErrorHandler()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      handleException

      +
      public Exception handleException(ProcessPluginApi api, + Variables variables, + SendTaskValues sendTaskValues, + Exception exception)
      +
      Logs the given Exception, updates all received Task resource with Task.TaskStatus.INPROGRESS + to Task.TaskStatus.FAILED and adds a Task.TaskOutputComponent of type CodeSystems.BpmnMessage.error(). +

      + Exceptions thrown while updating the Task resources to status failed are logged. +

      + Returns the given Exception resulting in a deleted i.e. stopped process instance.

      +
      +
      Specified by:
      +
      handleException in interface MessageActivityErrorHandler
      +
      Parameters:
      +
      api - not null
      +
      variables - not null
      +
      sendTaskValues - not null
      +
      exception - not null
      +
      Returns:
      +
      null to prevent the process from being stopped
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageSendTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageSendTaskErrorHandler.html new file mode 100644 index 000000000..ab552fae3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultMessageSendTaskErrorHandler.html @@ -0,0 +1,258 @@ + + + + +DefaultMessageSendTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultMessageSendTaskErrorHandler

+
+ +
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, MessageActivityErrorHandler, MessageSendTaskErrorHandler
+
+
+
public class DefaultMessageSendTaskErrorHandler +extends AbstractMessageActivityErrorHandler +implements MessageSendTaskErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultMessageSendTaskErrorHandler

      +
      public DefaultMessageSendTaskErrorHandler()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultServiceTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultServiceTaskErrorHandler.html new file mode 100644 index 000000000..3c548ec4e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultServiceTaskErrorHandler.html @@ -0,0 +1,166 @@ + + + + +DefaultServiceTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultServiceTaskErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler +
dev.dsf.bpe.v2.error.impl.DefaultServiceTaskErrorHandler
+
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, ServiceTaskErrorHandler
+
+
+
public class DefaultServiceTaskErrorHandler +extends AbstractErrorHandler +implements ServiceTaskErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultServiceTaskErrorHandler

      +
      public DefaultServiceTaskErrorHandler()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultUserTaskListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultUserTaskListenerErrorHandler.html new file mode 100644 index 000000000..297b2f6ac --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/DefaultUserTaskListenerErrorHandler.html @@ -0,0 +1,163 @@ + + + + +DefaultUserTaskListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DefaultUserTaskListenerErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler +
dev.dsf.bpe.v2.error.impl.DefaultUserTaskListenerErrorHandler
+
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, UserTaskListenerErrorHandler
+
+
+
public class DefaultUserTaskListenerErrorHandler +extends AbstractErrorHandler +implements UserTaskListenerErrorHandler
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DefaultUserTaskListenerErrorHandler

      +
      public DefaultUserTaskListenerErrorHandler()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/ExceptionToErrorBoundaryEventTranslationErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/ExceptionToErrorBoundaryEventTranslationErrorHandler.html new file mode 100644 index 000000000..3381d7035 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/ExceptionToErrorBoundaryEventTranslationErrorHandler.html @@ -0,0 +1,284 @@ + + + + +ExceptionToErrorBoundaryEventTranslationErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class ExceptionToErrorBoundaryEventTranslationErrorHandler

+
+
java.lang.Object +
dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+
+
All Implemented Interfaces:
+
ErrorBoundaryEventErrorHandler, ErrorHandler, ExceptionErrorHandler, ExecutionListenerErrorHandler, MessageActivityErrorHandler, MessageSendTaskErrorHandler, ServiceTaskErrorHandler, UserTaskListenerErrorHandler
+
+
+
public class ExceptionToErrorBoundaryEventTranslationErrorHandler +extends Object +implements ServiceTaskErrorHandler, MessageSendTaskErrorHandler, ExecutionListenerErrorHandler, UserTaskListenerErrorHandler
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractErrorHandler.html new file mode 100644 index 000000000..14cd337b9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractErrorHandler.html @@ -0,0 +1,105 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.AbstractErrorHandler

+
+
Packages that use AbstractErrorHandler
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractMessageActivityErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractMessageActivityErrorHandler.html new file mode 100644 index 000000000..90ea23232 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/AbstractMessageActivityErrorHandler.html @@ -0,0 +1,93 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultExecutionListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultExecutionListenerErrorHandler.html new file mode 100644 index 000000000..a1f6d6ecb --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultExecutionListenerErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultExecutionListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultExecutionListenerErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultExecutionListenerErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageEndEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageEndEventErrorHandler.html new file mode 100644 index 000000000..42fa2e683 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageEndEventErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultMessageEndEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultMessageEndEventErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultMessageEndEventErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageIntermediateThrowEventErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageIntermediateThrowEventErrorHandler.html new file mode 100644 index 000000000..a64d63d00 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageIntermediateThrowEventErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageSendTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageSendTaskErrorHandler.html new file mode 100644 index 000000000..a9510519e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultMessageSendTaskErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultServiceTaskErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultServiceTaskErrorHandler.html new file mode 100644 index 000000000..87aca2270 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultServiceTaskErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultServiceTaskErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultServiceTaskErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultServiceTaskErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultUserTaskListenerErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultUserTaskListenerErrorHandler.html new file mode 100644 index 000000000..41c9e8e6d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/DefaultUserTaskListenerErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.DefaultUserTaskListenerErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.DefaultUserTaskListenerErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.DefaultUserTaskListenerErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/ExceptionToErrorBoundaryEventTranslationErrorHandler.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/ExceptionToErrorBoundaryEventTranslationErrorHandler.html new file mode 100644 index 000000000..2f510036b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/class-use/ExceptionToErrorBoundaryEventTranslationErrorHandler.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler

+
+No usage of dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-summary.html new file mode 100644 index 000000000..f83ff41c4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-summary.html @@ -0,0 +1,123 @@ + + + + +dev.dsf.bpe.v2.error.impl (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.error.impl

+
+
+
package dev.dsf.bpe.v2.error.impl
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-tree.html new file mode 100644 index 000000000..d3c6841b4 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-tree.html @@ -0,0 +1,90 @@ + + + + +dev.dsf.bpe.v2.error.impl Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.error.impl

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-use.html new file mode 100644 index 000000000..5102bab86 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/impl/package-use.html @@ -0,0 +1,86 @@ + + + + +Uses of Package dev.dsf.bpe.v2.error.impl (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.error.impl

+
+
Packages that use dev.dsf.bpe.v2.error.impl
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-summary.html new file mode 100644 index 000000000..822ea0aee --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-summary.html @@ -0,0 +1,131 @@ + + + + +dev.dsf.bpe.v2.error (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.error

+
+
+
package dev.dsf.bpe.v2.error
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-tree.html new file mode 100644 index 000000000..7e1485306 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-tree.html @@ -0,0 +1,123 @@ + + + + +dev.dsf.bpe.v2.error Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.error

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-use.html new file mode 100644 index 000000000..7c3c1f42c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/error/package-use.html @@ -0,0 +1,152 @@ + + + + +Uses of Package dev.dsf.bpe.v2.error (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + + + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/AbstractFhirResourceModifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/AbstractFhirResourceModifier.html new file mode 100644 index 000000000..22b6174d9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/AbstractFhirResourceModifier.html @@ -0,0 +1,308 @@ + + + + +AbstractFhirResourceModifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class AbstractFhirResourceModifier

+
+
java.lang.Object +
dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
+
+
+
All Implemented Interfaces:
+
FhirResourceModifier
+
+
+
public abstract class AbstractFhirResourceModifier +extends Object +implements FhirResourceModifier
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AbstractFhirResourceModifier

      +
      public AbstractFhirResourceModifier()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      modifyActivityDefinition

      +
      public org.hl7.fhir.r4.model.ActivityDefinition modifyActivityDefinition(String filename, + org.hl7.fhir.r4.model.ActivityDefinition resource)
      +
      +
      Specified by:
      +
      modifyActivityDefinition in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyCodeSystem

      +
      public org.hl7.fhir.r4.model.CodeSystem modifyCodeSystem(String filename, + org.hl7.fhir.r4.model.CodeSystem resource)
      +
      +
      Specified by:
      +
      modifyCodeSystem in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyLibrary

      +
      public org.hl7.fhir.r4.model.Library modifyLibrary(String filename, + org.hl7.fhir.r4.model.Library resource)
      +
      +
      Specified by:
      +
      modifyLibrary in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyMeasure

      +
      public org.hl7.fhir.r4.model.Measure modifyMeasure(String filename, + org.hl7.fhir.r4.model.Measure resource)
      +
      +
      Specified by:
      +
      modifyMeasure in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyNamingSystem

      +
      public org.hl7.fhir.r4.model.NamingSystem modifyNamingSystem(String filename, + org.hl7.fhir.r4.model.NamingSystem resource)
      +
      +
      Specified by:
      +
      modifyNamingSystem in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyQuestionnaire

      +
      public org.hl7.fhir.r4.model.Questionnaire modifyQuestionnaire(String filename, + org.hl7.fhir.r4.model.Questionnaire resource)
      +
      +
      Specified by:
      +
      modifyQuestionnaire in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyStructureDefinition

      +
      public org.hl7.fhir.r4.model.StructureDefinition modifyStructureDefinition(String filename, + org.hl7.fhir.r4.model.StructureDefinition resource)
      +
      +
      Specified by:
      +
      modifyStructureDefinition in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyTask

      +
      public org.hl7.fhir.r4.model.Task modifyTask(String filename, + org.hl7.fhir.r4.model.Task resource)
      +
      +
      Specified by:
      +
      modifyTask in interface FhirResourceModifier
      +
      +
      +
    • +
    • +
      +

      modifyValueSet

      +
      public org.hl7.fhir.r4.model.ValueSet modifyValueSet(String filename, + org.hl7.fhir.r4.model.ValueSet resource)
      +
      +
      Specified by:
      +
      modifyValueSet in interface FhirResourceModifier
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/FhirResourceModifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/FhirResourceModifier.html new file mode 100644 index 000000000..60c28b5e1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/FhirResourceModifier.html @@ -0,0 +1,246 @@ + + + + +FhirResourceModifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FhirResourceModifier

+
+
+
+
All Known Implementing Classes:
+
AbstractFhirResourceModifier
+
+
+
public interface FhirResourceModifier
+
When implementations of this interface are registered as singleton Bean, modify methods are called during + process plugin loading and before the plugin FHIR resource are stored in the DSF FHIR server. +

+ Warning: Modifications that are non static i.e. depend on values that can change from one start of the BPE to the + next like environment variables and allow-list entries, require a stop BPE, remove plugin, start BPE, stop BPE, add + plugin and start BPE cycle. Since not many modifications to the FHIR resources of a process plugin keep the plugin + compatible across DSF instances, use this feature with care. +

+ See AbstractFhirResourceModifier for a no-modifications base implementation.

+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.ActivityDefinition
    +
    modifyActivityDefinition(String filename, + org.hl7.fhir.r4.model.ActivityDefinition resource)
    +
     
    +
    org.hl7.fhir.r4.model.CodeSystem
    +
    modifyCodeSystem(String filename, + org.hl7.fhir.r4.model.CodeSystem resource)
    +
     
    +
    org.hl7.fhir.r4.model.Library
    +
    modifyLibrary(String filename, + org.hl7.fhir.r4.model.Library resource)
    +
     
    +
    org.hl7.fhir.r4.model.Measure
    +
    modifyMeasure(String filename, + org.hl7.fhir.r4.model.Measure resource)
    +
     
    +
    org.hl7.fhir.r4.model.NamingSystem
    +
    modifyNamingSystem(String filename, + org.hl7.fhir.r4.model.NamingSystem resource)
    +
     
    +
    org.hl7.fhir.r4.model.Questionnaire
    +
    modifyQuestionnaire(String filename, + org.hl7.fhir.r4.model.Questionnaire resource)
    +
     
    +
    org.hl7.fhir.r4.model.StructureDefinition
    +
    modifyStructureDefinition(String filename, + org.hl7.fhir.r4.model.StructureDefinition resource)
    +
     
    +
    org.hl7.fhir.r4.model.Task
    +
    modifyTask(String filename, + org.hl7.fhir.r4.model.Task resource)
    +
     
    +
    org.hl7.fhir.r4.model.ValueSet
    +
    modifyValueSet(String filename, + org.hl7.fhir.r4.model.ValueSet resource)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      modifyActivityDefinition

      +
      org.hl7.fhir.r4.model.ActivityDefinition modifyActivityDefinition(String filename, + org.hl7.fhir.r4.model.ActivityDefinition resource)
      +
      +
    • +
    • +
      +

      modifyCodeSystem

      +
      org.hl7.fhir.r4.model.CodeSystem modifyCodeSystem(String filename, + org.hl7.fhir.r4.model.CodeSystem resource)
      +
      +
    • +
    • +
      +

      modifyLibrary

      +
      org.hl7.fhir.r4.model.Library modifyLibrary(String filename, + org.hl7.fhir.r4.model.Library resource)
      +
      +
    • +
    • +
      +

      modifyMeasure

      +
      org.hl7.fhir.r4.model.Measure modifyMeasure(String filename, + org.hl7.fhir.r4.model.Measure resource)
      +
      +
    • +
    • +
      +

      modifyNamingSystem

      +
      org.hl7.fhir.r4.model.NamingSystem modifyNamingSystem(String filename, + org.hl7.fhir.r4.model.NamingSystem resource)
      +
      +
    • +
    • +
      +

      modifyQuestionnaire

      +
      org.hl7.fhir.r4.model.Questionnaire modifyQuestionnaire(String filename, + org.hl7.fhir.r4.model.Questionnaire resource)
      +
      +
    • +
    • +
      +

      modifyStructureDefinition

      +
      org.hl7.fhir.r4.model.StructureDefinition modifyStructureDefinition(String filename, + org.hl7.fhir.r4.model.StructureDefinition resource)
      +
      +
    • +
    • +
      +

      modifyTask

      +
      org.hl7.fhir.r4.model.Task modifyTask(String filename, + org.hl7.fhir.r4.model.Task resource)
      +
      +
    • +
    • +
      +

      modifyValueSet

      +
      org.hl7.fhir.r4.model.ValueSet modifyValueSet(String filename, + org.hl7.fhir.r4.model.ValueSet resource)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/AbstractFhirResourceModifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/AbstractFhirResourceModifier.html new file mode 100644 index 000000000..e27cc388c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/AbstractFhirResourceModifier.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier

+
+No usage of dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/FhirResourceModifier.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/FhirResourceModifier.html new file mode 100644 index 000000000..f2306d118 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/class-use/FhirResourceModifier.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.fhir.FhirResourceModifier (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.fhir.FhirResourceModifier

+
+
Packages that use FhirResourceModifier
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-summary.html new file mode 100644 index 000000000..cf1327a8b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-summary.html @@ -0,0 +1,114 @@ + + + + +dev.dsf.bpe.v2.fhir (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.fhir

+
+
+
package dev.dsf.bpe.v2.fhir
+
+
    +
  • + +
  • +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
     
    + +
    +
    When implementations of this interface are registered as singleton Bean, modify methods are called during + process plugin loading and before the plugin FHIR resource are stored in the DSF FHIR server.
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-tree.html new file mode 100644 index 000000000..aaba75dd5 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-tree.html @@ -0,0 +1,82 @@ + + + + +dev.dsf.bpe.v2.fhir Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.fhir

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-use.html new file mode 100644 index 000000000..0dae194c6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/fhir/package-use.html @@ -0,0 +1,87 @@ + + + + +Uses of Package dev.dsf.bpe.v2.fhir (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.fhir

+
+
Packages that use dev.dsf.bpe.v2.fhir
+
+
Package
+
Description
+ +
 
+
+
+
    +
  • +
    + +
    +
    Class
    +
    Description
    + +
    +
    When implementations of this interface are registered as singleton Bean, modify methods are called during + process plugin loading and before the plugin FHIR resource are stored in the DSF FHIR server.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-summary.html new file mode 100644 index 000000000..d778d6bef --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-summary.html @@ -0,0 +1,134 @@ + + + + +dev.dsf.bpe.v2 (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2

+
+
+
package dev.dsf.bpe.v2
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-tree.html new file mode 100644 index 000000000..deaa454d9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-tree.html @@ -0,0 +1,74 @@ + + + + +dev.dsf.bpe.v2 Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-use.html new file mode 100644 index 000000000..78e82ae5c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/package-use.html @@ -0,0 +1,131 @@ + + + + +Uses of Package dev.dsf.bpe.v2 (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2

+
+
Packages that use dev.dsf.bpe.v2
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.Kem.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.Kem.html new file mode 100644 index 000000000..99cdefd73 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.Kem.html @@ -0,0 +1,275 @@ + + + + +CryptoService.Kem (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CryptoService.Kem

+
+
+
+
Enclosing interface:
+
CryptoService
+
+
+
public static interface CryptoService.Kem
+
Key encapsulation mechanism with encrypt and decrypt methods.
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.html new file mode 100644 index 000000000..b5f605b5a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/CryptoService.html @@ -0,0 +1,849 @@ + + + + +CryptoService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CryptoService

+
+
+
+
public interface CryptoService
+
Provides methods for: +
    +
  • Creating and using RSA and ECDH key encapsulation mechanism
  • +
  • Reading X509 certificates and private-keys (encrypted or not encrypted)
  • +
  • Reading JKS and PKCS12 key-stores
  • +
  • Creating JKS and PKCS12 key-stores based on trusted certificates or private-key and certificate chain
  • +
  • Generating RSA (4096 bit), EC (secp256r1, secp384r1, secp521r1, X25519, X448) key-pairs
  • +
  • Validating key-pairs to check if a private-key belongs to a public-key
  • +
  • Validating certificates
  • +
  • Creating SSLContexts based on a key-store with trusted certificates and/or a key-store with private-key + and certificate chain
  • +
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      createRsaKem

      +
      CryptoService.Kem createRsaKem()
      +
      +
      Returns:
      +
      key encapsulation mechanism with RSA key exchange using KDF2 SHA-512 for AES-256, use with RSA key pairs
      +
      +
      +
    • +
    • +
      +

      createEcDhKem

      +
      CryptoService.Kem createEcDhKem()
      +
      +
      Returns:
      +
      key encapsulation mechanism with Diffie–Hellman key exchange for AES-256, use with elliptic curve key + pairs like X25519, X448, secp256r1, secp384r1 and secp521r1
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorRsa4096AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorRsa4096AndInitialize()
      +
      +
      Returns:
      +
      created and initialized RSA (4096 bit) key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorSecp256r1AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorSecp256r1AndInitialize()
      +
      +
      Returns:
      +
      created and initialized secp256r1 key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorSecp384r1AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorSecp384r1AndInitialize()
      +
      +
      Returns:
      +
      created and initialized secp384r1 key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorSecp521r1AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorSecp521r1AndInitialize()
      +
      +
      Returns:
      +
      created and initialized secp521r1 key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorX25519AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorX25519AndInitialize()
      +
      +
      Returns:
      +
      created and initialized x25519 key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createKeyPairGeneratorX448AndInitialize

      +
      KeyPairGenerator createKeyPairGeneratorX448AndInitialize()
      +
      +
      Returns:
      +
      created and initialized x448 key pair generator
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      readCertificate

      +
      default X509Certificate readCertificate(Path pem) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      Returns:
      +
      certificate
      +
      Throws:
      +
      IOException - if the given file does not contain a pem encoded certificate, more than one or is not readable or + parsable
      +
      +
      +
    • +
    • +
      +

      readCertificate

      +
      X509Certificate readCertificate(InputStream pem) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      Returns:
      +
      certificate
      +
      Throws:
      +
      IOException - if the given InputStream does not contain a pem encoded certificate, more than one or is not + readable or parsable
      +
      +
      +
    • +
    • +
      +

      readCertificates

      +
      default List<X509Certificate> readCertificates(Path pem) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      Returns:
      +
      list of certificates
      +
      Throws:
      +
      IOException - if the given file does not contain pem encoded certificates or is not readable or one is not parsable
      +
      +
      +
    • +
    • +
      +

      readCertificates

      +
      List<X509Certificate> readCertificates(InputStream pem) + throws IOException
      +
      +
      Parameters:
      +
      pem -
      +
      Returns:
      +
      list of certificates
      +
      Throws:
      +
      IOException - if the given InputStream does not contain pem encoded certificates or is not readable or one + is not parsable
      +
      +
      +
    • +
    • +
      +

      readPrivateKey

      +
      default PrivateKey readPrivateKey(Path pem) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      Returns:
      +
      private key
      +
      Throws:
      +
      IOException - if the given file does not contain a pem encoded, unencrypted private key, more than one or is not + readable or parsable
      +
      +
      +
    • +
    • +
      +

      readPrivateKey

      +
      default PrivateKey readPrivateKey(InputStream pem) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      Returns:
      +
      private key
      +
      Throws:
      +
      IOException - if the given InputStream does not contain a pem encoded, unencrypted private key, more than + one or is not readable or parsable
      +
      +
      +
    • +
    • +
      +

      readPrivateKey

      +
      default PrivateKey readPrivateKey(Path pem, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      password - if key encrypted not null
      +
      Returns:
      +
      private key
      +
      Throws:
      +
      IOException - if the given file does not contain a pem encoded private key, more than one or is not readable or + parsable
      +
      +
      +
    • +
    • +
      +

      readPrivateKey

      +
      PrivateKey readPrivateKey(InputStream pem, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      pem - not null
      +
      password - if key encrypted not null
      +
      Returns:
      +
      private key
      +
      Throws:
      +
      IOException - if the given InputStream does not contain a pem encoded private key, more than one or is not + readable or parsable
      +
      +
      +
    • +
    • +
      +

      isKeyPair

      +
      boolean isKeyPair(PrivateKey privateKey, + PublicKey publicKey)
      +
      Checks if the given privateKey and publicKey match by checking if a generated signature can be + verified for RSA, EC and EdDSA key pairs or a Diffie-Hellman key agreement produces the same secret key for a XDH + key pair. If the privateKey is a RSAPrivateCrtKey and the publicKey is a + RSAPublicKey modulus and public-exponent will be compared.
      +
      +
      Parameters:
      +
      privateKey - may be null
      +
      publicKey - may be null
      +
      Returns:
      +
      true if the given keys are not null and match
      +
      +
      +
    • +
    • +
      +

      isCertificateExpired

      +
      boolean isCertificateExpired(X509Certificate certificate)
      +
      +
      Parameters:
      +
      certificate - not null
      +
      Returns:
      +
      true if the given certificate not-after field is after ZonedDateTime.now()
      +
      +
      +
    • +
    • +
      +

      isClientCertificate

      +
      boolean isClientCertificate(X509Certificate certificate)
      +
      +
      Parameters:
      +
      certificate - not null
      +
      Returns:
      +
      true if given certificate has extended key usage extension "TLS Web Client + Authentication"
      +
      +
      +
    • +
    • +
      +

      isServerCertificate

      +
      boolean isServerCertificate(X509Certificate certificate)
      +
      +
      Parameters:
      +
      certificate - not null
      +
      Returns:
      +
      true if given certificate has extended key usage extension "TLS Web Server + Authentication"
      +
      +
      +
    • +
    • +
      +

      validateClientCertificate

      +
      default void validateClientCertificate(KeyStore trustStore, + X509Certificate... certificateChain) + throws CertificateException
      +
      +
      Parameters:
      +
      trustStore - not null
      +
      certificateChain - not null
      +
      Throws:
      +
      CertificateException - if the the given certificate or certificate chain is not trusted as a client certificate by a PKIX + trust manager created for the given trust store
      +
      +
      +
    • +
    • +
      +

      validateClientCertificate

      +
      void validateClientCertificate(KeyStore trustStore, + Collection<? extends X509Certificate> certificateChain) + throws CertificateException
      +
      +
      Parameters:
      +
      trustStore - not null
      +
      certificateChain - not null
      +
      Throws:
      +
      CertificateException - if the the given certificate or certificate chain is not trusted as a client certificate by a PKIX + trust manager created for the given trust store
      +
      +
      +
    • +
    • +
      +

      validateServerCertificate

      +
      default void validateServerCertificate(KeyStore trustStore, + X509Certificate... certificateChain) + throws CertificateException
      +
      +
      Parameters:
      +
      trustStore - not null
      +
      certificateChain - not null
      +
      Throws:
      +
      CertificateException - if the the given certificate or certificate chain is not trusted as a server certificate by a PKIX + trust manager created for the given trust store
      +
      +
      +
    • +
    • +
      +

      validateServerCertificate

      +
      void validateServerCertificate(KeyStore trustStore, + Collection<? extends X509Certificate> certificateChain) + throws CertificateException
      +
      +
      Parameters:
      +
      trustStore - not null
      +
      certificateChain - not null
      +
      Throws:
      +
      CertificateException - if the the given certificate or certificate chain is not trusted as a server certificate by a PKIX + trust manager created for the given trust store
      +
      +
      +
    • +
    • +
      +

      createKeyStoreForPrivateKeyAndCertificateChain

      +
      default KeyStore createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey key, + char[] password, + X509Certificate... chain)
      +
      +
      Parameters:
      +
      key - not null
      +
      password - not null
      +
      chain - not null, at least one
      +
      Returns:
      +
      jks KeyStore for the given key and chain
      +
      +
      +
    • +
    • +
      +

      createKeyStoreForPrivateKeyAndCertificateChain

      +
      KeyStore createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey key, + char[] password, + Collection<? extends X509Certificate> chain)
      +
      +
      Parameters:
      +
      key - not null
      +
      password - not null
      +
      chain - not null, at least one
      +
      Returns:
      +
      jks KeyStore for the given key and chain
      +
      +
      +
    • +
    • +
      +

      createKeyStoreForTrustedCertificates

      +
      default KeyStore createKeyStoreForTrustedCertificates(X509Certificate... certificates)
      +
      +
      Parameters:
      +
      certificates - not null, at least one
      +
      Returns:
      +
      jks KeyStore for the given certificates
      +
      +
      +
    • +
    • +
      +

      createKeyStoreForTrustedCertificates

      +
      KeyStore createKeyStoreForTrustedCertificates(Collection<? extends X509Certificate> certificates)
      +
      +
      Parameters:
      +
      certificates - not null, at least one
      +
      Returns:
      +
      jks KeyStore for the given certificates
      +
      +
      +
    • +
    • +
      +

      readKeyStoreJks

      +
      default KeyStore readKeyStoreJks(Path file, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      file - not null
      +
      password - if not null used to check the integrity of the keystore
      +
      Returns:
      +
      jks KeyStore
      +
      Throws:
      +
      IOException
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      readKeyStoreJks

      +
      KeyStore readKeyStoreJks(InputStream stream, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      stream - not null
      +
      password - if not null used to check the integrity of the keystore
      +
      Returns:
      +
      jks KeyStore
      +
      Throws:
      +
      IOException
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      readKeyStorePkcs12

      +
      default KeyStore readKeyStorePkcs12(Path file, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      file - not null
      +
      password - if not null used to check the integrity of the keystore
      +
      Returns:
      +
      pkcs12 KeyStore
      +
      Throws:
      +
      IOException
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      readKeyStorePkcs12

      +
      KeyStore readKeyStorePkcs12(InputStream stream, + char[] password) + throws IOException
      +
      +
      Parameters:
      +
      stream - not null
      +
      password - if not null used to check the integrity of the keystore
      +
      Returns:
      +
      pkcs12 KeyStore
      +
      Throws:
      +
      IOException
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createSSLContext

      + +
      +
      Parameters:
      +
      trustStore - not null
      +
      Returns:
      +
      SSLContext with TrustManager for the given trustStore
      +
      Throws:
      +
      KeyStoreException
      +
      NoSuchAlgorithmException
      +
      UnrecoverableKeyException
      +
      KeyManagementException
      +
      +
      +
    • +
    • +
      +

      createSSLContext

      +
      SSLContext createSSLContext(KeyStore trustStore, + KeyStore keyStore, + char[] keyStorePassword) + throws KeyStoreException, +NoSuchAlgorithmException, +UnrecoverableKeyException, +KeyManagementException
      +
      +
      Parameters:
      +
      trustStore - not null
      +
      keyStore - not null
      +
      keyStorePassword - not null
      +
      Returns:
      +
      SSLContext with TrustManager for the given trustStore and KeyManager for + the given keyStore / keyStorePassword
      +
      Throws:
      +
      KeyStoreException
      +
      NoSuchAlgorithmException
      +
      UnrecoverableKeyException
      +
      KeyManagementException
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/DsfClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/DsfClientProvider.html new file mode 100644 index 000000000..6ea5c4de0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/DsfClientProvider.html @@ -0,0 +1,182 @@ + + + + +DsfClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DsfClientProvider

+
+
+
+
public interface DsfClientProvider
+
Provides clients for DSF FHIR servers.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getLocalDsfClient

      +
      DsfClient getLocalDsfClient()
      +
      +
    • +
    • +
      +

      getDsfClient

      +
      DsfClient getDsfClient(String webserviceUrl)
      +
      +
      Parameters:
      +
      webserviceUrl - not null
      +
      Returns:
      +
      DsfClient for the given webserviceUrl
      +
      +
      +
    • +
    • +
      +

      getDsfClient

      +
      default DsfClient getDsfClient(org.hl7.fhir.r4.model.Endpoint endpoint)
      +
      +
      Parameters:
      +
      endpoint - not null, endpoint.address not null
      +
      Returns:
      +
      DsfClient for the address defined in the given endpoint
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/EndpointProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/EndpointProvider.html new file mode 100644 index 000000000..05bd9a7c0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/EndpointProvider.html @@ -0,0 +1,486 @@ + + + + +EndpointProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EndpointProvider

+
+
+
+
public interface EndpointProvider
+
Provides access to Endpoint resources from the DSF FHIR server.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getLocalEndpointAddress

      +
      String getLocalEndpointAddress()
      +
      +
      Returns:
      +
      Local DSF FHIR server base URL, e.g. https://foo.bar/fhir
      +
      +
      +
    • +
    • +
      +

      getLocalEndpoint

      +
      Optional<org.hl7.fhir.r4.model.Endpoint> getLocalEndpoint()
      +
      +
      Returns:
      +
      Endpoint resource from the local DSF FHIR server associated with the configured base URL, empty + Optional if no such resource exists
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLocalEndpointIdentifier

      +
      default Optional<org.hl7.fhir.r4.model.Identifier> getLocalEndpointIdentifier()
      +
      +
      Returns:
      +
      DSF identifier of the Endpoint resource from the local DSF FHIR server associated with the + configured base URL, empty Optional if no such resource exists or the Endpoint does not + have a DSF identifier
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLocalEndpointIdentifierValue

      +
      default Optional<String> getLocalEndpointIdentifierValue()
      +
      +
      Returns:
      +
      DSF identifier value of the Endpoint resource from the local DSF FHIR server associated with the + configured base URL, empty Optional if no such resource exists or the Endpoint does not + have a DSF identifier
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoint

      +
      Optional<org.hl7.fhir.r4.model.Endpoint> getEndpoint(org.hl7.fhir.r4.model.Identifier endpointIdentifier)
      +
      +
      Parameters:
      +
      endpointIdentifier - may be null
      +
      Returns:
      +
      Active Endpoint resource from the local DSF FHIR server with the given endpointIdentifier, + empty Optional if no such resource exists or the given identifier is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoint

      +
      default Optional<org.hl7.fhir.r4.model.Endpoint> getEndpoint(String endpointIdentifierValue)
      +
      +
      Parameters:
      +
      endpointIdentifierValue - may be null
      +
      Returns:
      +
      Active Endpoint resource from the local DSF FHIR server with the given DSF + endpointIdentifierValue, empty Optional if no such resource exists or the given identifier + value is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpointAddress

      +
      default Optional<String> getEndpointAddress(org.hl7.fhir.r4.model.Identifier endpointIdentifier)
      +
      +
      Parameters:
      +
      endpointIdentifier - may be null
      +
      Returns:
      +
      Address (base URL) of the active Endpoint resource from the local DSF FHIR server with the given + endpointIdentifier, empty Optional if no such resource exists or the given identifier is + null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpointAddress

      +
      default Optional<String> getEndpointAddress(String endpointIdentifierValue)
      +
      +
      Parameters:
      +
      endpointIdentifierValue - may be null
      +
      Returns:
      +
      Address (base URL) of the active Endpoint resource from the local DSF FHIR server with the given + DSF endpointIdentifierValue, empty Optional if no such resource exists or the given + identifier value is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoint

      +
      Optional<org.hl7.fhir.r4.model.Endpoint> getEndpoint(org.hl7.fhir.r4.model.Identifier parentOrganizationIdentifier, + org.hl7.fhir.r4.model.Identifier memberOrganizationIdentifier, + org.hl7.fhir.r4.model.Coding memberOrganizationRole)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifier - may be null
      +
      memberOrganizationIdentifier - may be null
      +
      memberOrganizationRole - may be null
      +
      Returns:
      +
      Active Endpoint resource from the local DSF FHIR server associated with the given + memberOrganizationIdentifier and memberOrganizationRole in a parent organization with the + given parentOrganizationIdentifier, empty Optional if no such resource exists or one of + the parameters is null; only considers Endpoints from active OrganizationAffiliation + resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoint

      +
      default Optional<org.hl7.fhir.r4.model.Endpoint> getEndpoint(String parentOrganizationIdentifierValue, + String memberOrganizationIdentifierValue, + String memberOrganizationRoleCode)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifierValue - may be null
      +
      memberOrganizationIdentifierValue - may be null
      +
      memberOrganizationRoleCode - may be null
      +
      Returns:
      +
      Active Endpoint resource from the local DSF FHIR server associated with the given DSF + memberOrganizationIdentifierValue and memberOrganizationRoleCode in a parent organization + with the given DSF parentOrganizationIdentifierValue, empty Optional if no such resource + exists or one of the parameters is null; only considers Endpoints from active + OrganizationAffiliation resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpointAddress

      +
      default Optional<String> getEndpointAddress(org.hl7.fhir.r4.model.Identifier parentOrganizationIdentifier, + org.hl7.fhir.r4.model.Identifier memberOrganizationIdentifier, + org.hl7.fhir.r4.model.Coding memberOrganizationRole)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifier - may be null
      +
      memberOrganizationIdentifier - may be null
      +
      memberOrganizationRole - may be null
      +
      Returns:
      +
      Address (base URL) of the active Endpoint resource from the local DSF FHIR server associated with + the given memberOrganizationIdentifier and memberOrganizationRole in a parent organization + with the given parentOrganizationIdentifier, empty Optional if no such resource exists or + one of the parameters is null; only considers Endpoints from active + OrganizationAffiliation resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpointAddress

      +
      default Optional<String> getEndpointAddress(String parentOrganizationIdentifierValue, + String memberOrganizationIdentifierValue, + String memberOrganizationRoleCode)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifierValue - may be null
      +
      memberOrganizationIdentifierValue - may be null
      +
      memberOrganizationRoleCode - may be null
      +
      Returns:
      +
      Address (base URL) of the active Endpoint resource from the local DSF FHIR server associated with + the given DSF memberOrganizationIdentifierValue and memberOrganizationRoleCode in a parent + organization with the given DSF parentOrganizationIdentifierValue, empty Optional if no + such resource exists or one of the parameters is null; only considers Endpoints from active + OrganizationAffiliation resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoints

      +
      List<org.hl7.fhir.r4.model.Endpoint> getEndpoints(org.hl7.fhir.r4.model.Identifier parentOrganizationIdentifier, + org.hl7.fhir.r4.model.Coding memberOrganizationRole)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifier - may be null
      +
      memberOrganizationRole - may be null
      +
      Returns:
      +
      Active Endpoint resources from the local DSF FHIR server associated with the given + memberOrganizationRole in a parent organization with the given + parentOrganizationIdentifier, empty List if no resources exist or one of the parameters is + null; only considers Endpoints from active OrganizationAffiliation resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getEndpoints

      +
      default List<org.hl7.fhir.r4.model.Endpoint> getEndpoints(String parentOrganizationIdentifierValue, + String memberOrganizationRoleCode)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifierValue - may be null
      +
      memberOrganizationRoleCode - may be null
      +
      Returns:
      +
      Active Endpoint resources from the local DSF FHIR server associated with the given + memberOrganizationRoleCode in a parent organization with the given DSF + parentOrganizationIdentifierValue, empty List if no resources exist or one of the + parameters is null; only considers Endpoints from active OrganizationAffiliation + resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/FhirClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/FhirClientProvider.html new file mode 100644 index 000000000..62b148626 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/FhirClientProvider.html @@ -0,0 +1,215 @@ + + + + +FhirClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FhirClientProvider

+
+
+
+
public interface FhirClientProvider
+
Provides connection configurations and HAPI FHIR clients for configured (non DSF) FHIR servers and DSF FHIR servers.
+
+
See Also:
+
+ +
+
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    Optional<ca.uhn.fhir.rest.client.api.IGenericClient>
    +
    getClient(String fhirServerId)
    +
    +
    HAPI FHIR client for a FHIR server configured via YAML with the given fhirServerId.
    +
    + Use #local as the fhirServerId for a connection to the local DSF FHIR server.
    + Use #<value> as the fhirServerId for a connection to a DSF FHIR server with an active + Endpoint resource and the given fhirServerId as the "http://dsf.dev/sid/endpoint-identifier" + value (ignoring the # character).
    +
    + +
    getClientConfig(String fhirServerId)
    +
    +
    FHIR client config for a FHIR server configured via YAML with the given fhirServerId.
    +
    + Use #local as the fhirServerId for a connection configuration to the local DSF FHIR + server.
    + Use #<value> as the fhirServerId for a connection configuration to a DSF FHIR server with + an active Endpoint resource and the given fhirServerId as the + "http://dsf.dev/sid/endpoint-identifier" value (ignoring the # character).
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getClient

      +
      Optional<ca.uhn.fhir.rest.client.api.IGenericClient> getClient(String fhirServerId)
      +
      HAPI FHIR client for a FHIR server configured via YAML with the given fhirServerId.
      +
      + Use #local as the fhirServerId for a connection to the local DSF FHIR server.
      + Use #<value> as the fhirServerId for a connection to a DSF FHIR server with an active + Endpoint resource and the given fhirServerId as the "http://dsf.dev/sid/endpoint-identifier" + value (ignoring the # character).
      +
      +
      Parameters:
      +
      fhirServerId - may be null
      +
      Returns:
      +
      never null, Optional.empty() if no client is configured for the given + fhirServerId
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getClientConfig

      +
      Optional<ClientConfig> getClientConfig(String fhirServerId)
      +
      FHIR client config for a FHIR server configured via YAML with the given fhirServerId.
      +
      + Use #local as the fhirServerId for a connection configuration to the local DSF FHIR + server.
      + Use #<value> as the fhirServerId for a connection configuration to a DSF FHIR server with + an active Endpoint resource and the given fhirServerId as the + "http://dsf.dev/sid/endpoint-identifier" value (ignoring the # character).
      +
      +
      Parameters:
      +
      fhirServerId - may be null
      +
      Returns:
      +
      never null, Optional.empty() if no client is configured for the given + fhirServerId
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MailService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MailService.html new file mode 100644 index 000000000..71f907745 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MailService.html @@ -0,0 +1,296 @@ + + + + +MailService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MailService

+
+
+
+
public interface MailService
+
Service for sending e-mail if a connection to an SMTP mail server is configured. If no connection is configured + content will be logged.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    default void
    +
    send(String subject, + String message)
    +
    +
    Sends a plain text mail to the BPE wide configured recipients.
    +
    +
    default void
    +
    send(String subject, + String message, + String to)
    +
    +
    Sends a plain text mail to the given address (to) if not null or the BPE wide configured + recipients.
    +
    +
    default void
    +
    send(String subject, + String message, + Collection<String> to)
    +
    +
    Sends a plain text mail to the given addresses (to) if not null and not empty or the BPE wide + configured recipients.
    +
    +
    default void
    +
    send(String subject, + javax.mail.internet.MimeBodyPart body)
    +
    +
    Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients.
    +
    +
    default void
    +
    send(String subject, + javax.mail.internet.MimeBodyPart body, + String to)
    +
    +
    Sends the given MimeBodyPart as content of a mail to the given address (to) if not + null or the BPE wide configured recipients.
    +
    +
    default void
    +
    send(String subject, + javax.mail.internet.MimeBodyPart body, + Collection<String> to)
    +
    +
    Sends the given MimeBodyPart as content of a mail to the given addresses (to) if not + null and not empty or the BPE wide configured recipients.
    +
    +
    void
    +
    send(String subject, + javax.mail.internet.MimeBodyPart body, + Consumer<javax.mail.internet.MimeMessage> messageModifier)
    +
    +
    Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients, the + messageModifier can be used to modify elements of the generated MimeMessage before it is send to + the SMTP server.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      send

      +
      default void send(String subject, + String message)
      +
      Sends a plain text mail to the BPE wide configured recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      message - not null
      +
      +
      +
    • +
    • +
      +

      send

      +
      default void send(String subject, + String message, + String to)
      +
      Sends a plain text mail to the given address (to) if not null or the BPE wide configured + recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      message - not null
      +
      to - BPE wide configured recipients if parameter is null
      +
      +
      +
    • +
    • +
      +

      send

      +
      default void send(String subject, + String message, + Collection<String> to)
      +
      Sends a plain text mail to the given addresses (to) if not null and not empty or the BPE wide + configured recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      message - not null
      +
      to - BPE wide configured recipients if parameter is null or empty
      +
      +
      +
    • +
    • +
      +

      send

      +
      default void send(String subject, + javax.mail.internet.MimeBodyPart body)
      +
      Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      body - not null
      +
      +
      +
    • +
    • +
      +

      send

      +
      default void send(String subject, + javax.mail.internet.MimeBodyPart body, + String to)
      +
      Sends the given MimeBodyPart as content of a mail to the given address (to) if not + null or the BPE wide configured recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      body - not null
      +
      to - BPE wide configured recipients if parameter is null
      +
      +
      +
    • +
    • +
      +

      send

      +
      default void send(String subject, + javax.mail.internet.MimeBodyPart body, + Collection<String> to)
      +
      Sends the given MimeBodyPart as content of a mail to the given addresses (to) if not + null and not empty or the BPE wide configured recipients.
      +
      +
      Parameters:
      +
      subject - not null
      +
      body - not null
      +
      to - BPE wide configured recipients if parameter is null or empty
      +
      +
      +
    • +
    • +
      +

      send

      +
      void send(String subject, + javax.mail.internet.MimeBodyPart body, + Consumer<javax.mail.internet.MimeMessage> messageModifier)
      +
      Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients, the + messageModifier can be used to modify elements of the generated MimeMessage before it is send to + the SMTP server.
      +
      +
      Parameters:
      +
      subject - not null
      +
      body - not null
      +
      messageModifier - may be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MimetypeService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MimetypeService.html new file mode 100644 index 000000000..11a1e5622 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/MimetypeService.html @@ -0,0 +1,182 @@ + + + + +MimetypeService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MimetypeService

+
+
+
+
public interface MimetypeService
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    default void
    +
    validate(byte[] data, + String declared)
    +
    +
    Detects the mimetype of the provided byte array and validates if the detected mimetype equals the declared + mimetype.
    +
    +
    void
    +
    validate(InputStream stream, + String declared)
    +
    +
    Detects the mimetype of the provided input stream and validates if the detected mimetype equals the declared + mimetype.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      validate

      +
      default void validate(byte[] data, + String declared)
      +
      Detects the mimetype of the provided byte array and validates if the detected mimetype equals the declared + mimetype. Logs a warning if the full mimetypes do not match, throws a RuntimeException if the base + mimetypes do not match.
      +
      +
      Parameters:
      +
      data - byte array of which the mimetype should be detected
      +
      declared - the declared mimetype of the data
      +
      Throws:
      +
      RuntimeException - if the detected and the declared base mimetype do not match
      +
      +
      +
    • +
    • +
      +

      validate

      +
      void validate(InputStream stream, + String declared)
      +
      Detects the mimetype of the provided input stream and validates if the detected mimetype equals the declared + mimetype. Logs a warning if the full mimetypes do not match, throws a RuntimeException if the base + mimetypes do not match.
      +
      +
      Parameters:
      +
      stream - input stream of which the mimetype should be detected
      +
      declared - the declared mimetype of the data
      +
      Throws:
      +
      RuntimeException - if the detected and the declared base mimetype do not match
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OidcClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OidcClientProvider.html new file mode 100644 index 000000000..a3baf6bbc --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OidcClientProvider.html @@ -0,0 +1,221 @@ + + + + +OidcClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OidcClientProvider

+
+
+
+
public interface OidcClientProvider
+
Provides access to OidcClients implementing the Client Credentials Grant.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getOidcClient

      +
      default OidcClient getOidcClient(String baseUrl, + String clientId, + char[] clientSecret)
      +
      +
      Parameters:
      +
      baseUrl - not null
      +
      clientId - not null
      +
      clientSecret - not null
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getOidcClient

      +
      OidcClient getOidcClient(String baseUrl, + String clientId, + char[] clientSecret, + String discoveryPath, + Duration connectTimeout, + Duration readTimeout, + KeyStore trustStore, + Boolean enableDebugLogging)
      +
      +
      Parameters:
      +
      baseUrl - not null
      +
      clientId - not null
      +
      clientSecret - not null
      +
      discoveryPath - may be null, will use configured default value
      +
      connectTimeout - may be null, will use configured default value
      +
      readTimeout - may be null, will use configured default value
      +
      trustStore - may be null, will use configured default value
      +
      enableDebugLogging - may be null, will use configured default value
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    • +
      +

      getOidcClient

      + +
      +
      Parameters:
      +
      config - not null
      +
      Returns:
      +
      never null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OrganizationProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OrganizationProvider.html new file mode 100644 index 000000000..382a4798c --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/OrganizationProvider.html @@ -0,0 +1,374 @@ + + + + +OrganizationProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OrganizationProvider

+
+
+
+
public interface OrganizationProvider
+
Provides access to Organization resources from the DSF FHIR server.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getLocalOrganization

      +
      Optional<org.hl7.fhir.r4.model.Organization> getLocalOrganization()
      +
      Retrieves the local Organization resources by searching for the managing Organization of the + local Endpoint resources. The local Endpoint resource is identified by the DSF FHIR server + address configured for the DSF BPE server.
      +
      +
      Returns:
      +
      Managing Organization for the Endpoint resource with address equal to the DSF FHIR server + base address configured for this DSF BPE, empty Optional if no such resource exists
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLocalOrganizationIdentifier

      +
      default Optional<org.hl7.fhir.r4.model.Identifier> getLocalOrganizationIdentifier()
      +
      +
      Returns:
      +
      DSF organization identifier from the local Organization resource, empty Optional if no + such resource exists or the Organization does not have a DSF organization identifier
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLocalOrganizationIdentifierValue

      +
      default Optional<String> getLocalOrganizationIdentifierValue()
      +
      +
      Returns:
      +
      DSF organization identifier value from the local Organization resource, empty Optional if + no such resource exists or the Organization does not have a DSF organization identifier
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getOrganization

      +
      Optional<org.hl7.fhir.r4.model.Organization> getOrganization(org.hl7.fhir.r4.model.Identifier organizationIdentifier)
      +
      +
      Parameters:
      +
      organizationIdentifier - may be null
      +
      Returns:
      +
      Active Organization with the given organizationIdentifier, empty Optional if no + such resource exists or the given identifier is null
      +
      +
      +
    • +
    • +
      +

      getOrganization

      +
      default Optional<org.hl7.fhir.r4.model.Organization> getOrganization(String organizationIdentifierValue)
      +
      +
      Parameters:
      +
      organizationIdentifierValue - may be null
      +
      Returns:
      +
      Active Organization with the given DSF organizationIdentifier, empty Optional if + no such resource exists or the given identifier value is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getOrganizations

      +
      List<org.hl7.fhir.r4.model.Organization> getOrganizations(org.hl7.fhir.r4.model.Identifier parentOrganizationIdentifier)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifier - may be null
      +
      Returns:
      +
      Active Organizations configured as participatingOrganization for an active parent Organization + with the given parentOrganizationIdentifier, empty List if no parent organization found, + parent has no participating organizations configured via OrganizationAffiliation resources or the + given identifier is null
      +
      +
      +
    • +
    • +
      +

      getOrganizations

      +
      default List<org.hl7.fhir.r4.model.Organization> getOrganizations(String parentOrganizationIdentifierValue)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifierValue - may be null
      +
      Returns:
      +
      Active Organizations configured as participatingOrganization for an active parent Organization + with the given DSF parentOrganizationIdentifierValue, empty List if no parent organization + found, parent has no participating organizations configured via OrganizationAffiliation resources + or the given identifier is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getOrganizations

      +
      List<org.hl7.fhir.r4.model.Organization> getOrganizations(org.hl7.fhir.r4.model.Identifier parentOrganizationIdentifier, + org.hl7.fhir.r4.model.Coding memberOrganizationRole)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifier - may be null
      +
      memberOrganizationRole - may be null
      +
      Returns:
      +
      Active Organizations configured as participatingOrganization for an active parent Organization + with the given parentOrganizationIdentifier and role equal to the given + memberOrganizationRole, empty List if no parent organization found, parent has no + participating organizations configured via OrganizationAffiliation resources with the given role + or the given identifier is null
      +
      +
      +
    • +
    • +
      +

      getOrganizations

      +
      default List<org.hl7.fhir.r4.model.Organization> getOrganizations(String parentOrganizationIdentifierValue, + String memberOrganizationRoleCode)
      +
      +
      Parameters:
      +
      parentOrganizationIdentifierValue - may be null
      +
      memberOrganizationRoleCode - may be null
      +
      Returns:
      +
      Active Organizations configured as participatingOrganization for an active parent Organization + with the given parentOrganizationIdentifier and role equal to the given + memberOrganizationRole, empty List if no parent organization found, parent has no + participating organizations configured via OrganizationAffiliation resources with the given role + or the given identifier is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getRemoteOrganizations

      +
      List<org.hl7.fhir.r4.model.Organization> getRemoteOrganizations()
      +
      +
      Returns:
      +
      All active Organization resources except the local Organization and parent + Organization resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getParentOrganizations

      +
      List<org.hl7.fhir.r4.model.Organization> getParentOrganizations()
      +
      +
      Returns:
      +
      All active parent Organization resources
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/QuestionnaireResponseHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/QuestionnaireResponseHelper.html new file mode 100644 index 000000000..ff3573dd7 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/QuestionnaireResponseHelper.html @@ -0,0 +1,232 @@ + + + + +QuestionnaireResponseHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface QuestionnaireResponseHelper

+
+
+
+
public interface QuestionnaireResponseHelper
+
Methods for manipulating QuestionnaireResponse resources.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    +
    addItemLeafWithAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId, + String text, + org.hl7.fhir.r4.model.Type answer)
    +
     
    +
    void
    +
    addItemLeafWithoutAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId, + String text)
    +
     
    +
    default Optional<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent>
    +
    getFirstItemLeaveMatchingLinkId(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
    +
     
    +
    default List<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent>
    +
    getItemLeavesAsList(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
    +
     
    +
    Stream<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent>
    +
    getItemLeavesAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
    +
     
    +
    default List<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent>
    +
    getItemLeavesMatchingLinkIdAsList(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
    +
     
    +
    Stream<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent>
    +
    getItemLeavesMatchingLinkIdAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
    +
     
    + +
    getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
    +
     
    +
    org.hl7.fhir.r4.model.Type
    +
    transformQuestionTypeToAnswerType(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemComponent question)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getFirstItemLeaveMatchingLinkId

      +
      default Optional<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent> getFirstItemLeaveMatchingLinkId(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
      +
      +
    • +
    • +
      +

      getItemLeavesMatchingLinkIdAsList

      +
      default List<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent> getItemLeavesMatchingLinkIdAsList(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
      +
      +
    • +
    • +
      +

      getItemLeavesMatchingLinkIdAsStream

      +
      Stream<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent> getItemLeavesMatchingLinkIdAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId)
      +
      +
    • +
    • +
      +

      getItemLeavesAsList

      +
      default List<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent> getItemLeavesAsList(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
      +
      +
    • +
    • +
      +

      getItemLeavesAsStream

      +
      Stream<org.hl7.fhir.r4.model.QuestionnaireResponse.QuestionnaireResponseItemComponent> getItemLeavesAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
      +
      +
    • +
    • +
      +

      transformQuestionTypeToAnswerType

      +
      org.hl7.fhir.r4.model.Type transformQuestionTypeToAnswerType(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemComponent question)
      +
      +
    • +
    • +
      +

      addItemLeafWithoutAnswer

      +
      void addItemLeafWithoutAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId, + String text)
      +
      +
    • +
    • +
      +

      addItemLeafWithAnswer

      +
      void addItemLeafWithAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse, + String linkId, + String text, + org.hl7.fhir.r4.model.Type answer)
      +
      +
    • +
    • +
      +

      getLocalVersionlessAbsoluteUrl

      +
      String getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.QuestionnaireResponse questionnaireResponse)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/ReadAccessHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/ReadAccessHelper.html new file mode 100644 index 000000000..5c4f84f66 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/ReadAccessHelper.html @@ -0,0 +1,488 @@ + + + + +ReadAccessHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ReadAccessHelper

+
+
+
+
public interface ReadAccessHelper
+
Methods to configure read access for FHIR resources on a DSF FHIR server. Methods add and check resource Meta + tags.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addAll(R resource)
    +
    +
    Adds All tag.
    +
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addLocal(R resource)
    +
    +
    Adds LOCAL tag.
    +
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addOrganization(R resource, + String organizationIdentifier)
    +
    +
    Adds ORGANIZATION tag for the given organization.
    +
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addOrganization(R resource, + org.hl7.fhir.r4.model.Organization organization)
    +
    +
    Adds ORGANIZATION tag for the given organization.
    +
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addRole(R resource, + String consortiumIdentifier, + String roleSystem, + String roleCode)
    +
    +
    Adds ROLE tag for the given affiliation.
    +
    +
    <R extends org.hl7.fhir.r4.model.Resource>
    R
    +
    addRole(R resource, + org.hl7.fhir.r4.model.OrganizationAffiliation affiliation)
    +
    +
    Adds ROLE tag for the given affiliation.
    +
    +
    boolean
    +
    hasAll(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    boolean
    +
    hasAnyOrganization(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    boolean
    +
    hasAnyRole(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    boolean
    +
    hasLocal(org.hl7.fhir.r4.model.Resource resource)
    +
     
    +
    boolean
    +
    hasOrganization(org.hl7.fhir.r4.model.Resource resource, + String organizationIdentifier)
    +
     
    +
    boolean
    +
    hasOrganization(org.hl7.fhir.r4.model.Resource resource, + org.hl7.fhir.r4.model.Organization organization)
    +
     
    +
    boolean
    +
    hasRole(org.hl7.fhir.r4.model.Resource resource, + String consortiumIdentifier, + String roleSystem, + String roleCode)
    +
     
    +
    boolean
    +
    hasRole(org.hl7.fhir.r4.model.Resource resource, + List<org.hl7.fhir.r4.model.OrganizationAffiliation> affiliations)
    +
     
    +
    boolean
    +
    hasRole(org.hl7.fhir.r4.model.Resource resource, + org.hl7.fhir.r4.model.OrganizationAffiliation affiliation)
    +
     
    +
    boolean
    +
    isValid(org.hl7.fhir.r4.model.Resource resource)
    +
    +
    Resource with access tags valid if:
    + + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
    + or
    + 1 ALL tag
    +
    + All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
    +
    + Does not check if referenced organizations or roles exist
    +
    +
    boolean
    +
    isValid(org.hl7.fhir.r4.model.Resource resource, + Predicate<org.hl7.fhir.r4.model.Identifier> organizationWithIdentifierExists, + Predicate<org.hl7.fhir.r4.model.Coding> roleExists)
    +
    +
    Resource with access tags valid if:
    + + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
    + or
    + 1 ALL tag
    +
    + All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      addLocal

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addLocal(R resource)
      +
      Adds LOCAL tag. Removes ALL tag if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      Returns:
      +
      null if given resource is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addOrganization

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addOrganization(R resource, + String organizationIdentifier)
      +
      Adds ORGANIZATION tag for the given organization. Adds LOCAL tag if not present, removes ALL tag if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      organizationIdentifier - not null
      +
      Returns:
      +
      null if given resource is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addOrganization

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addOrganization(R resource, + org.hl7.fhir.r4.model.Organization organization)
      +
      Adds ORGANIZATION tag for the given organization. Adds LOCAL tag if not present, removes ALL tag if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      organization - not null
      +
      Returns:
      +
      null if given resource is null
      +
      Throws:
      +
      NullPointerException - if given organization is null
      +
      IllegalArgumentException - if given organization does not have valid identifier
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addRole

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addRole(R resource, + String consortiumIdentifier, + String roleSystem, + String roleCode)
      +
      Adds ROLE tag for the given affiliation. Adds LOCAL tag if not present, removes ALL tag if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      consortiumIdentifier - not null
      +
      roleSystem - not null
      +
      roleCode - not null
      +
      Returns:
      +
      null if given resource is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addRole

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addRole(R resource, + org.hl7.fhir.r4.model.OrganizationAffiliation affiliation)
      +
      Adds ROLE tag for the given affiliation. Adds LOCAL tag if not present, removes ALL tag if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      affiliation - not null
      +
      Returns:
      +
      null if given resource is null
      +
      Throws:
      +
      NullPointerException - if given affiliation is null
      +
      IllegalArgumentException - if given affiliation does not have valid consortium identifier or organization role (only one + role supported)
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addAll

      +
      <R extends org.hl7.fhir.r4.model.Resource> R addAll(R resource)
      +
      Adds All tag. Removes LOCAL, ORGANIZATION and ROLE tags if present.
      +
      +
      Type Parameters:
      +
      R - the resource type
      +
      Parameters:
      +
      resource - may be null
      +
      Returns:
      +
      null if given resource is null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      hasLocal

      +
      boolean hasLocal(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      hasOrganization

      +
      boolean hasOrganization(org.hl7.fhir.r4.model.Resource resource, + String organizationIdentifier)
      +
      +
    • +
    • +
      +

      hasOrganization

      +
      boolean hasOrganization(org.hl7.fhir.r4.model.Resource resource, + org.hl7.fhir.r4.model.Organization organization)
      +
      +
    • +
    • +
      +

      hasAnyOrganization

      +
      boolean hasAnyOrganization(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      hasRole

      +
      boolean hasRole(org.hl7.fhir.r4.model.Resource resource, + String consortiumIdentifier, + String roleSystem, + String roleCode)
      +
      +
    • +
    • +
      +

      hasRole

      +
      boolean hasRole(org.hl7.fhir.r4.model.Resource resource, + org.hl7.fhir.r4.model.OrganizationAffiliation affiliation)
      +
      +
    • +
    • +
      +

      hasRole

      +
      boolean hasRole(org.hl7.fhir.r4.model.Resource resource, + List<org.hl7.fhir.r4.model.OrganizationAffiliation> affiliations)
      +
      +
    • +
    • +
      +

      hasAnyRole

      +
      boolean hasAnyRole(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      hasAll

      +
      boolean hasAll(org.hl7.fhir.r4.model.Resource resource)
      +
      +
    • +
    • +
      +

      isValid

      +
      boolean isValid(org.hl7.fhir.r4.model.Resource resource)
      +
      Resource with access tags valid if:
      + + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
      + or
      + 1 ALL tag
      +
      + All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
      +
      + Does not check if referenced organizations or roles exist
      +
      +
      Parameters:
      +
      resource - may be null
      +
      Returns:
      +
      false if given resource is null or resource not valid
      +
      +
      +
    • +
    • +
      +

      isValid

      +
      boolean isValid(org.hl7.fhir.r4.model.Resource resource, + Predicate<org.hl7.fhir.r4.model.Identifier> organizationWithIdentifierExists, + Predicate<org.hl7.fhir.r4.model.Coding> roleExists)
      +
      Resource with access tags valid if:
      + + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
      + or
      + 1 ALL tag
      +
      + All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
      +
      +
      Parameters:
      +
      resource - may be null
      +
      organizationWithIdentifierExists - not null
      +
      roleExists - not null
      +
      Returns:
      +
      false if given resource is null or resource not valid
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/TaskHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/TaskHelper.html new file mode 100644 index 000000000..5d03c79ca --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/TaskHelper.html @@ -0,0 +1,862 @@ + + + + +TaskHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TaskHelper

+
+
+
+
public interface TaskHelper
+
Methods for manipulating Task resources.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.Task.ParameterComponent
    +
    createInput(org.hl7.fhir.r4.model.Type value, + String system, + String code)
    +
    +
    Creates an input parameter for the given value, system and code.
    +
    +
    org.hl7.fhir.r4.model.Task.ParameterComponent
    +
    createInput(org.hl7.fhir.r4.model.Type value, + org.hl7.fhir.r4.model.Coding coding)
    +
    +
    Creates an input parameter for the given value and coding.
    +
    +
    org.hl7.fhir.r4.model.Task.TaskOutputComponent
    +
    createOutput(org.hl7.fhir.r4.model.Type value, + String system, + String code)
    +
    +
    Creates an output parameter for the given value, system and code.
    +
    +
    org.hl7.fhir.r4.model.Task.TaskOutputComponent
    +
    createOutput(org.hl7.fhir.r4.model.Type value, + org.hl7.fhir.r4.model.Coding coding)
    +
    +
    Creates an output parameter for the given value and coding.
    +
    +
    default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getFirstInputParameter(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
    +
    +
    Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
    +
    +
    default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getFirstInputParameter(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
    +
    +
    Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
    +
    +
    default Optional<String>
    +
    getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task task, + String system, + String code)
    +
    +
    Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter is of type 'string'.
    +
    +
    default Optional<String>
    +
    getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding)
    +
    +
    Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter is of type 'string'.
    +
    +
    default <T extends org.hl7.fhir.r4.model.Type>
    Optional<T>
    +
    getFirstInputParameterValue(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<T> expectedType)
    +
    +
    Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter has the given expectedType.
    +
    +
    default <T extends org.hl7.fhir.r4.model.Type>
    Optional<T>
    +
    getFirstInputParameterValue(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<T> expectedType)
    +
    +
    Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter has the given expectedType.
    +
    +
    default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
    +
    +
    Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
    +
    +
    default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
    +
    +
    Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
    +
    +
    Stream<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getInputParameters(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
    +
    +
    Returns the input parameters from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
    +
    +
    Stream<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getInputParameters(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
    +
    +
    Returns the input parameters from the given task with the given coding (system, code), if the value + of the input parameter has the given expectedType.
    +
    + +
    getInputParameterStringValues(org.hl7.fhir.r4.model.Task task, + String system, + String code)
    +
    +
    Returns input parameter values from the given task with the given system and code, if the + value of the input parameter is of type 'string'.
    +
    + +
    getInputParameterStringValues(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding)
    +
    +
    Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter is of type 'string'.
    +
    +
    Stream<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getInputParametersWithExtension(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
    +
    +
    Returns input parameters from the given task with the given system and code, if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
    +
    +
    Stream<org.hl7.fhir.r4.model.Task.ParameterComponent>
    +
    getInputParametersWithExtension(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
    +
    +
    Returns input parameters from the given task with the given coding (system, code), if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
    +
    +
    <T extends org.hl7.fhir.r4.model.Type>
    Stream<T>
    +
    getInputParameterValues(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<T> expectedType)
    +
    +
    Returns input parameter values from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
    +
    +
    <T extends org.hl7.fhir.r4.model.Type>
    Stream<T>
    +
    getInputParameterValues(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<T> expectedType)
    +
    +
    Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
    +
    + +
    getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.Task task)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getLocalVersionlessAbsoluteUrl

      +
      String getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.Task task)
      +
      +
      Parameters:
      +
      task - may be null
      +
      Returns:
      +
      null if the given task is null
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterStringValue

      +
      default Optional<String> getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding)
      +
      Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter is of type 'string'.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      Returns:
      +
      Optional.empty() if the given task or coding is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • StringType
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterStringValue

      +
      default Optional<String> getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task task, + String system, + String code)
      +
      Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter is of type 'string'.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      Returns:
      +
      Optional.empty() if the given task is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • StringType
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterValue

      +
      default <T extends org.hl7.fhir.r4.model.Type> +Optional<T> getFirstInputParameterValue(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<T> expectedType)
      +
      Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter has the given expectedType.
      +
      +
      Type Parameters:
      +
      T - input parameter value type
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Optional.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterValue

      +
      default <T extends org.hl7.fhir.r4.model.Type> +Optional<T> getFirstInputParameterValue(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<T> expectedType)
      +
      Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter has the given expectedType.
      +
      +
      Type Parameters:
      +
      T - input parameter value type
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Optional.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterWithExtension

      +
      default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent> getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
      +
      Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      extensionUrl - may be null
      +
      Returns:
      +
      Optional.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameterWithExtension

      +
      default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent> getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
      +
      Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      extensionUrl - may be null
      +
      Returns:
      +
      Optional.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameter

      +
      default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent> getFirstInputParameter(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
      +
      Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Optional.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getFirstInputParameter

      +
      default Optional<org.hl7.fhir.r4.model.Task.ParameterComponent> getFirstInputParameter(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
      +
      Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Optional.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameterStringValues

      +
      Stream<String> getInputParameterStringValues(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding)
      +
      Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter is of type 'string'.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      Returns:
      +
      Stream.empty() if the given task or coding is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • StringType
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameterStringValues

      +
      Stream<String> getInputParameterStringValues(org.hl7.fhir.r4.model.Task task, + String system, + String code)
      +
      Returns input parameter values from the given task with the given system and code, if the + value of the input parameter is of type 'string'.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      Returns:
      +
      Stream.empty() if the given task is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • StringType
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameterValues

      +
      <T extends org.hl7.fhir.r4.model.Type> Stream<T> getInputParameterValues(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<T> expectedType)
      +
      Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
      +
      +
      Type Parameters:
      +
      T - input parameter value type
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Stream.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameterValues

      +
      <T extends org.hl7.fhir.r4.model.Type> Stream<T> getInputParameterValues(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<T> expectedType)
      +
      Returns input parameter values from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
      +
      +
      Type Parameters:
      +
      T - input parameter value type
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Stream.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParametersWithExtension

      +
      Stream<org.hl7.fhir.r4.model.Task.ParameterComponent> getInputParametersWithExtension(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
      +
      Returns input parameters from the given task with the given coding (system, code), if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      extensionUrl - may be null
      +
      Returns:
      +
      Stream.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParametersWithExtension

      +
      Stream<org.hl7.fhir.r4.model.Task.ParameterComponent> getInputParametersWithExtension(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType, + String extensionUrl)
      +
      Returns input parameters from the given task with the given system and code, if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      extensionUrl - may be null
      +
      Returns:
      +
      Stream.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameters

      +
      Stream<org.hl7.fhir.r4.model.Task.ParameterComponent> getInputParameters(org.hl7.fhir.r4.model.Task task, + org.hl7.fhir.r4.model.Coding coding, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
      +
      Returns the input parameters from the given task with the given coding (system, code), if the value + of the input parameter has the given expectedType.
      +
      +
      Parameters:
      +
      task - may be null
      +
      coding - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Stream.empty() if the given task or coding is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      getInputParameters

      +
      Stream<org.hl7.fhir.r4.model.Task.ParameterComponent> getInputParameters(org.hl7.fhir.r4.model.Task task, + String system, + String code, + Class<? extends org.hl7.fhir.r4.model.Type> expectedType)
      +
      Returns the input parameters from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
      +
      +
      Parameters:
      +
      task - may be null
      +
      system - may be null
      +
      code - may be null
      +
      expectedType - not null
      +
      Returns:
      +
      Stream.empty() if the given task is null
      +
      Throws:
      +
      NullPointerException - if the given expectedType is null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.getType()
      • +
      • Type
      • +
      +
      +
      +
      +
    • +
    • +
      +

      createInput

      +
      org.hl7.fhir.r4.model.Task.ParameterComponent createInput(org.hl7.fhir.r4.model.Type value, + org.hl7.fhir.r4.model.Coding coding)
      +
      Creates an input parameter for the given value and coding.
      +
      +
      Parameters:
      +
      value - may be null
      +
      coding - may be null
      +
      Returns:
      +
      not null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.setType(org.hl7.fhir.r4.model.CodeableConcept)
      • +
      • Task.ParameterComponent.setValue(Type)
      • +
      +
      +
      +
      +
    • +
    • +
      +

      createInput

      +
      org.hl7.fhir.r4.model.Task.ParameterComponent createInput(org.hl7.fhir.r4.model.Type value, + String system, + String code)
      +
      Creates an input parameter for the given value, system and code.
      +
      +
      Parameters:
      +
      value - may be null
      +
      system - may be null
      +
      code - may be null
      +
      Returns:
      +
      not null
      +
      See Also:
      +
      +
        +
      • Task.ParameterComponent.setType(org.hl7.fhir.r4.model.CodeableConcept)
      • +
      • Task.ParameterComponent.setValue(Type)
      • +
      +
      +
      +
      +
    • +
    • +
      +

      createOutput

      +
      org.hl7.fhir.r4.model.Task.TaskOutputComponent createOutput(org.hl7.fhir.r4.model.Type value, + org.hl7.fhir.r4.model.Coding coding)
      +
      Creates an output parameter for the given value and coding.
      +
      +
      Parameters:
      +
      value - may be null
      +
      coding - may be null
      +
      Returns:
      +
      not null
      +
      See Also:
      +
      +
        +
      • Task.TaskOutputComponent.setType(org.hl7.fhir.r4.model.CodeableConcept)
      • +
      • Task.TaskOutputComponent.setValue(Type)
      • +
      +
      +
      +
      +
    • +
    • +
      +

      createOutput

      +
      org.hl7.fhir.r4.model.Task.TaskOutputComponent createOutput(org.hl7.fhir.r4.model.Type value, + String system, + String code)
      +
      Creates an output parameter for the given value, system and code.
      +
      +
      Parameters:
      +
      value - may be null
      +
      system - may be null
      +
      code - may be null
      +
      Returns:
      +
      not null
      +
      See Also:
      +
      +
        +
      • Task.TaskOutputComponent.setType(org.hl7.fhir.r4.model.CodeableConcept)
      • +
      • Task.TaskOutputComponent.setValue(Type)
      • +
      +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.Kem.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.Kem.html new file mode 100644 index 000000000..76b71970f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.Kem.html @@ -0,0 +1,90 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.CryptoService.Kem (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.CryptoService.Kem

+
+
Packages that use CryptoService.Kem
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.html new file mode 100644 index 000000000..99d8bd9cd --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/CryptoService.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.CryptoService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.CryptoService

+
+
Packages that use CryptoService
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/DsfClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/DsfClientProvider.html new file mode 100644 index 000000000..10b4fc6de --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/DsfClientProvider.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.DsfClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.DsfClientProvider

+
+
Packages that use DsfClientProvider
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/EndpointProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/EndpointProvider.html new file mode 100644 index 000000000..41e424a68 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/EndpointProvider.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.EndpointProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.EndpointProvider

+
+
Packages that use EndpointProvider
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/FhirClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/FhirClientProvider.html new file mode 100644 index 000000000..d0cc5028a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/FhirClientProvider.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.FhirClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.FhirClientProvider

+
+
Packages that use FhirClientProvider
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MailService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MailService.html new file mode 100644 index 000000000..8c2ee0650 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MailService.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.MailService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.MailService

+
+
Packages that use MailService
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MimetypeService.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MimetypeService.html new file mode 100644 index 000000000..08c1a4f2b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/MimetypeService.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.MimetypeService (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.MimetypeService

+
+
Packages that use MimetypeService
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OidcClientProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OidcClientProvider.html new file mode 100644 index 000000000..aaec75a92 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OidcClientProvider.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.OidcClientProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.OidcClientProvider

+
+
Packages that use OidcClientProvider
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OrganizationProvider.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OrganizationProvider.html new file mode 100644 index 000000000..253968b49 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/OrganizationProvider.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.OrganizationProvider (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.OrganizationProvider

+
+
Packages that use OrganizationProvider
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/QuestionnaireResponseHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/QuestionnaireResponseHelper.html new file mode 100644 index 000000000..2a8622c82 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/QuestionnaireResponseHelper.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.QuestionnaireResponseHelper

+
+
Packages that use QuestionnaireResponseHelper
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/ReadAccessHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/ReadAccessHelper.html new file mode 100644 index 000000000..d635773ae --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/ReadAccessHelper.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.ReadAccessHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.ReadAccessHelper

+
+
Packages that use ReadAccessHelper
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/TaskHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/TaskHelper.html new file mode 100644 index 000000000..4b372be3b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/class-use/TaskHelper.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.TaskHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.TaskHelper

+
+
Packages that use TaskHelper
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-summary.html new file mode 100644 index 000000000..954123976 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-summary.html @@ -0,0 +1,164 @@ + + + + +dev.dsf.bpe.v2.service (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.service

+
+
+
package dev.dsf.bpe.v2.service
+
+
    +
  • + +
  • +
  • +
    +
    Interfaces
    +
    +
    Class
    +
    Description
    + +
    +
    Provides methods for: + + Creating and using RSA and ECDH key encapsulation mechanism + Reading X509 certificates and private-keys (encrypted or not encrypted) + Reading JKS and PKCS12 key-stores + Creating JKS and PKCS12 key-stores based on trusted certificates or private-key and certificate chain + Generating RSA (4096 bit), EC (secp256r1, secp384r1, secp521r1, X25519, X448) key-pairs + Validating key-pairs to check if a private-key belongs to a public-key + Validating certificates + Creating SSLContexts based on a key-store with trusted certificates and/or a key-store with private-key + and certificate chain +
    +
    + +
    +
    Key encapsulation mechanism with encrypt and decrypt methods.
    +
    + +
    +
    Provides clients for DSF FHIR servers.
    +
    + +
    +
    Provides access to Endpoint resources from the DSF FHIR server.
    +
    + +
    +
    Provides connection configurations and HAPI FHIR clients for configured (non DSF) FHIR servers and DSF FHIR servers.
    +
    + +
    +
    Service for sending e-mail if a connection to an SMTP mail server is configured.
    +
    + +
     
    + +
    +
    Provides access to OidcClients implementing the Client Credentials Grant.
    +
    + +
    +
    Provides access to Organization resources from the DSF FHIR server.
    +
    + +
    +
    Methods for manipulating QuestionnaireResponse resources.
    +
    + +
    +
    Methods to configure read access for FHIR resources on a DSF FHIR server.
    +
    + +
    +
    Methods for manipulating Task resources.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-tree.html new file mode 100644 index 000000000..7785fba1e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-tree.html @@ -0,0 +1,83 @@ + + + + +dev.dsf.bpe.v2.service Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.service

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-use.html new file mode 100644 index 000000000..75c0dc1e3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/package-use.html @@ -0,0 +1,150 @@ + + + + +Uses of Package dev.dsf.bpe.v2.service (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.service

+
+
Packages that use dev.dsf.bpe.v2.service
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+
    +
  • +
    + +
    +
    Class
    +
    Description
    + +
    +
    Provides methods for: + + Creating and using RSA and ECDH key encapsulation mechanism + Reading X509 certificates and private-keys (encrypted or not encrypted) + Reading JKS and PKCS12 key-stores + Creating JKS and PKCS12 key-stores based on trusted certificates or private-key and certificate chain + Generating RSA (4096 bit), EC (secp256r1, secp384r1, secp521r1, X25519, X448) key-pairs + Validating key-pairs to check if a private-key belongs to a public-key + Validating certificates + Creating SSLContexts based on a key-store with trusted certificates and/or a key-store with private-key + and certificate chain +
    +
    + +
    +
    Provides clients for DSF FHIR servers.
    +
    + +
    +
    Provides access to Endpoint resources from the DSF FHIR server.
    +
    + +
    +
    Provides connection configurations and HAPI FHIR clients for configured (non DSF) FHIR servers and DSF FHIR servers.
    +
    + +
    +
    Service for sending e-mail if a connection to an SMTP mail server is configured.
    +
    + +
     
    + +
    +
    Provides access to OidcClients implementing the Client Credentials Grant.
    +
    + +
    +
    Provides access to Organization resources from the DSF FHIR server.
    +
    + +
    +
    Methods for manipulating QuestionnaireResponse resources.
    +
    + +
    +
    Methods to configure read access for FHIR resources on a DSF FHIR server.
    +
    + +
    +
    Methods for manipulating Task resources.
    +
    +
    +
    +
  • +
  • +
    + +
    +
    Class
    +
    Description
    + +
    +
    Key encapsulation mechanism with encrypt and decrypt methods.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Identity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Identity.html new file mode 100644 index 000000000..796c8728a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Identity.html @@ -0,0 +1,160 @@ + + + + +Identity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Identity

+
+
+
+
All Known Subinterfaces:
+
OrganizationIdentity, PractitionerIdentity
+
+
+
public interface Identity
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.Organization
    + +
     
    +
    boolean
    + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      isLocalIdentity

      +
      boolean isLocalIdentity()
      +
      +
    • +
    • +
      +

      getOrganization

      +
      org.hl7.fhir.r4.model.Organization getOrganization()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/OrganizationIdentity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/OrganizationIdentity.html new file mode 100644 index 000000000..dac1220cc --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/OrganizationIdentity.html @@ -0,0 +1,120 @@ + + + + +OrganizationIdentity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OrganizationIdentity

+
+
+
+
All Superinterfaces:
+
Identity
+
+
+
public interface OrganizationIdentity +extends Identity
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/PractitionerIdentity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/PractitionerIdentity.html new file mode 100644 index 000000000..62f98720e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/PractitionerIdentity.html @@ -0,0 +1,155 @@ + + + + +PractitionerIdentity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PractitionerIdentity

+
+
+
+
All Superinterfaces:
+
Identity
+
+
+
public interface PractitionerIdentity +extends Identity
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    Set<org.hl7.fhir.r4.model.Coding>
    + +
     
    +
    +
    +
    +
    +

    Methods inherited from interface dev.dsf.bpe.v2.service.process.Identity

    +getOrganization, isLocalIdentity
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getPractionerRoles

      +
      Set<org.hl7.fhir.r4.model.Coding> getPractionerRoles()
      +
      +
      Returns:
      +
      never null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RecipientFactory.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RecipientFactory.html new file mode 100644 index 000000000..f261da3cd --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RecipientFactory.html @@ -0,0 +1,169 @@ + + + + +ProcessAuthorizationHelper.RecipientFactory (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessAuthorizationHelper.RecipientFactory

+
+
+
+
Enclosing interface:
+
ProcessAuthorizationHelper
+
+
+
public static interface ProcessAuthorizationHelper.RecipientFactory
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RequesterFactory.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RequesterFactory.html new file mode 100644 index 000000000..3dea4d2d3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.RequesterFactory.html @@ -0,0 +1,241 @@ + + + + +ProcessAuthorizationHelper.RequesterFactory (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessAuthorizationHelper.RequesterFactory

+
+
+
+
Enclosing interface:
+
ProcessAuthorizationHelper
+
+
+
public static interface ProcessAuthorizationHelper.RequesterFactory
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      localAll

      +
      Requester localAll()
      +
      +
    • +
    • +
      +

      localAllPractitioner

      +
      Requester localAllPractitioner(String practitionerRoleSystem, + String practitionerRoleCode)
      +
      +
    • +
    • +
      +

      remoteAll

      +
      Requester remoteAll()
      +
      +
    • +
    • +
      +

      localOrganization

      +
      Requester localOrganization(String organizationIdentifier)
      +
      +
    • +
    • +
      +

      localOrganizationPractitioner

      +
      Requester localOrganizationPractitioner(String organizationIdentifier, + String practitionerRoleSystem, + String practitionerRoleCode)
      +
      +
    • +
    • +
      +

      remoteOrganization

      +
      Requester remoteOrganization(String organizationIdentifier)
      +
      +
    • +
    • +
      +

      localRole

      +
      Requester localRole(String parentOrganizationIdentifier, + String organizatioRoleSystem, + String organizatioRoleCode)
      +
      +
    • +
    • +
      +

      localRolePractitioner

      +
      Requester localRolePractitioner(String parentOrganizationIdentifier, + String organizatioRoleSystem, + String organizatioRoleCode, + String practitionerRoleSystem, + String practitionerRoleCode)
      +
      +
    • +
    • +
      +

      remoteRole

      +
      Requester remoteRole(String parentOrganizationIdentifier, + String organizatioRoleSystem, + String organizatioRoleCode)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.html new file mode 100644 index 000000000..0c7ea4917 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/ProcessAuthorizationHelper.html @@ -0,0 +1,289 @@ + + + + +ProcessAuthorizationHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProcessAuthorizationHelper

+
+
+
+
public interface ProcessAuthorizationHelper
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getRecipientFactory

      + +
      +
    • +
    • +
      +

      getRequesterFactory

      + +
      +
    • +
    • +
      +

      add

      +
      org.hl7.fhir.r4.model.ActivityDefinition add(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String messageName, + String taskProfile, + Requester requester, + Recipient recipient)
      +
      +
    • +
    • +
      +

      add

      +
      org.hl7.fhir.r4.model.ActivityDefinition add(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String messageName, + String taskProfile, + Collection<? extends Requester> requesters, + Collection<? extends Recipient> recipients)
      +
      +
    • +
    • +
      +

      isValid

      +
      boolean isValid(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + Predicate<org.hl7.fhir.r4.model.CanonicalType> profileExists, + Predicate<org.hl7.fhir.r4.model.Coding> practitionerRoleExists, + Predicate<org.hl7.fhir.r4.model.Identifier> organizationWithIdentifierExists, + Predicate<org.hl7.fhir.r4.model.Coding> organizationRoleExists)
      +
      +
    • +
    • +
      +

      getRequesters

      +
      default Stream<Requester> getRequesters(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String processUrl, + String processVersion, + String messageName, + String taskProfile)
      +
      +
    • +
    • +
      +

      getRequesters

      +
      Stream<Requester> getRequesters(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String processUrl, + String processVersion, + String messageName, + Collection<String> taskProfiles)
      +
      +
    • +
    • +
      +

      getRecipients

      +
      default Stream<Recipient> getRecipients(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String processUrl, + String processVersion, + String messageName, + String taskProfiles)
      +
      +
    • +
    • +
      +

      getRecipients

      +
      Stream<Recipient> getRecipients(org.hl7.fhir.r4.model.ActivityDefinition activityDefinition, + String processUrl, + String processVersion, + String messageName, + Collection<String> taskProfiles)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Recipient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Recipient.html new file mode 100644 index 000000000..418082bd9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Recipient.html @@ -0,0 +1,182 @@ + + + + +Recipient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Recipient

+
+
+
+
All Superinterfaces:
+
WithAuthorization
+
+
+
public interface Recipient +extends WithAuthorization
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      recipientMatches

      +
      boolean recipientMatches(org.hl7.fhir.r4.model.Extension recipientExtension)
      +
      +
    • +
    • +
      +

      isRecipientAuthorized

      +
      boolean isRecipientAuthorized(Identity recipientUser, + Stream<org.hl7.fhir.r4.model.OrganizationAffiliation> recipientAffiliations)
      +
      +
    • +
    • +
      +

      isRecipientAuthorized

      +
      default boolean isRecipientAuthorized(Identity recipientUser, + Collection<org.hl7.fhir.r4.model.OrganizationAffiliation> recipientAffiliations)
      +
      +
    • +
    • +
      +

      toRecipientExtension

      +
      org.hl7.fhir.r4.model.Extension toRecipientExtension()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Requester.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Requester.html new file mode 100644 index 000000000..55779573e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/Requester.html @@ -0,0 +1,182 @@ + + + + +Requester (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Requester

+
+
+
+
All Superinterfaces:
+
WithAuthorization
+
+
+
public interface Requester +extends WithAuthorization
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      requesterMatches

      +
      boolean requesterMatches(org.hl7.fhir.r4.model.Extension requesterExtension)
      +
      +
    • +
    • +
      +

      isRequesterAuthorized

      +
      boolean isRequesterAuthorized(Identity requesterUser, + Stream<org.hl7.fhir.r4.model.OrganizationAffiliation> requesterAffiliations)
      +
      +
    • +
    • +
      +

      isRequesterAuthorized

      +
      default boolean isRequesterAuthorized(Identity requesterUser, + Collection<org.hl7.fhir.r4.model.OrganizationAffiliation> requesterAffiliations)
      +
      +
    • +
    • +
      +

      toRequesterExtension

      +
      org.hl7.fhir.r4.model.Extension toRequesterExtension()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/WithAuthorization.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/WithAuthorization.html new file mode 100644 index 000000000..bfd9b5e41 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/WithAuthorization.html @@ -0,0 +1,156 @@ + + + + +WithAuthorization (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface WithAuthorization

+
+
+
+
All Known Subinterfaces:
+
Recipient, Requester
+
+
+
public interface WithAuthorization
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    org.hl7.fhir.r4.model.Coding
    + +
     
    +
    boolean
    +
    matches(org.hl7.fhir.r4.model.Coding processAuthorizationCode)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getProcessAuthorizationCode

      +
      org.hl7.fhir.r4.model.Coding getProcessAuthorizationCode()
      +
      +
    • +
    • +
      +

      matches

      +
      boolean matches(org.hl7.fhir.r4.model.Coding processAuthorizationCode)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Identity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Identity.html new file mode 100644 index 000000000..8971dbda3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Identity.html @@ -0,0 +1,112 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.Identity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.Identity

+
+
Packages that use Identity
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/OrganizationIdentity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/OrganizationIdentity.html new file mode 100644 index 000000000..dd8adb8cf --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/OrganizationIdentity.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.OrganizationIdentity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.OrganizationIdentity

+
+No usage of dev.dsf.bpe.v2.service.process.OrganizationIdentity
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/PractitionerIdentity.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/PractitionerIdentity.html new file mode 100644 index 000000000..3dc3b6cac --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/PractitionerIdentity.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.PractitionerIdentity (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.PractitionerIdentity

+
+No usage of dev.dsf.bpe.v2.service.process.PractitionerIdentity
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RecipientFactory.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RecipientFactory.html new file mode 100644 index 000000000..f39546f27 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RecipientFactory.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RecipientFactory (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RecipientFactory

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RequesterFactory.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RequesterFactory.html new file mode 100644 index 000000000..058b6fd3b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.RequesterFactory.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory

+
+ +
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.html new file mode 100644 index 000000000..02ea91bb6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/ProcessAuthorizationHelper.html @@ -0,0 +1,87 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper

+
+
Packages that use ProcessAuthorizationHelper
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Recipient.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Recipient.html new file mode 100644 index 000000000..b98a7670d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Recipient.html @@ -0,0 +1,128 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.Recipient (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.Recipient

+
+
Packages that use Recipient
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Requester.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Requester.html new file mode 100644 index 000000000..99e11f1eb --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/Requester.html @@ -0,0 +1,168 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.Requester (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.Requester

+
+
Packages that use Requester
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/WithAuthorization.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/WithAuthorization.html new file mode 100644 index 000000000..680602404 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/class-use/WithAuthorization.html @@ -0,0 +1,90 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.service.process.WithAuthorization (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.service.process.WithAuthorization

+
+
Packages that use WithAuthorization
+
+
Package
+
Description
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-summary.html new file mode 100644 index 000000000..8c5a32315 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-summary.html @@ -0,0 +1,123 @@ + + + + +dev.dsf.bpe.v2.service.process (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.service.process

+
+
+
package dev.dsf.bpe.v2.service.process
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-tree.html new file mode 100644 index 000000000..df6cedb0a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-tree.html @@ -0,0 +1,86 @@ + + + + +dev.dsf.bpe.v2.service.process Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.service.process

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-use.html new file mode 100644 index 000000000..b0b5b6116 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/service/process/package-use.html @@ -0,0 +1,107 @@ + + + + +Uses of Package dev.dsf.bpe.v2.service.process (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.service.process

+
+ +
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/ActivityPrototypeBeanCreator.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/ActivityPrototypeBeanCreator.html new file mode 100644 index 000000000..4feb9f83a --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/ActivityPrototypeBeanCreator.html @@ -0,0 +1,222 @@ + + + + +ActivityPrototypeBeanCreator (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class ActivityPrototypeBeanCreator

+
+
java.lang.Object +
dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator
+
+
+
+
All Implemented Interfaces:
+
org.springframework.beans.factory.config.BeanFactoryPostProcessor, org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
+
+
+
public class ActivityPrototypeBeanCreator +extends Object +implements org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
+
Helper class to register Activitys as prototype beans. Must be configured as a static + Bean inside a Configuration classes. +

+ Usage: +

+ + +

+
&#64;Configuration
+public class Config
+{
+	&#64;Bean
+	public static ActivityPrototypeBeanCreator activityPrototypeBeanCreator()
+	{
+		return new ActivityPrototypeBeanCreator(SomeServiceTask.class, AnExecutionListener.class,
+				MyMessageIntermediateThrowEvent.class);
+	}
+}
+
+
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ActivityPrototypeBeanCreator

      +
      @SafeVarargs +public ActivityPrototypeBeanCreator(Class<? extends Activity>... activities)
      +
      +
    • +
    • +
      +

      ActivityPrototypeBeanCreator

      +
      public ActivityPrototypeBeanCreator(Collection<Class<? extends Activity>> activities)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      postProcessBeanDefinitionRegistry

      +
      public void postProcessBeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry registry) + throws org.springframework.beans.BeansException
      +
      +
      Specified by:
      +
      postProcessBeanDefinitionRegistry in interface org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
      +
      Throws:
      +
      org.springframework.beans.BeansException
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/class-use/ActivityPrototypeBeanCreator.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/class-use/ActivityPrototypeBeanCreator.html new file mode 100644 index 000000000..76c30ac50 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/class-use/ActivityPrototypeBeanCreator.html @@ -0,0 +1,62 @@ + + + + +Uses of Class dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator

+
+No usage of dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-summary.html new file mode 100644 index 000000000..9554cb0cd --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-summary.html @@ -0,0 +1,109 @@ + + + + +dev.dsf.bpe.v2.spring (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.spring

+
+
+
package dev.dsf.bpe.v2.spring
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-tree.html new file mode 100644 index 000000000..8e8affcbf --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-tree.html @@ -0,0 +1,76 @@ + + + + +dev.dsf.bpe.v2.spring Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.spring

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-use.html new file mode 100644 index 000000000..cc228bbb1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/spring/package-use.html @@ -0,0 +1,62 @@ + + + + +Uses of Package dev.dsf.bpe.v2.spring (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.spring

+
+No usage of dev.dsf.bpe.v2.spring
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Target.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Target.html new file mode 100644 index 000000000..9d8463c5b --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Target.html @@ -0,0 +1,198 @@ + + + + +Target (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Target

+
+
+
+
public interface Target
+
Specifies a communication target for FHIR Task resources.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getOrganizationIdentifierValue

      +
      String getOrganizationIdentifierValue()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getEndpointIdentifierValue

      +
      String getEndpointIdentifierValue()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getEndpointUrl

      +
      String getEndpointUrl()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      getCorrelationKey

      +
      String getCorrelationKey()
      +
      +
      Returns:
      +
      may be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Targets.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Targets.html new file mode 100644 index 000000000..5ba0aac07 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Targets.html @@ -0,0 +1,232 @@ + + + + +Targets (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Targets

+
+
+
+
public interface Targets
+
Specifies a list of communication targets for FHIR Task resources.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getEntries

      +
      List<Target> getEntries()
      +
      +
      Returns:
      +
      not null
      +
      +
      +
    • +
    • +
      +

      removeByEndpointIdentifierValue

      +
      Targets removeByEndpointIdentifierValue(Target target)
      +
      Removes targets base on the given Targets endpoint identifier value.
      +
      +
      Parameters:
      +
      target -
      +
      Returns:
      +
      new Targets object
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      removeByEndpointIdentifierValue

      +
      Targets removeByEndpointIdentifierValue(String targetEndpointIdentifierValue)
      +
      Removes targets base on the given endpoint identifier value.
      +
      +
      Parameters:
      +
      targetEndpointIdentifierValue -
      +
      Returns:
      +
      new Targets object
      +
      +
      +
    • +
    • +
      +

      removeAllByEndpointIdentifierValue

      +
      Targets removeAllByEndpointIdentifierValue(Collection<String> targetEndpointIdentifierValues)
      +
      Removes targets base on the given endpoint identifier values.
      +
      +
      Parameters:
      +
      targetEndpointIdentifierValues -
      +
      Returns:
      +
      new Targets object
      +
      +
      +
    • +
    • +
      +

      isEmpty

      +
      boolean isEmpty()
      +
      +
      Returns:
      +
      true if the entries list is empty
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Variables.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Variables.html new file mode 100644 index 000000000..9d8354875 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/Variables.html @@ -0,0 +1,1921 @@ + + + + +Variables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Variables

+
+
+
+
public interface Variables
+
Gives access to process execution variables. Includes factory methods for Target and Targets values.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getBusinessKey

      +
      String getBusinessKey()
      +
      +
      Returns:
      +
      not null, business key of the current process instance
      +
      +
      +
    • +
    • +
      +

      getCurrentActivityId

      +
      String getCurrentActivityId()
      +
      +
      Returns:
      +
      not null, id of the current activity
      +
      +
      +
    • +
    • +
      +

      getProcessDefinitionId

      +
      String getProcessDefinitionId()
      +
      +
      Returns:
      +
      not null, id of the current process definition
      +
      +
      +
    • +
    • +
      +

      getActivityInstanceId

      +
      String getActivityInstanceId()
      +
      +
      Returns:
      +
      not null, id of the current activity instance
      +
      +
      +
    • +
    • +
      +

      setAlternativeBusinessKey

      +
      void setAlternativeBusinessKey(String alternativeBusinessKey)
      +
      Sets execution variable BpmnExecutionVariables.ALTERNATIVE_BUSINESS_KEY to the given + alternativeBusinessKey
      +
      +
      Parameters:
      +
      alternativeBusinessKey - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getAlternativeBusinessKey

      +
      default String getAlternativeBusinessKey()
      + +
      +
      Returns:
      +
      may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createTarget

      +
      Target createTarget(String organizationIdentifierValue, + String endpointIdentifierValue, + String endpointAddress, + String correlationKey)
      +
      Creates a new Target object. +

      + A not null correlationKey should be used if return messages i.e. Task resources + from multiple organizations with the same message-name are expected in a following multi instance message receive + task or intermediate message catch event in a multi instance subprocess.
      + Note: The correlationKey needs to be set as a BpmnExecutionVariables.CORRELATION_KEY variable in the + message receive task or intermediate message catch event of a subprocess before incoming messages i.e. Task + resources can be correlated. Within a BPMN file this can be accomplished by setting an input variable with name: + BpmnExecutionVariables.CORRELATION_KEY, type:
      string or expression, and value: + ${target.correlationKey}. +

      + A not null correlationKey should also be used when sending a message i.e. Task + resource back to an organization waiting for multiple returns.

      +
      +
      Parameters:
      +
      organizationIdentifierValue - not null
      +
      endpointIdentifierValue - not null
      +
      endpointAddress - not null
      +
      correlationKey - not null if used for sending multiple messages and multiple messages with the same + message-name are expected in return
      +
      Returns:
      +
      new Target object
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createTarget

      +
      default Target createTarget(String organizationIdentifierValue, + String endpointIdentifierValue, + String endpointAddress)
      +
      Creates a new Target object. + + See createTarget(String, String, String, String) for sending a correlation-key for 1:n or n:1 + relationships.
      +
      +
      Parameters:
      +
      organizationIdentifierValue - not null
      +
      endpointIdentifierValue - not null
      +
      endpointAddress - not null
      +
      Returns:
      +
      new Target object
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setTarget

      +
      void setTarget(Target target) + throws IllegalArgumentException
      +
      Sets execution variable BpmnExecutionVariables.TARGET
      +
      +
      Parameters:
      +
      target - may be null
      +
      Throws:
      +
      IllegalArgumentException - if the given target object is not supported, meaning the object was not created by this + Variables implementation
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getTarget

      +
      Target getTarget()
      +
      Retrieves execution variable BpmnExecutionVariables.TARGET
      +
      +
      Returns:
      +
      Execution variable BpmnExecutionVariables.TARGET, may be null
      +
      +
      +
    • +
    • +
      +

      createTargets

      +
      default Targets createTargets(Target... targets)
      +
      Creates a new target list. + + Use ${targets.entries} as a multi instance collection and target as + the element variable to loop over this list in a multi instance task or subprocess.
      +
      +
      Parameters:
      +
      targets - Target objects to incorporate into the created list
      +
      Returns:
      +
      a new target list
      +
      Throws:
      +
      IllegalArgumentException - if one of the given target objects is not supported, meaning the object was not created by + this Variables implementation
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      createTargets

      +
      Targets createTargets(List<? extends Target> targets)
      +
      Creates a new target list. + + Use ${targets.entries} as a multi instance collection and target as + the element variable to loop over this list in a multi instance task or subprocess.
      +
      +
      Parameters:
      +
      targets - Target objects to incorporate into the created list, may be null
      +
      Returns:
      +
      a new target list
      +
      Throws:
      +
      IllegalArgumentException - if one of the given target objects is not supported, meaning the object was not created by + this Variables implementation
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setTargets

      +
      void setTargets(Targets targets)
      +
      Sets execution variable BpmnExecutionVariables.TARGETS. + + Use ${targets.entries} as a multi instance collection and
      +
      +
      Parameters:
      +
      targets - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getTargets

      +
      Targets getTargets()
      +
      Retrieves execution variable BpmnExecutionVariables.TARGETS
      +
      +
      Returns:
      +
      Execution variable BpmnExecutionVariables.TARGETS, may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setFhirResourceList

      +
      void setFhirResourceList(String variableName, + List<? extends org.hl7.fhir.r4.model.Resource> resources)
      +
      Sets execution variable with the given variableName to the given FHIR Resource list
      +
      +
      Parameters:
      +
      variableName - not null
      +
      resources -
      +
      +
      +
    • +
    • +
      +

      getFhirResourceList

      +
      <R extends org.hl7.fhir.r4.model.Resource> List<R> getFhirResourceList(String variableName)
      +
      Retrieves FHIR Resource list execution variable with the given variableName
      +
      +
      Type Parameters:
      +
      R - FHIR resource type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      list of FHIR resources from execution variables for the given variableName, may be + null
      +
      +
      +
    • +
    • +
      +

      setFhirResource

      +
      void setFhirResource(String variableName, + org.hl7.fhir.r4.model.Resource resource)
      +
      Sets execution variable with the given variableName to the given FHIR Resource
      +
      +
      Parameters:
      +
      variableName - not null
      +
      resource - may be null
      +
      +
      +
    • +
    • +
      +

      getFhirResource

      +
      <R extends org.hl7.fhir.r4.model.Resource> R getFhirResource(String variableName)
      +
      Retrieves FHIR Resource execution variable with the given variableName
      +
      +
      Type Parameters:
      +
      R - FHIR resource type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      +
      +
    • +
    • +
      +

      getStartTask

      +
      org.hl7.fhir.r4.model.Task getStartTask()
      +
      Returns the Task associated with the message start event of the process.
      +
      +
      Returns:
      +
      Task that started the process instance, not null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLatestTask

      +
      org.hl7.fhir.r4.model.Task getLatestTask()
      +
      Returns the latest Task received by this process or subprocess via a intermediate message catch event or + message receive task.
      +
      +
      Returns:
      +
      Last received Task of the current process or subprocess, not null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getTasks

      +
      List<org.hl7.fhir.r4.model.Task> getTasks()
      +
      +
      Returns:
      +
      All Task resources received
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getCurrentTasks

      +
      List<org.hl7.fhir.r4.model.Task> getCurrentTasks()
      +
      +
      Returns:
      +
      All Task resources received by the current process or subprocess
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      updateTask

      +
      void updateTask(org.hl7.fhir.r4.model.Task task)
      +
      Does nothing if the given task is null. Forces an update to the Task list variable used + internally to track all received Task resources if the given task object is already part of this list.
      +
      +
      Parameters:
      +
      task - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLatestReceivedQuestionnaireResponse

      +
      org.hl7.fhir.r4.model.QuestionnaireResponse getLatestReceivedQuestionnaireResponse()
      +
      +
      Returns:
      +
      Last received QuestionnaireResponse, null if nothing received yet
      +
      +
      +
    • +
    • +
      +

      setJsonVariable

      +
      void setJsonVariable(String variableName, + Object value)
      +
      Uses ObjectMapper to serialize the given value into json. Value class needs annotations like + JsonCreator, JsonProperty and JsonGetter
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getVariable

      +
      <T> T getVariable(String variableName)
      +
      Retrieves execution variable with the given variableName
      +
      +
      Type Parameters:
      +
      T - target variable type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the returned variable can not be cast to <T>
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setInteger

      +
      void setInteger(String variableName, + Integer value)
      +
      Sets execution variable with the given variableName to the given Integer
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getInteger

      +
      default Integer getInteger(String variableName)
      +
      Retrieves Integer execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not an Integer
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setString

      +
      void setString(String variableName, + String value)
      +
      Sets execution variable with the given variableName to the given String
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getString

      +
      default String getString(String variableName)
      +
      Retrieves String execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a String
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setBoolean

      +
      void setBoolean(String variableName, + Boolean value)
      +
      Sets execution variable with the given variableName to the given Boolean
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getBoolean

      +
      default Boolean getBoolean(String variableName)
      +
      Retrieves Boolean execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Boolean
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setByteArray

      +
      void setByteArray(String variableName, + byte[] value)
      +
      Sets execution variable with the given variableName to the given byte[]
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getByteArray

      +
      default byte[] getByteArray(String variableName)
      +
      Retrieves byte[] execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a byte[]
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setDate

      +
      void setDate(String variableName, + Date value)
      +
      Sets execution variable with the given variableName to the given Date
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getDate

      +
      default Date getDate(String variableName)
      +
      Retrieves Date execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Date
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setLong

      +
      void setLong(String variableName, + Long value)
      +
      Sets execution variable with the given variableName to the given Long
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLong

      +
      default Long getLong(String variableName)
      +
      Retrieves Long execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Long
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setShort

      +
      void setShort(String variableName, + Short value)
      +
      Sets execution variable with the given variableName to the given Short
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getShort

      +
      default Short getShort(String variableName)
      +
      Retrieves Short execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Short
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setDouble

      +
      void setDouble(String variableName, + Double value)
      +
      Sets execution variable with the given variableName to the given Double
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getDouble

      +
      default Double getDouble(String variableName)
      +
      Retrieves Double execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Double
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setNumber

      +
      void setNumber(String variableName, + Number value)
      +
      Sets execution variable with the given variableName to the given Number
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getNumber

      +
      default Number getNumber(String variableName)
      +
      Retrieves Number execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Number
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setFile

      +
      void setFile(String variableName, + File value)
      +
      Sets execution variable with the given variableName to the given File
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getFile

      +
      default File getFile(String variableName)
      +
      Retrieves File execution variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a File
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setIntegerLocal

      +
      void setIntegerLocal(String variableName, + Integer value)
      +
      Sets local variable with the given variableName to the given Integer
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getIntegerLocal

      +
      default Integer getIntegerLocal(String variableName)
      +
      Retrieves Integer local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not an Integer
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setStringLocal

      +
      void setStringLocal(String variableName, + String value)
      +
      Sets local variable with the given variableName to the given String
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getStringLocal

      +
      default String getStringLocal(String variableName)
      +
      Retrieves String local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a String
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setBooleanLocal

      +
      void setBooleanLocal(String variableName, + Boolean value)
      +
      Sets local variable with the given variableName to the given Boolean
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getBooleanLocal

      +
      default Boolean getBooleanLocal(String variableName)
      +
      Retrieves Boolean local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Boolean
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setByteArrayLocal

      +
      void setByteArrayLocal(String variableName, + byte[] value)
      +
      Sets local variable with the given variableName to the given byte[]
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getByteArrayLocal

      +
      default byte[] getByteArrayLocal(String variableName)
      +
      Retrieves byte[] local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a byte[]
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setDateLocal

      +
      void setDateLocal(String variableName, + Date value)
      +
      Sets local variable with the given variableName to the given Date
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getDateLocal

      +
      default Date getDateLocal(String variableName)
      +
      Retrieves Date local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Date
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setLongLocal

      +
      void setLongLocal(String variableName, + Long value)
      +
      Sets local variable with the given variableName to the given Long
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getLongLocal

      +
      default Long getLongLocal(String variableName)
      +
      Retrieves Long local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Long
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setShortLocal

      +
      void setShortLocal(String variableName, + Short value)
      +
      Sets local variable with the given variableName to the given Short
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getShortLocal

      +
      default Short getShortLocal(String variableName)
      +
      Retrieves Short local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Short
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setDoubleLocal

      +
      void setDoubleLocal(String variableName, + Double value)
      +
      Sets local variable with the given variableName to the given Double
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getDoubleLocal

      +
      default Double getDoubleLocal(String variableName)
      +
      Retrieves Double local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Double
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setNumberLocal

      +
      void setNumberLocal(String variableName, + Number value)
      +
      Sets local variable with the given variableName to the given Number
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getNumberLocal

      +
      default Number getNumberLocal(String variableName)
      +
      Retrieves Number local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a Number
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setFileLocal

      +
      void setFileLocal(String variableName, + File value)
      +
      Sets local variable with the given variableName to the given File
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getFileLocal

      +
      default File getFileLocal(String variableName)
      +
      Retrieves File local variable with the given variableName
      +
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the stored value is not a File
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setJsonVariableLocal

      +
      void setJsonVariableLocal(String variableName, + Object value)
      +
      Uses ObjectMapper to serialize the given value into json. Value class needs annotations like + JsonCreator, JsonProperty and JsonGetter
      +
      +
      Parameters:
      +
      variableName - not null
      +
      value - may be null
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getVariableLocal

      +
      <T> T getVariableLocal(String variableName)
      +
      Retrieves local variable with the given variableName
      +
      +
      Type Parameters:
      +
      T - target variable type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from local variables for the given variableName, may be null
      +
      Throws:
      +
      ClassCastException - if the returned variable can not be cast to <T>
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      setFhirResourceListLocal

      +
      void setFhirResourceListLocal(String variableName, + List<? extends org.hl7.fhir.r4.model.Resource> resources)
      +
      Sets local variable with the given variableName to the given FHIR Resource list
      +
      +
      Parameters:
      +
      variableName - not null
      +
      resources -
      +
      +
      +
    • +
    • +
      +

      getFhirResourceListLocal

      +
      <R extends org.hl7.fhir.r4.model.Resource> List<R> getFhirResourceListLocal(String variableName)
      +
      Retrieves FHIR Resource list local variable with the given variableName
      +
      +
      Type Parameters:
      +
      R - FHIR resource type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      list of FHIR resources from execution variables for the given variableName, may be + null
      +
      +
      +
    • +
    • +
      +

      setFhirResourceLocal

      +
      void setFhirResourceLocal(String variableName, + org.hl7.fhir.r4.model.Resource resource)
      +
      Sets local variable with the given variableName to the given FHIR Resource
      +
      +
      Parameters:
      +
      variableName - not null
      +
      resource - may be null
      +
      +
      +
    • +
    • +
      +

      getFhirResourceLocal

      +
      <R extends org.hl7.fhir.r4.model.Resource> R getFhirResourceLocal(String variableName)
      +
      Retrieves FHIR Resource local variable with the given variableName
      +
      +
      Type Parameters:
      +
      R - FHIR resource type
      +
      Parameters:
      +
      variableName - not null
      +
      Returns:
      +
      value from execution variables for the given variableName, may be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Target.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Target.html new file mode 100644 index 000000000..feb04df7f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Target.html @@ -0,0 +1,239 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.variables.Target (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.variables.Target

+
+
Packages that use Target
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Targets.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Targets.html new file mode 100644 index 000000000..369008b89 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Targets.html @@ -0,0 +1,145 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.variables.Targets (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.variables.Targets

+
+
Packages that use Targets
+
+
Package
+
Description
+ +
 
+ +
 
+
+
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Variables.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Variables.html new file mode 100644 index 000000000..0fa5170c9 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/class-use/Variables.html @@ -0,0 +1,330 @@ + + + + +Uses of Interface dev.dsf.bpe.v2.variables.Variables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
dev.dsf.bpe.v2.variables.Variables

+
+
Packages that use Variables
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-summary.html new file mode 100644 index 000000000..b1dc392d3 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-summary.html @@ -0,0 +1,117 @@ + + + + +dev.dsf.bpe.v2.variables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package dev.dsf.bpe.v2.variables

+
+
+
package dev.dsf.bpe.v2.variables
+
+
    +
  • + +
  • +
  • +
    +
    Interfaces
    +
    +
    Class
    +
    Description
    + +
    +
    Specifies a communication target for FHIR Task resources.
    +
    + +
    +
    Specifies a list of communication targets for FHIR Task resources.
    +
    + +
    +
    Gives access to process execution variables.
    +
    +
    +
    +
  • +
+
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-tree.html new file mode 100644 index 000000000..9fbb25f0d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-tree.html @@ -0,0 +1,74 @@ + + + + +dev.dsf.bpe.v2.variables Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package dev.dsf.bpe.v2.variables

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-use.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-use.html new file mode 100644 index 000000000..c30142fd6 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/dev/dsf/bpe/v2/variables/package-use.html @@ -0,0 +1,162 @@ + + + + +Uses of Package dev.dsf.bpe.v2.variables (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
dev.dsf.bpe.v2.variables

+
+
Packages that use dev.dsf.bpe.v2.variables
+ +
+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/element-list b/docs/src/.vuepress/public/assets/javadoc/api-v2/element-list new file mode 100644 index 000000000..c51454811 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/element-list @@ -0,0 +1,17 @@ +dev.dsf.bpe.v2 +dev.dsf.bpe.v2.activity +dev.dsf.bpe.v2.activity.task +dev.dsf.bpe.v2.activity.values +dev.dsf.bpe.v2.client.dsf +dev.dsf.bpe.v2.client.fhir +dev.dsf.bpe.v2.client.oidc +dev.dsf.bpe.v2.config +dev.dsf.bpe.v2.constants +dev.dsf.bpe.v2.documentation +dev.dsf.bpe.v2.error +dev.dsf.bpe.v2.error.impl +dev.dsf.bpe.v2.fhir +dev.dsf.bpe.v2.service +dev.dsf.bpe.v2.service.process +dev.dsf.bpe.v2.spring +dev.dsf.bpe.v2.variables diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/help-doc.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/help-doc.html new file mode 100644 index 000000000..03e64ce43 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/help-doc.html @@ -0,0 +1,203 @@ + + + + +API Help (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+

JavaDoc Help

+ +
+
+

Navigation

+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
+
+
+

Kinds of Pages

+The following sections describe the different kinds of pages in this collection. +
+

Overview

+

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enum Classes
  • +
  • Exception Classes
  • +
  • Annotation Interfaces
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Enum Constant Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
+
+
    +
  • Enum Constant Details
  • +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
  • Element Details
  • +
+

Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Other Files

+

Packages and modules may contain pages with additional information related to the declarations nearby.

+
+
+

Use

+

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
  • +
+
+
+

Constant Field Values

+

The Constant Field Values page lists the static final fields and their values.

+
+
+

Serialized Form

+

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.

+
+
+

All Packages

+

The All Packages page contains an alphabetic index of all packages contained in the documentation.

+
+
+

All Classes and Interfaces

+

The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/index-all.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/index-all.html new file mode 100644 index 000000000..c32c20f72 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/index-all.html @@ -0,0 +1,2139 @@ + + + + +Index (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+A B C D E F G H I J L M N O P Q R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form +

A

+
+
AbstractErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
AbstractErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
AbstractFhirResourceModifier - Class in dev.dsf.bpe.v2.fhir
+
 
+
AbstractFhirResourceModifier() - Constructor for class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
AbstractMessageActivityErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
AbstractMessageActivityErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler
+
 
+
Activity - Interface in dev.dsf.bpe.v2.activity
+
 
+
ActivityPrototypeBeanCreator - Class in dev.dsf.bpe.v2.spring
+
+
Helper class to register Activitys as prototype beans.
+
+
ActivityPrototypeBeanCreator(Class<? extends Activity>...) - Constructor for class dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator
+
 
+
ActivityPrototypeBeanCreator(Collection<Class<? extends Activity>>) - Constructor for class dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator
+
 
+
add(ActivityDefinition, String, String, Requester, Recipient) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
add(ActivityDefinition, String, String, Collection<? extends Requester>, Collection<? extends Recipient>) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
addAll(R) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds All tag.
+
+
addItemLeafWithAnswer(QuestionnaireResponse, String, String, Type) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
addItemLeafWithoutAnswer(QuestionnaireResponse, String, String) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
additionalInputParameters - Variable in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
addLocal(R) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds LOCAL tag.
+
+
addOrganization(R, String) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds ORGANIZATION tag for the given organization.
+
+
addOrganization(R, Organization) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds ORGANIZATION tag for the given organization.
+
+
addRole(R, String, String, String) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds ROLE tag for the given affiliation.
+
+
addRole(R, OrganizationAffiliation) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Adds ROLE tag for the given affiliation.
+
+
afterQuestionnaireResponseCreate(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues, QuestionnaireResponse) - Method in class dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
+
Override this method to execute code after the QuestionnaireResponse resource has been created on the + DSF FHIR server
+
+
ALTERNATIVE - Enum constant in enum class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
Generates an alternative buisness-key for the current process instance and uses the alternative when sending Task + resources.
+
+
ALTERNATIVE_BUSINESS_KEY - Static variable in class dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
Value of the alternativeBusinessKey variable is used to correlated incoming Task resource to a + waiting process instance if an alternative business-key was created for a communication target.
+
+
ams() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
AMS - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
AMS_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
amsUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
api - Variable in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
+

B

+
+
BasicDsfClient - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
beforeQuestionnaireResponseCreate(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues, QuestionnaireResponse) - Method in class dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
+
Override this method to modify the QuestionnaireResponse before it will be created in state + QuestionnaireResponse.QuestionnaireResponseStatus.INPROGRESS on the DSF FHIR server
+
+
BpmnExecutionVariables - Class in dev.dsf.bpe.v2.constants
+
+
Defines names of standard process engine variables used by the bpe
+
+
BUSINESS_KEY - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
 
+
BUSINESS_KEY - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes
+
 
+
businessKey() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the businessKey record component.
+
+
businessKey() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
businessKey() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
BusinessKeyStrategies - Enum Class in dev.dsf.bpe.v2.activity.task
+
 
+
businessKeyStrategy - Variable in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
BusinessKeyStrategy - Interface in dev.dsf.bpe.v2.activity.task
+
 
+
+

C

+
+
ClientConfig - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfig.BasicAuthentication - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfig.BearerAuthentication - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfig.CertificateAuthentication - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfig.OidcAuthentication - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfig.Proxy - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
ClientConfigs - Interface in dev.dsf.bpe.v2.client.fhir
+
 
+
CodeSystems - Class in dev.dsf.bpe.v2.constants
+
+
Constants defining standard DSF CodeSystems
+
+
CodeSystems.BpmnMessage - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.BpmnMessage.Codes - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.BpmnUserTask - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.BpmnUserTask.Codes - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.OrganizationRole - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.OrganizationRole.Codes - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.PractitionerRole - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.PractitionerRole.Codes - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.ProcessAuthorization - Class in dev.dsf.bpe.v2.constants
+
 
+
CodeSystems.ProcessAuthorization.Codes - Class in dev.dsf.bpe.v2.constants
+
 
+
Configuration - Interface in dev.dsf.bpe.v2.client.oidc
+
 
+
CORRELATION_KEY - Static variable in class dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
Value of the correlationKey variable is used to correlated incoming Task resources to waiting multi + instance process activities
+
+
CORRELATION_KEY - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
 
+
correlationKey() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the correlationKey record component.
+
+
correlationKey() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
cos() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
COS - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
COS_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
cosUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
create(Resource) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
create(Resource) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
create(R) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
createBinary(InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
createBinary(InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
createBinary(InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
createConditionaly(Resource, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
createConditionaly(Resource, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
createConditionaly(R, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
createEcDhKem() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createErrorMessage(ProcessPluginApi, Variables, Exception, SendTaskValues, Function<Exception, String>) - Method in class dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler
+
 
+
createErrorMessageFromException(ProcessPluginApi, Variables, Exception) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
createInput(Type, String, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Creates an input parameter for the given value, system and code.
+
+
createInput(Type, Coding) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Creates an input parameter for the given value and coding.
+
+
createKeyPairGeneratorRsa4096AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyPairGeneratorSecp256r1AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyPairGeneratorSecp384r1AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyPairGeneratorSecp521r1AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyPairGeneratorX25519AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyPairGeneratorX448AndInitialize() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey, char[], X509Certificate...) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey, char[], Collection<? extends X509Certificate>) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyStoreForTrustedCertificates(X509Certificate...) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createKeyStoreForTrustedCertificates(Collection<? extends X509Certificate>) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createOutput(Type, String, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Creates an output parameter for the given value, system and code.
+
+
createOutput(Type, Coding) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Creates an output parameter for the given value and coding.
+
+
createQuestionnaireResponse(ProcessPluginApi, QuestionnaireResponse) - Method in class dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
 
+
CreateQuestionnaireResponseValues - Record Class in dev.dsf.bpe.v2.activity.values
+
 
+
CreateQuestionnaireResponseValues(String, String) - Constructor for record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Creates an instance of a CreateQuestionnaireResponseValues record class.
+
+
createRsaKem() - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createSSLContext(KeyStore) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createSSLContext(KeyStore, KeyStore, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
createTarget(String, String, String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Creates a new Target object.
+
+
createTarget(String, String, String, String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Creates a new Target object.
+
+
createTargets(Target...) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Creates a new target list.
+
+
createTargets(List<? extends Target>) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Creates a new target list.
+
+
createTaskAndConfig(BusinessKeyStrategy) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
createTaskErrorOutput(ProcessPluginApi, Variables, String) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
crr() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
CRR - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
CRR_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
crrUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
CryptoService - Interface in dev.dsf.bpe.v2.service
+
+
Provides methods for: + + Creating and using RSA and ECDH key encapsulation mechanism + Reading X509 certificates and private-keys (encrypted or not encrypted) + Reading JKS and PKCS12 key-stores + Creating JKS and PKCS12 key-stores based on trusted certificates or private-key and certificate chain + Generating RSA (4096 bit), EC (secp256r1, secp384r1, secp521r1, X25519, X448) key-pairs + Validating key-pairs to check if a private-key belongs to a public-key + Validating certificates + Creating SSLContexts based on a key-store with trusted certificates and/or a key-store with private-key + and certificate chain +
+
+
CryptoService.Kem - Interface in dev.dsf.bpe.v2.service
+
+
Key encapsulation mechanism with encrypt and decrypt methods.
+
+
+

D

+
+
decrypt(byte[], PrivateKey) - Method in interface dev.dsf.bpe.v2.service.CryptoService.Kem
+
 
+
decrypt(InputStream, PrivateKey) - Method in interface dev.dsf.bpe.v2.service.CryptoService.Kem
+
 
+
DEFAULT_ERROR_MESSAGE_TRANSLATOR - Static variable in class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
DefaultExecutionListenerErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultExecutionListenerErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultExecutionListenerErrorHandler
+
 
+
DefaultMessageEndEventErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultMessageEndEventErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultMessageEndEventErrorHandler
+
 
+
DefaultMessageIntermediateThrowEventErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultMessageIntermediateThrowEventErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler
+
 
+
DefaultMessageSendTaskErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultMessageSendTaskErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler
+
 
+
DefaultServiceTaskErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultServiceTaskErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultServiceTaskErrorHandler
+
 
+
DefaultTaskSender - Class in dev.dsf.bpe.v2.activity.task
+
 
+
DefaultTaskSender(ProcessPluginApi, Variables, SendTaskValues, BusinessKeyStrategy) - Constructor for class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
DefaultTaskSender(ProcessPluginApi, Variables, SendTaskValues, BusinessKeyStrategy, Function<Target, List<Task.ParameterComponent>>) - Constructor for class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
DefaultTaskSender.TaskAndConfig - Record Class in dev.dsf.bpe.v2.activity.task
+
 
+
DefaultUserTaskListener - Class in dev.dsf.bpe.v2.activity
+
+
Default UserTaskListener implementation.
+
+
DefaultUserTaskListener() - Constructor for class dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
 
+
DefaultUserTaskListenerErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
DefaultUserTaskListenerErrorHandler() - Constructor for class dev.dsf.bpe.v2.error.impl.DefaultUserTaskListenerErrorHandler
+
 
+
delete(Class<? extends Resource>, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
deleteConditionaly(Class<? extends Resource>, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
deletePermanently(Class<? extends Resource>, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
description() - Element in annotation interface dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
 
+
dev.dsf.bpe.v2 - package dev.dsf.bpe.v2
+
 
+
dev.dsf.bpe.v2.activity - package dev.dsf.bpe.v2.activity
+
 
+
dev.dsf.bpe.v2.activity.task - package dev.dsf.bpe.v2.activity.task
+
 
+
dev.dsf.bpe.v2.activity.values - package dev.dsf.bpe.v2.activity.values
+
 
+
dev.dsf.bpe.v2.client.dsf - package dev.dsf.bpe.v2.client.dsf
+
 
+
dev.dsf.bpe.v2.client.fhir - package dev.dsf.bpe.v2.client.fhir
+
 
+
dev.dsf.bpe.v2.client.oidc - package dev.dsf.bpe.v2.client.oidc
+
 
+
dev.dsf.bpe.v2.config - package dev.dsf.bpe.v2.config
+
 
+
dev.dsf.bpe.v2.constants - package dev.dsf.bpe.v2.constants
+
 
+
dev.dsf.bpe.v2.documentation - package dev.dsf.bpe.v2.documentation
+
 
+
dev.dsf.bpe.v2.error - package dev.dsf.bpe.v2.error
+
 
+
dev.dsf.bpe.v2.error.impl - package dev.dsf.bpe.v2.error.impl
+
 
+
dev.dsf.bpe.v2.fhir - package dev.dsf.bpe.v2.fhir
+
 
+
dev.dsf.bpe.v2.service - package dev.dsf.bpe.v2.service
+
 
+
dev.dsf.bpe.v2.service.process - package dev.dsf.bpe.v2.service.process
+
 
+
dev.dsf.bpe.v2.spring - package dev.dsf.bpe.v2.spring
+
 
+
dev.dsf.bpe.v2.variables - package dev.dsf.bpe.v2.variables
+
 
+
dic() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
DIC - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
DIC_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
dicUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
dms() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
DMS - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
DMS_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
dmsUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
doSend(Task, String) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
DSF_ADMIN - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
dsfAdmin() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
DsfClient - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
DsfClientProvider - Interface in dev.dsf.bpe.v2.service
+
+
Provides clients for DSF FHIR servers.
+
+
dts() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
DTS - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
DTS_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
dtsUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
+

E

+
+
encrypt(byte[], PublicKey) - Method in interface dev.dsf.bpe.v2.service.CryptoService.Kem
+
+
Encrypts the given InputStream with an AES session key calculated by KEM for the given + PublicKey.
+
+
encrypt(InputStream, PublicKey) - Method in interface dev.dsf.bpe.v2.service.CryptoService.Kem
+
+
Encrypts the given InputStream with an AES session key calculated by KEM for the given + PublicKey.
+
+
endpointIdentifierValue() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the endpointIdentifierValue record component.
+
+
EndpointProvider - Interface in dev.dsf.bpe.v2.service
+
+
Provides access to Endpoint resources from the DSF FHIR server.
+
+
endpointUrl() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the endpointUrl record component.
+
+
equals(Object) - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Indicates whether some other object is "equal to" this one.
+
+
error() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
ERROR - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
 
+
ErrorBoundaryEvent - Exception Class in dev.dsf.bpe.v2.error
+
 
+
ErrorBoundaryEvent(String, String) - Constructor for exception class dev.dsf.bpe.v2.error.ErrorBoundaryEvent
+
 
+
ErrorBoundaryEventErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
ErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
example() - Element in annotation interface dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
 
+
ExceptionErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
ExceptionToErrorBoundaryEventTranslationErrorHandler - Class in dev.dsf.bpe.v2.error.impl
+
 
+
ExceptionToErrorBoundaryEventTranslationErrorHandler(Function<Exception, String>) - Constructor for class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
ExceptionToErrorBoundaryEventTranslationErrorHandler(Function<Exception, String>, Function<Exception, String>) - Constructor for class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
execute(ProcessPluginApi, Variables) - Method in interface dev.dsf.bpe.v2.activity.ServiceTask
+
 
+
execute(ProcessPluginApi, Variables, SendTaskValues) - Method in interface dev.dsf.bpe.v2.activity.MessageActivity
+
+ +
+
ExecutionListener - Interface in dev.dsf.bpe.v2.activity
+
 
+
ExecutionListenerErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
exists(Class<R>, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
exists(Class<R>, String, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
exists(IdType) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
+

F

+
+
FhirClientProvider - Interface in dev.dsf.bpe.v2.service
+
+
Provides connection configurations and HAPI FHIR clients for configured (non DSF) FHIR servers and DSF FHIR servers.
+
+
FhirResourceModifier - Interface in dev.dsf.bpe.v2.fhir
+
+
When implementations of this interface are registered as singleton Bean, modify methods are called during + process plugin loading and before the plugin FHIR resource are stored in the DSF FHIR server.
+
+
findFirst(Optional<Endpoint>) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
 
+
findFirst(Optional<Organization>) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
 
+
findFirst(Optional<Practitioner>) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
 
+
findFirst(Optional<Task>) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
 
+
findFirst(Endpoint) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
 
+
findFirst(Organization) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
 
+
findFirst(Practitioner) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
 
+
findFirst(Task) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
 
+
FIVE_SECONDS - Static variable in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
 
+
formKey() - Method in record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Returns the value of the formKey record component.
+
+
+

G

+
+
generateSnapshot(String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
generateSnapshot(StructureDefinition) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
get(Variables, Target) - Method in interface dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy
+
 
+
getAccessToken() - Method in interface dev.dsf.bpe.v2.client.oidc.OidcClient
+
 
+
getAccessToken(Configuration, Jwks) - Method in interface dev.dsf.bpe.v2.client.oidc.OidcClient
+
 
+
getActivityInstanceId() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getAdditionalInputParameters(ProcessPluginApi, Variables, SendTaskValues, Target) - Method in interface dev.dsf.bpe.v2.activity.MessageActivity
+
 
+
getAlg() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getAlternativeBusinessKey() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+ +
+
getBaseUrl() - Method in interface dev.dsf.bpe.v2.client.dsf.DsfClient
+
 
+
getBaseUrl() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getBaseUrl() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getBasicAuthentication() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getBearerAuthentication() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getBoolean(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Boolean execution variable with the given variableName
+
+
getBooleanLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Boolean local variable with the given variableName
+
+
getBusinessKey() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getBusinessKeyStrategy() - Method in interface dev.dsf.bpe.v2.activity.MessageActivity
+
 
+
getByteArray(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves byte[] execution variable with the given variableName
+
+
getByteArrayLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves byte[] local variable with the given variableName
+
+
getCertificateAuthentication() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getClient(String) - Method in interface dev.dsf.bpe.v2.service.FhirClientProvider
+
+
HAPI FHIR client for a FHIR server configured via YAML with the given fhirServerId.
+
+ Use #local as the fhirServerId for a connection to the local DSF FHIR server.
+ Use #<value> as the fhirServerId for a connection to a DSF FHIR server with an active + Endpoint resource and the given fhirServerId as the "http://dsf.dev/sid/endpoint-identifier" + value (ignoring the # character).
+
+
getClientConfig(String) - Method in interface dev.dsf.bpe.v2.service.FhirClientProvider
+
+
FHIR client config for a FHIR server configured via YAML with the given fhirServerId.
+
+ Use #local as the fhirServerId for a connection configuration to the local DSF FHIR + server.
+ Use #<value> as the fhirServerId for a connection configuration to a DSF FHIR server with + an active Endpoint resource and the given fhirServerId as the + "http://dsf.dev/sid/endpoint-identifier" value (ignoring the # character).
+
+
getClientId() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getClientSecret() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getConfigs() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfigs
+
 
+
getConfiguration() - Method in interface dev.dsf.bpe.v2.client.oidc.OidcClient
+
 
+
getConformance() - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
getConnectTimeout() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getConnectTimeout() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getCorrelationKey() - Method in interface dev.dsf.bpe.v2.variables.Target
+
 
+
getCorrelationKey(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getCrv() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getCryptoService() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getCurrentActivityId() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getCurrentTasks() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getDate(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Date execution variable with the given variableName
+
+
getDateLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Date local variable with the given variableName
+
+
getDiscoveryPath() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getDouble(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Double execution variable with the given variableName
+
+
getDoubleLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Double local variable with the given variableName
+
+
getDsfClient(String) - Method in interface dev.dsf.bpe.v2.service.DsfClientProvider
+
 
+
getDsfClient(Endpoint) - Method in interface dev.dsf.bpe.v2.service.DsfClientProvider
+
 
+
getDsfClientProvider() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getE() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getEndpoint(String) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpoint(String, String, String) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpoint(Identifier) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpoint(Identifier, Identifier, Coding) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointAddress(String) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointAddress(String, String, String) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointAddress(Identifier) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointAddress(Identifier, Identifier, Coding) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointIdentifierValue() - Method in interface dev.dsf.bpe.v2.variables.Target
+
 
+
getEndpointIdentifierValue(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getEndpointProvider() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getEndpoints(String, String) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpoints(Identifier, Coding) - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getEndpointUrl() - Method in interface dev.dsf.bpe.v2.variables.Target
+
 
+
getEndpointUrl(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getEntries() - Method in interface dev.dsf.bpe.v2.variables.Targets
+
 
+
getErrorCode() - Method in exception class dev.dsf.bpe.v2.error.ErrorBoundaryEvent
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.Activity
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.ExecutionListener
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.MessageEndEvent
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.MessageIntermediateThrowEvent
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.MessageSendTask
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.ServiceTask
+
 
+
getErrorHandler() - Method in interface dev.dsf.bpe.v2.activity.UserTaskListener
+
 
+
getErrorMessage() - Method in exception class dev.dsf.bpe.v2.error.ErrorBoundaryEvent
+
 
+
getExceptionMessage(Exception) - Method in class dev.dsf.bpe.v2.error.impl.AbstractMessageActivityErrorHandler
+
 
+
getFhirClientProvider() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getFhirContext() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getFhirResource(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves FHIR Resource execution variable with the given variableName
+
+
getFhirResourceList(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves FHIR Resource list execution variable with the given variableName
+
+
getFhirResourceListLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves FHIR Resource list local variable with the given variableName
+
+
getFhirResourceLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves FHIR Resource local variable with the given variableName
+
+
getFhirResourcesByProcessId() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
Return Map.of("testcom_process", List.of("foo.xml")); for a foo.xml file located in the root + folder of the process plugin jar needed for a process called testcom_process.
+
+
getFhirServerId() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getFile(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves File execution variable with the given variableName
+
+
getFileLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves File local variable with the given variableName
+
+
getFirstInputParameter(Task, String, String, Class<? extends Type>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
+
+
getFirstInputParameter(Task, Coding, Class<? extends Type>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
+
+
getFirstInputParameterStringValue(Task, String, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter is of type 'string'.
+
+
getFirstInputParameterStringValue(Task, Coding) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter is of type 'string'.
+
+
getFirstInputParameterValue(Task, String, String, Class<T>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter value from the given task with the given system and code, + if the value of the input parameter has the given expectedType.
+
+
getFirstInputParameterValue(Task, Coding, Class<T>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter value from the given task with the given coding (system, code), + if the value of the input parameter has the given expectedType.
+
+
getFirstInputParameterWithExtension(Task, String, String, Class<? extends Type>, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter from the given task with the given system and code, if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
+
+
getFirstInputParameterWithExtension(Task, Coding, Class<? extends Type>, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the first input parameter from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType and the input parameter has an extension with the + given extensionUrl.
+
+
getFirstItemLeaveMatchingLinkId(QuestionnaireResponse, String) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getGrantTypesSupported() - Method in interface dev.dsf.bpe.v2.client.oidc.Configuration
+
 
+
getInputParameters(Task, String, String, Class<? extends Type>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the input parameters from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
+
+
getInputParameters(Task, Coding, Class<? extends Type>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns the input parameters from the given task with the given coding (system, code), if the value + of the input parameter has the given expectedType.
+
+
getInputParameterStringValues(Task, String, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameter values from the given task with the given system and code, if the + value of the input parameter is of type 'string'.
+
+
getInputParameterStringValues(Task, Coding) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter is of type 'string'.
+
+
getInputParametersWithExtension(Task, String, String, Class<? extends Type>, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameters from the given task with the given system and code, if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
+
+
getInputParametersWithExtension(Task, Coding, Class<? extends Type>, String) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameters from the given task with the given coding (system, code), if the value of + the input parameter has the given expectedType and the input parameter has an extension with the given + extensionUrl.
+
+
getInputParameterValues(Task, String, String, Class<T>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameter values from the given task with the given system and code, if the + value of the input parameter has the given expectedType.
+
+
getInputParameterValues(Task, Coding, Class<T>) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
+
Returns input parameter values from the given task with the given coding (system, code), if the + value of the input parameter has the given expectedType.
+
+
getInstantiatesCanonical(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getInteger(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Integer execution variable with the given variableName
+
+
getIntegerLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Integer local variable with the given variableName
+
+
getIssuer() - Method in interface dev.dsf.bpe.v2.client.oidc.Configuration
+
 
+
getItemLeavesAsList(QuestionnaireResponse) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getItemLeavesAsStream(QuestionnaireResponse) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getItemLeavesMatchingLinkIdAsList(QuestionnaireResponse, String) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getItemLeavesMatchingLinkIdAsStream(QuestionnaireResponse, String) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getJwks() - Method in interface dev.dsf.bpe.v2.client.oidc.OidcClient
+
 
+
getJwks(Configuration) - Method in interface dev.dsf.bpe.v2.client.oidc.OidcClient
+
 
+
getJwksUri() - Method in interface dev.dsf.bpe.v2.client.oidc.Configuration
+
 
+
getKey(String) - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks
+
 
+
getKeys() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks
+
 
+
getKeyStore() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.CertificateAuthentication
+
 
+
getKeyStorePassword() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.CertificateAuthentication
+
 
+
getKid() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getKty() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getLatestReceivedQuestionnaireResponse() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getLatestTask() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Returns the latest Task received by this process or subprocess via a intermediate message catch event or + message receive task.
+
+
getLocalDsfClient() - Method in interface dev.dsf.bpe.v2.service.DsfClientProvider
+
 
+
getLocalEndpoint() - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getLocalEndpointAddress() - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getLocalEndpointIdentifier() - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getLocalEndpointIdentifierValue() - Method in interface dev.dsf.bpe.v2.service.EndpointProvider
+
 
+
getLocalOrganization() - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
+
Retrieves the local Organization resources by searching for the managing Organization of the + local Endpoint resources.
+
+
getLocalOrganizationIdentifier() - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getLocalOrganizationIdentifierValue() - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getLocalVersionlessAbsoluteUrl(QuestionnaireResponse) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
getLocalVersionlessAbsoluteUrl(Task) - Method in interface dev.dsf.bpe.v2.service.TaskHelper
+
 
+
getLong(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Long execution variable with the given variableName
+
+
getLongLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Long local variable with the given variableName
+
+
getMailService() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getMessage() - Method in exception class dev.dsf.bpe.v2.error.ErrorBoundaryEvent
+
 
+
getMessageName(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getMimetypeService() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getN() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getName() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
getNoProxyUrls() - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
getNumber(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Number execution variable with the given variableName
+
+
getNumberLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Number local variable with the given variableName
+
+
getObjectMapper() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getOidcAuthentication() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getOidcClient(ClientConfig.OidcAuthentication) - Method in interface dev.dsf.bpe.v2.service.OidcClientProvider
+
 
+
getOidcClient(String, String, char[]) - Method in interface dev.dsf.bpe.v2.service.OidcClientProvider
+
 
+
getOidcClient(String, String, char[], String, Duration, Duration, KeyStore, Boolean) - Method in interface dev.dsf.bpe.v2.service.OidcClientProvider
+
 
+
getOidcClientProvider() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getOrganization() - Method in interface dev.dsf.bpe.v2.service.process.Identity
+
 
+
getOrganization(String) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getOrganization(Identifier) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getOrganizationIdentifierValue() - Method in interface dev.dsf.bpe.v2.variables.Target
+
 
+
getOrganizationIdentifierValue(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getOrganizationProvider() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getOrganizations(String) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getOrganizations(String, String) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getOrganizations(Identifier) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getOrganizations(Identifier, Coding) - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getParentOrganizations() - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getPassword() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.BasicAuthentication
+
 
+
getPassword() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.Proxy
+
 
+
getPassword() - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
getPractionerRoles() - Method in interface dev.dsf.bpe.v2.service.process.PractitionerIdentity
+
 
+
getProcessAuthorizationCode() - Method in interface dev.dsf.bpe.v2.service.process.WithAuthorization
+
 
+
getProcessAuthorizationHelper() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getProcessDefinitionId() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getProcessModels() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
Return List.of("foo.bpmn"); for a foo.bpmn file located in the root folder of the process plugin + jar.
+
+
getProfile(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getProxy() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getProxy() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getProxyConfig() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getQuestionnaireResponseHelper() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getReadAccessHelper() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getReadTimeout() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getReadTimeout() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getRecipient(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getRecipientFactory() - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getRecipients(ActivityDefinition, String, String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getRecipients(ActivityDefinition, String, String, String, Collection<String>) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getReleaseDate() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
getRemoteOrganizations() - Method in interface dev.dsf.bpe.v2.service.OrganizationProvider
+
 
+
getRequester(Target) - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getRequesterFactory() - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getRequesters(ActivityDefinition, String, String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getRequesters(ActivityDefinition, String, String, String, Collection<String>) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
getResourceReleaseDate() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
Placeholder #{date} in FHIR and BPMN files will be replaced with the returned value.
+
+
getResourceVersion() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
Placeholder #{version} in FHIR and BPMN files will be replaced with the returned value.
+
+
getShort(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Short execution variable with the given variableName
+
+
getShortLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves Short local variable with the given variableName
+
+
getSpringConfigurations() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
+
List of Configuration annotated spring configuration classes.
+
+
getStartTask() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Returns the Task associated with the message start event of the process.
+
+
getString(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves String execution variable with the given variableName
+
+
getStringLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves String local variable with the given variableName
+
+
getTarget() - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
getTarget() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves execution variable BpmnExecutionVariables.TARGET
+
+
getTargets() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves execution variable BpmnExecutionVariables.TARGETS
+
+
getTaskHelper() - Method in interface dev.dsf.bpe.v2.ProcessPluginApi
+
 
+
getTasks() - Method in interface dev.dsf.bpe.v2.variables.Variables
+
 
+
getTasks(ProcessPluginApi, Variables, Exception) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
getTaskSender(ProcessPluginApi, Variables, SendTaskValues) - Method in interface dev.dsf.bpe.v2.activity.MessageActivity
+
 
+
getToken() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.BearerAuthentication
+
 
+
getTokenEndpoint() - Method in interface dev.dsf.bpe.v2.client.oidc.Configuration
+
 
+
getTrustStore() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
getTrustStore() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
getUrl() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.Proxy
+
 
+
getUrl() - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
getUse() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getUsername() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.BasicAuthentication
+
 
+
getUsername() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.Proxy
+
 
+
getUsername() - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
getVariable(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves execution variable with the given variableName
+
+
getVariableLocal(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Retrieves local variable with the given variableName
+
+
getVersion() - Method in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
getX() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
getY() - Method in interface dev.dsf.bpe.v2.client.oidc.Jwks.JwksKey
+
 
+
+

H

+
+
handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent) - Method in interface dev.dsf.bpe.v2.error.ErrorBoundaryEventErrorHandler
+
 
+
handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
+
Logs the given ErrorBoundaryEvent and returns the event without modification.
+
+
handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent) - Method in class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
handleException(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in class dev.dsf.bpe.v2.error.impl.DefaultMessageEndEventErrorHandler
+
+
Logs the given Exception, updates all received Task resource with Task.TaskStatus.INPROGRESS + to Task.TaskStatus.FAILED and adds a Task.TaskOutputComponent of type CodeSystems.BpmnMessage.error().
+
+
handleException(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in class dev.dsf.bpe.v2.error.impl.DefaultMessageIntermediateThrowEventErrorHandler
+
+
Logs the given Exception, updates all received Task resource with Task.TaskStatus.INPROGRESS + to Task.TaskStatus.FAILED and adds a Task.TaskOutputComponent of type CodeSystems.BpmnMessage.error().
+
+
handleException(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in class dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler
+
+
Single instance message send task (Targets variables not set or empty):
+
+
handleException(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
handleException(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in interface dev.dsf.bpe.v2.error.MessageActivityErrorHandler
+
 
+
handleException(ProcessPluginApi, Variables, Exception) - Method in interface dev.dsf.bpe.v2.error.ExceptionErrorHandler
+
 
+
handleException(ProcessPluginApi, Variables, Exception) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
+
Logs the given Exception, updates all received Task resource with Task.TaskStatus.INPROGRESS + to Task.TaskStatus.FAILED and adds a Task.TaskOutputComponent of type CodeSystems.BpmnMessage.error().
+
+
handleException(ProcessPluginApi, Variables, Exception) - Method in class dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler
+
 
+
handleMultiInstance(ProcessPluginApi, Variables, SendTaskValues, Exception, Targets) - Method in class dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler
+
 
+
handleSingleInstance(ProcessPluginApi, Variables, SendTaskValues, Exception) - Method in class dev.dsf.bpe.v2.error.impl.DefaultMessageSendTaskErrorHandler
+
 
+
hasAll(Resource) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasAnyOrganization(Resource) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasAnyRole(Resource) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hashCode() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Returns a hash code value for this object.
+
+
hasLocal(Resource) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasOrganization(Resource, String) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasOrganization(Resource, Organization) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasRole(Resource, String, String, String) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasRole(Resource, List<OrganizationAffiliation>) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
hasRole(Resource, OrganizationAffiliation) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
 
+
history() - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
history(int, int) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
history(Class<? extends Resource>) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
history(Class<? extends Resource>, int, int) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
history(Class<? extends Resource>, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
history(Class<? extends Resource>, String, int, int) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
hrp() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
HRP - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
HRP_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
hrpUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
+

I

+
+
Identity - Interface in dev.dsf.bpe.v2.service.process
+
 
+
instantiatesCanonical() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the instantiatesCanonical record component.
+
+
instantiatesCanonical() - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Returns the value of the instantiatesCanonical record component.
+
+
isAms(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isAmsUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isBusinessKey(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
isBusinessKey(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
isCertificateExpired(X509Certificate) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
isClientCertificate(X509Certificate) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
isCorrelationKey(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
isCos(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isCosUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isCrr(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isCrrUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isDebugLoggingEnabled() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
isDebugLoggingEnabled() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
isDic(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isDicUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isDms(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isDmsUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isDsfAdmin(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isDts(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isDtsUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isEmpty() - Method in interface dev.dsf.bpe.v2.variables.Targets
+
 
+
isEnabled() - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
isEnabled(String) - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
 
+
isError(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
isHrp(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isHrpUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isKeyPair(PrivateKey, PublicKey) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
+
Checks if the given privateKey and publicKey match by checking if a generated signature can be + verified for RSA, EC and EdDSA key pairs or a Diffie-Hellman key agreement produces the same secret key for a XDH + key pair.
+
+
isLocalAll(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isLocalAllPractitioner(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isLocalIdentity() - Method in interface dev.dsf.bpe.v2.service.process.Identity
+
 
+
isLocalOrganization(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isLocalOrganizationPractitioner(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isLocalRole(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isLocalRolePractitioner(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isMessageName(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
isNoProxyUrl(String) - Method in interface dev.dsf.bpe.v2.config.ProxyConfig
+
+
Returns true if the given url is not null and the domain + port of the given + url is configured as a no-proxy URL based on the environment configuration.
+
+
isRecipientAuthorized(Identity, Collection<OrganizationAffiliation>) - Method in interface dev.dsf.bpe.v2.service.process.Recipient
+
 
+
isRecipientAuthorized(Identity, Stream<OrganizationAffiliation>) - Method in interface dev.dsf.bpe.v2.service.process.Recipient
+
 
+
isRemoteAll(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isRemoteOrganization(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isRemoteRole(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
isRequesterAuthorized(Identity, Collection<OrganizationAffiliation>) - Method in interface dev.dsf.bpe.v2.service.process.Requester
+
 
+
isRequesterAuthorized(Identity, Stream<OrganizationAffiliation>) - Method in interface dev.dsf.bpe.v2.service.process.Requester
+
 
+
isServerCertificate(X509Certificate) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
isStartupConnectionTestEnabled() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig
+
 
+
isStartupConnectionTestEnabled() - Method in interface dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication
+
 
+
isTtp(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isTtpUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isUac(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
isUacUser(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
isUserTaskId(Coding) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
isValid(ActivityDefinition, Predicate<CanonicalType>, Predicate<Coding>, Predicate<Identifier>, Predicate<Coding>) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper
+
 
+
isValid(Resource) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Resource with access tags valid if:
+ + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
+ or
+ 1 ALL tag
+
+ All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
+
+ Does not check if referenced organizations or roles exist
+
+
isValid(Resource, Predicate<Identifier>, Predicate<Coding>) - Method in interface dev.dsf.bpe.v2.service.ReadAccessHelper
+
+
Resource with access tags valid if:
+ + 1 LOCAL tag and n {ORGANIZATION, ROLE} tags (n >= 0)
+ or
+ 1 ALL tag
+
+ All tags {LOCAL, ORGANIZATION, ROLE, ALL} valid
+
+
+

J

+
+
Jwks - Interface in dev.dsf.bpe.v2.client.oidc
+
 
+
Jwks.JwksKey - Interface in dev.dsf.bpe.v2.client.oidc
+
 
+
+

L

+
+
LOCAL_ALL - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
LOCAL_ALL_PRACTITIONER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
LOCAL_ORGANIZATION - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
LOCAL_ORGANIZATION_PRACTITIONER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
LOCAL_ROLE - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
LOCAL_ROLE_PRACTITIONER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
localAll() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localAll() - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RecipientFactory
+
 
+
localAll() - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
localAllPractitioner() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localAllPractitioner(String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
localOrganization() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localOrganization(String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RecipientFactory
+
 
+
localOrganization(String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
localOrganizationPractitioner() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localOrganizationPractitioner(String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
localRole() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localRole(String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RecipientFactory
+
 
+
localRole(String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
localRolePractitioner() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
localRolePractitioner(String, String, String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
+

M

+
+
MailService - Interface in dev.dsf.bpe.v2.service
+
+
Service for sending e-mail if a connection to an SMTP mail server is configured.
+
+
matches(Coding) - Method in interface dev.dsf.bpe.v2.service.process.WithAuthorization
+
 
+
MESSAGE_NAME - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage.Codes
+
 
+
MessageActivity - Interface in dev.dsf.bpe.v2.activity
+
 
+
MessageActivityErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
MessageEndEvent - Interface in dev.dsf.bpe.v2.activity
+
 
+
MessageEndEventErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
MessageIntermediateThrowEvent - Interface in dev.dsf.bpe.v2.activity
+
 
+
MessageIntermediateThrowEventErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
messageName() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the messageName record component.
+
+
messageName() - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Returns the value of the messageName record component.
+
+
messageName() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
MessageSendTask - Interface in dev.dsf.bpe.v2.activity
+
 
+
MessageSendTaskErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
MimetypeService - Interface in dev.dsf.bpe.v2.service
+
 
+
modifyActivityDefinition(String, ActivityDefinition) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyActivityDefinition(String, ActivityDefinition) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyCodeSystem(String, CodeSystem) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyCodeSystem(String, CodeSystem) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyLibrary(String, Library) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyLibrary(String, Library) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyMeasure(String, Measure) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyMeasure(String, Measure) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyNamingSystem(String, NamingSystem) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyNamingSystem(String, NamingSystem) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyQuestionnaire(String, Questionnaire) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyQuestionnaire(String, Questionnaire) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyStructureDefinition(String, StructureDefinition) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyStructureDefinition(String, StructureDefinition) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyTask(String, Task) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyTask(String, Task) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
modifyValueSet(String, ValueSet) - Method in class dev.dsf.bpe.v2.fhir.AbstractFhirResourceModifier
+
 
+
modifyValueSet(String, ValueSet) - Method in interface dev.dsf.bpe.v2.fhir.FhirResourceModifier
+
 
+
+

N

+
+
NamingSystems - Class in dev.dsf.bpe.v2.constants
+
+
Constants defining standard DSF NamingSystems
+
+
NamingSystems.EndpointIdentifier - Class in dev.dsf.bpe.v2.constants
+
 
+
NamingSystems.OrganizationIdentifier - Class in dev.dsf.bpe.v2.constants
+
 
+
NamingSystems.PractitionerIdentifier - Class in dev.dsf.bpe.v2.constants
+
 
+
NamingSystems.TaskIdentifier - Class in dev.dsf.bpe.v2.constants
+
 
+
NEW - Enum constant in enum class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
Generates a new business-key for every Task send.
+
+
notify(ProcessPluginApi, Variables) - Method in interface dev.dsf.bpe.v2.activity.ExecutionListener
+
 
+
notify(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues) - Method in class dev.dsf.bpe.v2.activity.DefaultUserTaskListener
+
 
+
notify(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues) - Method in interface dev.dsf.bpe.v2.activity.UserTaskListener
+
 
+
+

O

+
+
OidcClient - Interface in dev.dsf.bpe.v2.client.oidc
+
+
Client Credentials Grant implementation to receive access tokens from an OIDC provider.
+
+
OidcClientException - Exception Class in dev.dsf.bpe.v2.client.oidc
+
 
+
OidcClientException(String) - Constructor for exception class dev.dsf.bpe.v2.client.oidc.OidcClientException
+
 
+
OidcClientException(String, Throwable) - Constructor for exception class dev.dsf.bpe.v2.client.oidc.OidcClientException
+
 
+
OidcClientProvider - Interface in dev.dsf.bpe.v2.service
+
+
Provides access to OidcClients implementing the Client Credentials Grant.
+
+
onProcessesDeployed(List<String>) - Method in interface dev.dsf.bpe.v2.ProcessPluginDeploymentListener
+
 
+
organizationIdentifierValue() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the organizationIdentifierValue record component.
+
+
OrganizationIdentity - Interface in dev.dsf.bpe.v2.service.process
+
 
+
OrganizationProvider - Interface in dev.dsf.bpe.v2.service
+
+
Provides access to Organization resources from the DSF FHIR server.
+
+
+

P

+
+
PLUGIN_VERSION_PATTERN - Static variable in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
PLUGIN_VERSION_PATTERN_STRING - Static variable in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
postBundle(Bundle) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
postBundle(Bundle) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
postBundle(Bundle) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry) - Method in class dev.dsf.bpe.v2.spring.ActivityPrototypeBeanCreator
+
 
+
PractitionerIdentity - Interface in dev.dsf.bpe.v2.service.process
+
 
+
PreferReturnMinimal - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
PreferReturnMinimalWithRetry - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
PreferReturnOutcome - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
PreferReturnOutcomeWithRetry - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
PreferReturnResource - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
ProcessAuthorizationHelper - Interface in dev.dsf.bpe.v2.service.process
+
 
+
ProcessAuthorizationHelper.RecipientFactory - Interface in dev.dsf.bpe.v2.service.process
+
 
+
ProcessAuthorizationHelper.RequesterFactory - Interface in dev.dsf.bpe.v2.service.process
+
 
+
ProcessDocumentation - Annotation Interface in dev.dsf.bpe.v2.documentation
+
+
Annotation for documenting DSF process plugin properties.
+
+
processNames() - Element in annotation interface dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
 
+
ProcessPluginApi - Interface in dev.dsf.bpe.v2
+
+
Gives access to services available to process plugins.
+
+
ProcessPluginDefinition - Interface in dev.dsf.bpe.v2
+
+
A provider configuration file named "dev.dsf.ProcessPluginDefinition" containing the canonical name of the class + implementing this interface needs to be part of the process plugin at "/META-INF/services/".
+
+
ProcessPluginDeploymentListener - Interface in dev.dsf.bpe.v2
+
+
Listener called after process plugin deployment with a list of deployed process-ids from this plugin.
+
+
profile() - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Returns the value of the profile record component.
+
+
ProxyConfig - Interface in dev.dsf.bpe.v2.config
+
 
+
+

Q

+
+
QuestionnaireResponseHelper - Interface in dev.dsf.bpe.v2.service
+
+
Methods for manipulating QuestionnaireResponse resources.
+
+
+

R

+
+
read(Class<R>, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
read(Class<R>, String, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
read(String, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
read(String, String, String) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
read(R) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
+
Uses If-None-Match and If-Modified-Since Headers based on the version and lastUpdated values in oldValue + to check if the resource has been modified.
+
+
ReadAccessHelper - Interface in dev.dsf.bpe.v2.service
+
+
Methods to configure read access for FHIR resources on a DSF FHIR server.
+
+
readBinary(String, MediaType) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
readBinary(String, String, MediaType) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
readCertificate(InputStream) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readCertificate(Path) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readCertificates(InputStream) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readCertificates(Path) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readKeyStoreJks(InputStream, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readKeyStoreJks(Path, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readKeyStorePkcs12(InputStream, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readKeyStorePkcs12(Path, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readPrivateKey(InputStream) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readPrivateKey(InputStream, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readPrivateKey(Path) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
readPrivateKey(Path, char[]) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
Recipient - Interface in dev.dsf.bpe.v2.service.process
+
 
+
recipientMatches(Extension) - Method in interface dev.dsf.bpe.v2.service.process.Recipient
+
 
+
recommendation() - Element in annotation interface dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
 
+
REMOTE_ALL - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
REMOTE_ORGANIZATION - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
REMOTE_ROLE - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization.Codes
+
 
+
remoteAll() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
remoteAll() - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
remoteOrganization() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
remoteOrganization(String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
remoteRole() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
remoteRole(String, String, String) - Method in interface dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper.RequesterFactory
+
 
+
removeAllByEndpointIdentifierValue(Collection<String>) - Method in interface dev.dsf.bpe.v2.variables.Targets
+
+
Removes targets base on the given endpoint identifier values.
+
+
removeByEndpointIdentifierValue(Target) - Method in interface dev.dsf.bpe.v2.variables.Targets
+
+
Removes targets base on the given Targets endpoint identifier value.
+
+
removeByEndpointIdentifierValue(String) - Method in interface dev.dsf.bpe.v2.variables.Targets
+
+
Removes targets base on the given endpoint identifier value.
+
+
Requester - Interface in dev.dsf.bpe.v2.service.process
+
 
+
requesterMatches(Extension) - Method in interface dev.dsf.bpe.v2.service.process.Requester
+
 
+
required() - Element in annotation interface dev.dsf.bpe.v2.documentation.ProcessDocumentation
+
 
+
RESOURCE_VERSION_PATTERN_STRING - Static variable in interface dev.dsf.bpe.v2.ProcessPluginDefinition
+
 
+
RETRY_FOREVER - Static variable in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
 
+
RETRY_ONCE - Static variable in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
 
+
RetryClient<T> - Interface in dev.dsf.bpe.v2.client.dsf
+
 
+
+

S

+
+
SAME - Enum constant in enum class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
Uses the business-key from the current process instance when sending Task resources.
+
+
search(Class<? extends Resource>, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
searchWithStrictHandling(Class<? extends Resource>, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.BasicDsfClient
+
 
+
send() - Method in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
send() - Method in interface dev.dsf.bpe.v2.activity.task.TaskSender
+
 
+
send(String, String) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends a plain text mail to the BPE wide configured recipients.
+
+
send(String, String, String) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends a plain text mail to the given address (to) if not null or the BPE wide configured + recipients.
+
+
send(String, String, Collection<String>) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends a plain text mail to the given addresses (to) if not null and not empty or the BPE wide + configured recipients.
+
+
send(String, MimeBodyPart) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients.
+
+
send(String, MimeBodyPart, String) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends the given MimeBodyPart as content of a mail to the given address (to) if not + null or the BPE wide configured recipients.
+
+
send(String, MimeBodyPart, Collection<String>) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends the given MimeBodyPart as content of a mail to the given addresses (to) if not + null and not empty or the BPE wide configured recipients.
+
+
send(String, MimeBodyPart, Consumer<MimeMessage>) - Method in interface dev.dsf.bpe.v2.service.MailService
+
+
Sends the given MimeBodyPart as content of a mail to the BPE wide configured recipients, the + messageModifier can be used to modify elements of the generated MimeMessage before it is send to + the SMTP server.
+
+
sendTaskValues - Variable in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
SendTaskValues - Record Class in dev.dsf.bpe.v2.activity.values
+
 
+
SendTaskValues(String, String, String) - Constructor for record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Creates an instance of a SendTaskValues record class.
+
+
ServiceTask - Interface in dev.dsf.bpe.v2.activity
+
 
+
ServiceTaskErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
setAlternativeBusinessKey(String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable BpmnExecutionVariables.ALTERNATIVE_BUSINESS_KEY to the given + alternativeBusinessKey
+
+
setBoolean(String, Boolean) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Boolean
+
+
setBooleanLocal(String, Boolean) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Boolean
+
+
setByteArray(String, byte[]) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given byte[]
+
+
setByteArrayLocal(String, byte[]) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given byte[]
+
+
setDate(String, Date) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Date
+
+
setDateLocal(String, Date) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Date
+
+
setDouble(String, Double) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Double
+
+
setDoubleLocal(String, Double) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Double
+
+
setFhirResource(String, Resource) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given FHIR Resource
+
+
setFhirResourceList(String, List<? extends Resource>) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given FHIR Resource list
+
+
setFhirResourceListLocal(String, List<? extends Resource>) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given FHIR Resource list
+
+
setFhirResourceLocal(String, Resource) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given FHIR Resource
+
+
setFile(String, File) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given File
+
+
setFileLocal(String, File) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given File
+
+
setInteger(String, Integer) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Integer
+
+
setIntegerLocal(String, Integer) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Integer
+
+
setJsonVariable(String, Object) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Uses ObjectMapper to serialize the given value into json.
+
+
setJsonVariableLocal(String, Object) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Uses ObjectMapper to serialize the given value into json.
+
+
setLong(String, Long) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Long
+
+
setLongLocal(String, Long) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Long
+
+
setNumber(String, Number) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Number
+
+
setNumberLocal(String, Number) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Number
+
+
setShort(String, Short) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given Short
+
+
setShortLocal(String, Short) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given Short
+
+
setString(String, String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable with the given variableName to the given String
+
+
setStringLocal(String, String) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets local variable with the given variableName to the given String
+
+
setTarget(Target) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable BpmnExecutionVariables.TARGET
+
+
setTargets(Targets) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Sets execution variable BpmnExecutionVariables.TARGETS.
+
+
SID - Static variable in class dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
 
+
SID - Static variable in class dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
 
+
SID - Static variable in class dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
 
+
SID - Static variable in class dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
 
+
SYSTEM - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
SYSTEM - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
SYSTEM - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
SYSTEM - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
SYSTEM - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
+

T

+
+
Target - Interface in dev.dsf.bpe.v2.variables
+
+
Specifies a communication target for FHIR Task resources.
+
+
TARGET - Static variable in class dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
Values from the target variable are used to configure MessageEndEvent, + MessageIntermediateThrowEvent and MessageSendTask activities for sending Task resource messages
+
+
Targets - Interface in dev.dsf.bpe.v2.variables
+
+
Specifies a list of communication targets for FHIR Task resources.
+
+
TARGETS - Static variable in class dev.dsf.bpe.v2.constants.BpmnExecutionVariables
+
+
The targets variable is typically used to iterate over Target variables in multi instance + send/receive tasks or multi instance subprocesses
+
+
task() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns the value of the task record component.
+
+
TaskAndConfig(Task, String, String, String, String, String, String, String) - Constructor for record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Creates an instance of a TaskAndConfig record class.
+
+
TaskHelper - Interface in dev.dsf.bpe.v2.service
+
+
Methods for manipulating Task resources.
+
+
TaskSender - Interface in dev.dsf.bpe.v2.activity.task
+
 
+
toRecipientExtension() - Method in interface dev.dsf.bpe.v2.service.process.Recipient
+
 
+
toRequesterExtension() - Method in interface dev.dsf.bpe.v2.service.process.Requester
+
 
+
toString() - Method in record class dev.dsf.bpe.v2.activity.task.DefaultTaskSender.TaskAndConfig
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class dev.dsf.bpe.v2.activity.values.SendTaskValues
+
+
Returns a string representation of this record class.
+
+
transformQuestionTypeToAnswerType(Questionnaire.QuestionnaireItemComponent) - Method in interface dev.dsf.bpe.v2.service.QuestionnaireResponseHelper
+
 
+
ttp() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
TTP - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
TTP_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
ttpUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
+

U

+
+
uac() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
UAC - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole.Codes
+
 
+
UAC_USER - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole.Codes
+
 
+
uacUser() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
update(Resource) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
update(Resource) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
update(R) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
updateBinary(String, InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
updateBinary(String, InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
updateBinary(String, InputStream, MediaType, String) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
updateConditionaly(Resource, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnMinimal
+
 
+
updateConditionaly(Resource, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnOutcome
+
 
+
updateConditionaly(R, Map<String, List<String>>) - Method in interface dev.dsf.bpe.v2.client.dsf.PreferReturnResource
+
 
+
updateFailedIfInprogress(ProcessPluginApi, Variables, String, List<Task>) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
updateTask(Task) - Method in interface dev.dsf.bpe.v2.variables.Variables
+
+
Does nothing if the given task is null.
+
+
updateTaskAndHandleException(ProcessPluginApi, Variables, Task) - Method in class dev.dsf.bpe.v2.error.impl.AbstractErrorHandler
+
 
+
USER_TASK_ID - Static variable in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask.Codes
+
 
+
userTaskId() - Method in record class dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues
+
+
Returns the value of the userTaskId record component.
+
+
userTaskId() - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
UserTaskListener - Interface in dev.dsf.bpe.v2.activity
+
 
+
UserTaskListenerErrorHandler - Interface in dev.dsf.bpe.v2.error
+
 
+
+

V

+
+
validate(byte[], String) - Method in interface dev.dsf.bpe.v2.service.MimetypeService
+
+
Detects the mimetype of the provided byte array and validates if the detected mimetype equals the declared + mimetype.
+
+
validate(InputStream, String) - Method in interface dev.dsf.bpe.v2.service.MimetypeService
+
+
Detects the mimetype of the provided input stream and validates if the detected mimetype equals the declared + mimetype.
+
+
validateClientCertificate(KeyStore, X509Certificate...) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
validateClientCertificate(KeyStore, Collection<? extends X509Certificate>) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
validateServerCertificate(KeyStore, X509Certificate...) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
validateServerCertificate(KeyStore, Collection<? extends X509Certificate>) - Method in interface dev.dsf.bpe.v2.service.CryptoService
+
 
+
valueOf(String) - Static method in enum class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
Returns the enum constant of this class with the specified name.
+
+
values() - Static method in enum class dev.dsf.bpe.v2.activity.task.BusinessKeyStrategies
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
variables - Variable in class dev.dsf.bpe.v2.activity.task.DefaultTaskSender
+
 
+
Variables - Interface in dev.dsf.bpe.v2.variables
+
+
Gives access to process execution variables.
+
+
+

W

+
+
WithAuthorization - Interface in dev.dsf.bpe.v2.service.process
+
 
+
withCode(String) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage
+
 
+
withCode(String) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.BpmnUserTask
+
 
+
withCode(String) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.OrganizationRole
+
 
+
withCode(String) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.PractitionerRole
+
 
+
withCode(String) - Static method in class dev.dsf.bpe.v2.constants.CodeSystems.ProcessAuthorization
+
 
+
withMinimalReturn() - Method in interface dev.dsf.bpe.v2.client.dsf.DsfClient
+
 
+
withOperationOutcomeReturn() - Method in interface dev.dsf.bpe.v2.client.dsf.DsfClient
+
 
+
withRetry() - Method in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
+
retries once after a delay of RetryClient.FIVE_SECONDS
+
+
withRetry(int) - Method in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
+
retries nTimes and waits RetryClient.FIVE_SECONDS between tries
+
+
withRetry(int, Duration) - Method in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
 
+
withRetry(Duration) - Method in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
+
retries once after the given delay
+
+
withRetryForever(Duration) - Method in interface dev.dsf.bpe.v2.client.dsf.RetryClient
+
 
+
withValue(String) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.EndpointIdentifier
+
 
+
withValue(String) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier
+
 
+
withValue(String) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.PractitionerIdentifier
+
 
+
withValue(String) - Static method in class dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier
+
 
+
+A B C D E F G H I J L M N O P Q R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/index.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/index.html new file mode 100644 index 000000000..09e534224 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/index.html @@ -0,0 +1,103 @@ + + + + +Overview (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ + +
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ADDITIONAL_LICENSE_INFO b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ADDITIONAL_LICENSE_INFO new file mode 100644 index 000000000..b62cc3ef8 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ADDITIONAL_LICENSE_INFO @@ -0,0 +1 @@ +Please see ..\java.base\ADDITIONAL_LICENSE_INFO diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ASSEMBLY_EXCEPTION b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ASSEMBLY_EXCEPTION new file mode 100644 index 000000000..0d4cfb405 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/ASSEMBLY_EXCEPTION @@ -0,0 +1 @@ +Please see ..\java.base\ASSEMBLY_EXCEPTION diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/LICENSE b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/LICENSE new file mode 100644 index 000000000..4ad9fe401 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/LICENSE @@ -0,0 +1 @@ +Please see ..\java.base\LICENSE diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jquery.md b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jquery.md new file mode 100644 index 000000000..a763ec6f1 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jquery.md @@ -0,0 +1,26 @@ +## jQuery v3.7.1 + +### jQuery License +``` +jQuery v 3.7.1 +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jqueryUI.md b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jqueryUI.md new file mode 100644 index 000000000..8bda9d7a8 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.13.2 + +### jQuery UI License +``` +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/link.svg b/docs/src/.vuepress/public/assets/javadoc/api-v2/link.svg new file mode 100644 index 000000000..7ccc5ed08 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/link.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/member-search-index.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/member-search-index.js new file mode 100644 index 000000000..032ce4aa0 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"AbstractErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"AbstractFhirResourceModifier()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractMessageActivityErrorHandler","l":"AbstractMessageActivityErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.spring","c":"ActivityPrototypeBeanCreator","l":"ActivityPrototypeBeanCreator(Class...)","u":"%3Cinit%3E(java.lang.Class...)"},{"p":"dev.dsf.bpe.v2.spring","c":"ActivityPrototypeBeanCreator","l":"ActivityPrototypeBeanCreator(Collection>)","u":"%3Cinit%3E(java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"add(ActivityDefinition, String, String, Collection, Collection)","u":"add(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,java.util.Collection,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"add(ActivityDefinition, String, String, Requester, Recipient)","u":"add(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,dev.dsf.bpe.v2.service.process.Requester,dev.dsf.bpe.v2.service.process.Recipient)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addAll(R)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"addItemLeafWithAnswer(QuestionnaireResponse, String, String, Type)","u":"addItemLeafWithAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse,java.lang.String,java.lang.String,org.hl7.fhir.r4.model.Type)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"addItemLeafWithoutAnswer(QuestionnaireResponse, String, String)","u":"addItemLeafWithoutAnswer(org.hl7.fhir.r4.model.QuestionnaireResponse,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"additionalInputParameters"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addLocal(R)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addOrganization(R, Organization)","u":"addOrganization(R,org.hl7.fhir.r4.model.Organization)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addOrganization(R, String)","u":"addOrganization(R,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addRole(R, OrganizationAffiliation)","u":"addRole(R,org.hl7.fhir.r4.model.OrganizationAffiliation)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"addRole(R, String, String, String)","u":"addRole(R,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity","c":"DefaultUserTaskListener","l":"afterQuestionnaireResponseCreate(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues, QuestionnaireResponse)","u":"afterQuestionnaireResponseCreate(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues,org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategies","l":"ALTERNATIVE"},{"p":"dev.dsf.bpe.v2.constants","c":"BpmnExecutionVariables","l":"ALTERNATIVE_BUSINESS_KEY"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"AMS"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"AMS_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"ams()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"amsUser()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"api"},{"p":"dev.dsf.bpe.v2.activity","c":"DefaultUserTaskListener","l":"beforeQuestionnaireResponseCreate(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues, QuestionnaireResponse)","u":"beforeQuestionnaireResponseCreate(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues,org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage.Codes","l":"BUSINESS_KEY"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask.Codes","l":"BUSINESS_KEY"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"businessKey()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"businessKey()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"businessKey()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"businessKeyStrategy"},{"p":"dev.dsf.bpe.v2.constants","c":"BpmnExecutionVariables","l":"CORRELATION_KEY"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage.Codes","l":"CORRELATION_KEY"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"correlationKey()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"correlationKey()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"COS"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"COS_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"cos()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"cosUser()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"create(R)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"create(Resource)","u":"create(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"create(Resource)","u":"create(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"createBinary(InputStream, MediaType, String)","u":"createBinary(java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"createBinary(InputStream, MediaType, String)","u":"createBinary(java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"createBinary(InputStream, MediaType, String)","u":"createBinary(java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"createConditionaly(R, String)","u":"createConditionaly(R,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"createConditionaly(Resource, String)","u":"createConditionaly(org.hl7.fhir.r4.model.Resource,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"createConditionaly(Resource, String)","u":"createConditionaly(org.hl7.fhir.r4.model.Resource,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createEcDhKem()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractMessageActivityErrorHandler","l":"createErrorMessage(ProcessPluginApi, Variables, Exception, SendTaskValues, Function)","u":"createErrorMessage(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.util.function.Function)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"createErrorMessageFromException(ProcessPluginApi, Variables, Exception)","u":"createErrorMessageFromException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"createInput(Type, Coding)","u":"createInput(org.hl7.fhir.r4.model.Type,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"createInput(Type, String, String)","u":"createInput(org.hl7.fhir.r4.model.Type,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorRsa4096AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorSecp256r1AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorSecp384r1AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorSecp521r1AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorX25519AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyPairGeneratorX448AndInitialize()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey, char[], Collection)","u":"createKeyStoreForPrivateKeyAndCertificateChain(java.security.PrivateKey,char[],java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyStoreForPrivateKeyAndCertificateChain(PrivateKey, char[], X509Certificate...)","u":"createKeyStoreForPrivateKeyAndCertificateChain(java.security.PrivateKey,char[],java.security.cert.X509Certificate...)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyStoreForTrustedCertificates(Collection)","u":"createKeyStoreForTrustedCertificates(java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createKeyStoreForTrustedCertificates(X509Certificate...)","u":"createKeyStoreForTrustedCertificates(java.security.cert.X509Certificate...)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"createOutput(Type, Coding)","u":"createOutput(org.hl7.fhir.r4.model.Type,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"createOutput(Type, String, String)","u":"createOutput(org.hl7.fhir.r4.model.Type,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity","c":"DefaultUserTaskListener","l":"createQuestionnaireResponse(ProcessPluginApi, QuestionnaireResponse)","u":"createQuestionnaireResponse(dev.dsf.bpe.v2.ProcessPluginApi,org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"CreateQuestionnaireResponseValues(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createRsaKem()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createSSLContext(KeyStore)","u":"createSSLContext(java.security.KeyStore)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"createSSLContext(KeyStore, KeyStore, char[])","u":"createSSLContext(java.security.KeyStore,java.security.KeyStore,char[])"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"createTarget(String, String, String)","u":"createTarget(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"createTarget(String, String, String, String)","u":"createTarget(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"createTargets(List)","u":"createTargets(java.util.List)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"createTargets(Target...)","u":"createTargets(dev.dsf.bpe.v2.variables.Target...)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"createTaskAndConfig(BusinessKeyStrategy)","u":"createTaskAndConfig(dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"createTaskErrorOutput(ProcessPluginApi, Variables, String)","u":"createTaskErrorOutput(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"CRR"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"CRR_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"crr()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"crrUser()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService.Kem","l":"decrypt(byte[], PrivateKey)","u":"decrypt(byte[],java.security.PrivateKey)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService.Kem","l":"decrypt(InputStream, PrivateKey)","u":"decrypt(java.io.InputStream,java.security.PrivateKey)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"DEFAULT_ERROR_MESSAGE_TRANSLATOR"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultExecutionListenerErrorHandler","l":"DefaultExecutionListenerErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageEndEventErrorHandler","l":"DefaultMessageEndEventErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageIntermediateThrowEventErrorHandler","l":"DefaultMessageIntermediateThrowEventErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageSendTaskErrorHandler","l":"DefaultMessageSendTaskErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultServiceTaskErrorHandler","l":"DefaultServiceTaskErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"DefaultTaskSender(ProcessPluginApi, Variables, SendTaskValues, BusinessKeyStrategy)","u":"%3Cinit%3E(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"DefaultTaskSender(ProcessPluginApi, Variables, SendTaskValues, BusinessKeyStrategy, Function>)","u":"%3Cinit%3E(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,dev.dsf.bpe.v2.activity.task.BusinessKeyStrategy,java.util.function.Function)"},{"p":"dev.dsf.bpe.v2.activity","c":"DefaultUserTaskListener","l":"DefaultUserTaskListener()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultUserTaskListenerErrorHandler","l":"DefaultUserTaskListenerErrorHandler()","u":"%3Cinit%3E()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"delete(Class, String)","u":"delete(java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"deleteConditionaly(Class, Map>)","u":"deleteConditionaly(java.lang.Class,java.util.Map)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"deletePermanently(Class, String)","u":"deletePermanently(java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.documentation","c":"ProcessDocumentation","l":"description()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"DIC"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"DIC_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"dic()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"dicUser()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"DMS"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"DMS_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"dms()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"dmsUser()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"doSend(Task, String)","u":"doSend(org.hl7.fhir.r4.model.Task,java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"DSF_ADMIN"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"dsfAdmin()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"DTS"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"DTS_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"dts()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"dtsUser()"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService.Kem","l":"encrypt(byte[], PublicKey)","u":"encrypt(byte[],java.security.PublicKey)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService.Kem","l":"encrypt(InputStream, PublicKey)","u":"encrypt(java.io.InputStream,java.security.PublicKey)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"endpointIdentifierValue()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"endpointUrl()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage.Codes","l":"ERROR"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"error()"},{"p":"dev.dsf.bpe.v2.error","c":"ErrorBoundaryEvent","l":"ErrorBoundaryEvent(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.documentation","c":"ProcessDocumentation","l":"example()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"ExceptionToErrorBoundaryEventTranslationErrorHandler(Function)","u":"%3Cinit%3E(java.util.function.Function)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"ExceptionToErrorBoundaryEventTranslationErrorHandler(Function, Function)","u":"%3Cinit%3E(java.util.function.Function,java.util.function.Function)"},{"p":"dev.dsf.bpe.v2.activity","c":"ServiceTask","l":"execute(ProcessPluginApi, Variables)","u":"execute(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables)"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageActivity","l":"execute(ProcessPluginApi, Variables, SendTaskValues)","u":"execute(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"exists(Class, String)","u":"exists(java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"exists(Class, String, String)","u":"exists(java.lang.Class,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"exists(IdType)","u":"exists(org.hl7.fhir.r4.model.IdType)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.EndpointIdentifier","l":"findFirst(Endpoint)","u":"findFirst(org.hl7.fhir.r4.model.Endpoint)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.EndpointIdentifier","l":"findFirst(Optional)","u":"findFirst(java.util.Optional)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.OrganizationIdentifier","l":"findFirst(Optional)","u":"findFirst(java.util.Optional)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.PractitionerIdentifier","l":"findFirst(Optional)","u":"findFirst(java.util.Optional)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.TaskIdentifier","l":"findFirst(Optional)","u":"findFirst(java.util.Optional)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.OrganizationIdentifier","l":"findFirst(Organization)","u":"findFirst(org.hl7.fhir.r4.model.Organization)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.PractitionerIdentifier","l":"findFirst(Practitioner)","u":"findFirst(org.hl7.fhir.r4.model.Practitioner)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.TaskIdentifier","l":"findFirst(Task)","u":"findFirst(org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"FIVE_SECONDS"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"formKey()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"generateSnapshot(String)","u":"generateSnapshot(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"generateSnapshot(StructureDefinition)","u":"generateSnapshot(org.hl7.fhir.r4.model.StructureDefinition)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategy","l":"get(Variables, Target)","u":"get(dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClient","l":"getAccessToken()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClient","l":"getAccessToken(Configuration, Jwks)","u":"getAccessToken(dev.dsf.bpe.v2.client.oidc.Configuration,dev.dsf.bpe.v2.client.oidc.Jwks)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getActivityInstanceId()"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageActivity","l":"getAdditionalInputParameters(ProcessPluginApi, Variables, SendTaskValues, Target)","u":"getAdditionalInputParameters(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getAlg()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getAlternativeBusinessKey()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"DsfClient","l":"getBaseUrl()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getBaseUrl()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getBaseUrl()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getBasicAuthentication()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getBearerAuthentication()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getBoolean(String)","u":"getBoolean(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getBooleanLocal(String)","u":"getBooleanLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getBusinessKey()"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageActivity","l":"getBusinessKeyStrategy()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getByteArray(String)","u":"getByteArray(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getByteArrayLocal(String)","u":"getByteArrayLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getCertificateAuthentication()"},{"p":"dev.dsf.bpe.v2.service","c":"FhirClientProvider","l":"getClient(String)","u":"getClient(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"FhirClientProvider","l":"getClientConfig(String)","u":"getClientConfig(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getClientId()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getClientSecret()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfigs","l":"getConfigs()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClient","l":"getConfiguration()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"getConformance()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getConnectTimeout()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getConnectTimeout()"},{"p":"dev.dsf.bpe.v2.variables","c":"Target","l":"getCorrelationKey()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getCorrelationKey(Target)","u":"getCorrelationKey(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getCrv()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getCryptoService()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getCurrentActivityId()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getCurrentTasks()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getDate(String)","u":"getDate(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getDateLocal(String)","u":"getDateLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getDiscoveryPath()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getDouble(String)","u":"getDouble(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getDoubleLocal(String)","u":"getDoubleLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"DsfClientProvider","l":"getDsfClient(Endpoint)","u":"getDsfClient(org.hl7.fhir.r4.model.Endpoint)"},{"p":"dev.dsf.bpe.v2.service","c":"DsfClientProvider","l":"getDsfClient(String)","u":"getDsfClient(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getDsfClientProvider()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getE()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoint(Identifier)","u":"getEndpoint(org.hl7.fhir.r4.model.Identifier)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoint(Identifier, Identifier, Coding)","u":"getEndpoint(org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoint(String)","u":"getEndpoint(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoint(String, String, String)","u":"getEndpoint(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpointAddress(Identifier)","u":"getEndpointAddress(org.hl7.fhir.r4.model.Identifier)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpointAddress(Identifier, Identifier, Coding)","u":"getEndpointAddress(org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpointAddress(String)","u":"getEndpointAddress(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpointAddress(String, String, String)","u":"getEndpointAddress(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Target","l":"getEndpointIdentifierValue()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getEndpointIdentifierValue(Target)","u":"getEndpointIdentifierValue(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getEndpointProvider()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoints(Identifier, Coding)","u":"getEndpoints(org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getEndpoints(String, String)","u":"getEndpoints(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Target","l":"getEndpointUrl()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getEndpointUrl(Target)","u":"getEndpointUrl(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.variables","c":"Targets","l":"getEntries()"},{"p":"dev.dsf.bpe.v2.error","c":"ErrorBoundaryEvent","l":"getErrorCode()"},{"p":"dev.dsf.bpe.v2.activity","c":"Activity","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"ExecutionListener","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageEndEvent","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageIntermediateThrowEvent","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageSendTask","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"ServiceTask","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.activity","c":"UserTaskListener","l":"getErrorHandler()"},{"p":"dev.dsf.bpe.v2.error","c":"ErrorBoundaryEvent","l":"getErrorMessage()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractMessageActivityErrorHandler","l":"getExceptionMessage(Exception)","u":"getExceptionMessage(java.lang.Exception)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getFhirClientProvider()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getFhirContext()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFhirResource(String)","u":"getFhirResource(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFhirResourceList(String)","u":"getFhirResourceList(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFhirResourceListLocal(String)","u":"getFhirResourceListLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFhirResourceLocal(String)","u":"getFhirResourceLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getFhirResourcesByProcessId()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getFhirServerId()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFile(String)","u":"getFile(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getFileLocal(String)","u":"getFileLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameter(Task, Coding, Class)","u":"getFirstInputParameter(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameter(Task, String, String, Class)","u":"getFirstInputParameter(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterStringValue(Task, Coding)","u":"getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterStringValue(Task, String, String)","u":"getFirstInputParameterStringValue(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterValue(Task, Coding, Class)","u":"getFirstInputParameterValue(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterValue(Task, String, String, Class)","u":"getFirstInputParameterValue(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterWithExtension(Task, Coding, Class, String)","u":"getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getFirstInputParameterWithExtension(Task, String, String, Class, String)","u":"getFirstInputParameterWithExtension(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getFirstItemLeaveMatchingLinkId(QuestionnaireResponse, String)","u":"getFirstItemLeaveMatchingLinkId(org.hl7.fhir.r4.model.QuestionnaireResponse,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Configuration","l":"getGrantTypesSupported()"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameters(Task, Coding, Class)","u":"getInputParameters(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameters(Task, String, String, Class)","u":"getInputParameters(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameterStringValues(Task, Coding)","u":"getInputParameterStringValues(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameterStringValues(Task, String, String)","u":"getInputParameterStringValues(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParametersWithExtension(Task, Coding, Class, String)","u":"getInputParametersWithExtension(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParametersWithExtension(Task, String, String, Class, String)","u":"getInputParametersWithExtension(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameterValues(Task, Coding, Class)","u":"getInputParameterValues(org.hl7.fhir.r4.model.Task,org.hl7.fhir.r4.model.Coding,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getInputParameterValues(Task, String, String, Class)","u":"getInputParameterValues(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.Class)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getInstantiatesCanonical(Target)","u":"getInstantiatesCanonical(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getInteger(String)","u":"getInteger(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getIntegerLocal(String)","u":"getIntegerLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Configuration","l":"getIssuer()"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getItemLeavesAsList(QuestionnaireResponse)","u":"getItemLeavesAsList(org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getItemLeavesAsStream(QuestionnaireResponse)","u":"getItemLeavesAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getItemLeavesMatchingLinkIdAsList(QuestionnaireResponse, String)","u":"getItemLeavesMatchingLinkIdAsList(org.hl7.fhir.r4.model.QuestionnaireResponse,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getItemLeavesMatchingLinkIdAsStream(QuestionnaireResponse, String)","u":"getItemLeavesMatchingLinkIdAsStream(org.hl7.fhir.r4.model.QuestionnaireResponse,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClient","l":"getJwks()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClient","l":"getJwks(Configuration)","u":"getJwks(dev.dsf.bpe.v2.client.oidc.Configuration)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Configuration","l":"getJwksUri()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks","l":"getKey(String)","u":"getKey(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks","l":"getKeys()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.CertificateAuthentication","l":"getKeyStore()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.CertificateAuthentication","l":"getKeyStorePassword()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getKid()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getKty()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getLatestReceivedQuestionnaireResponse()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getLatestTask()"},{"p":"dev.dsf.bpe.v2.service","c":"DsfClientProvider","l":"getLocalDsfClient()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getLocalEndpoint()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getLocalEndpointAddress()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getLocalEndpointIdentifier()"},{"p":"dev.dsf.bpe.v2.service","c":"EndpointProvider","l":"getLocalEndpointIdentifierValue()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getLocalOrganization()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getLocalOrganizationIdentifier()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getLocalOrganizationIdentifierValue()"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"getLocalVersionlessAbsoluteUrl(QuestionnaireResponse)","u":"getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.QuestionnaireResponse)"},{"p":"dev.dsf.bpe.v2.service","c":"TaskHelper","l":"getLocalVersionlessAbsoluteUrl(Task)","u":"getLocalVersionlessAbsoluteUrl(org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getLong(String)","u":"getLong(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getLongLocal(String)","u":"getLongLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getMailService()"},{"p":"dev.dsf.bpe.v2.error","c":"ErrorBoundaryEvent","l":"getMessage()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getMessageName(Target)","u":"getMessageName(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getMimetypeService()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getN()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getName()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"getNoProxyUrls()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getNumber(String)","u":"getNumber(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getNumberLocal(String)","u":"getNumberLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getObjectMapper()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getOidcAuthentication()"},{"p":"dev.dsf.bpe.v2.service","c":"OidcClientProvider","l":"getOidcClient(ClientConfig.OidcAuthentication)","u":"getOidcClient(dev.dsf.bpe.v2.client.fhir.ClientConfig.OidcAuthentication)"},{"p":"dev.dsf.bpe.v2.service","c":"OidcClientProvider","l":"getOidcClient(String, String, char[])","u":"getOidcClient(java.lang.String,java.lang.String,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"OidcClientProvider","l":"getOidcClient(String, String, char[], String, Duration, Duration, KeyStore, Boolean)","u":"getOidcClient(java.lang.String,java.lang.String,char[],java.lang.String,java.time.Duration,java.time.Duration,java.security.KeyStore,java.lang.Boolean)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getOidcClientProvider()"},{"p":"dev.dsf.bpe.v2.service.process","c":"Identity","l":"getOrganization()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganization(Identifier)","u":"getOrganization(org.hl7.fhir.r4.model.Identifier)"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganization(String)","u":"getOrganization(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Target","l":"getOrganizationIdentifierValue()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getOrganizationIdentifierValue(Target)","u":"getOrganizationIdentifierValue(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getOrganizationProvider()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganizations(Identifier)","u":"getOrganizations(org.hl7.fhir.r4.model.Identifier)"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganizations(Identifier, Coding)","u":"getOrganizations(org.hl7.fhir.r4.model.Identifier,org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganizations(String)","u":"getOrganizations(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getOrganizations(String, String)","u":"getOrganizations(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getParentOrganizations()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.BasicAuthentication","l":"getPassword()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.Proxy","l":"getPassword()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"getPassword()"},{"p":"dev.dsf.bpe.v2.service.process","c":"PractitionerIdentity","l":"getPractionerRoles()"},{"p":"dev.dsf.bpe.v2.service.process","c":"WithAuthorization","l":"getProcessAuthorizationCode()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getProcessAuthorizationHelper()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getProcessDefinitionId()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getProcessModels()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getProfile(Target)","u":"getProfile(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getProxy()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getProxy()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getProxyConfig()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getQuestionnaireResponseHelper()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getReadAccessHelper()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getReadTimeout()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getReadTimeout()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getRecipient(Target)","u":"getRecipient(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRecipientFactory()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRecipients(ActivityDefinition, String, String, String, Collection)","u":"getRecipients(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRecipients(ActivityDefinition, String, String, String, String)","u":"getRecipients(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getReleaseDate()"},{"p":"dev.dsf.bpe.v2.service","c":"OrganizationProvider","l":"getRemoteOrganizations()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getRequester(Target)","u":"getRequester(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRequesterFactory()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRequesters(ActivityDefinition, String, String, String, Collection)","u":"getRequesters(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"getRequesters(ActivityDefinition, String, String, String, String)","u":"getRequesters(org.hl7.fhir.r4.model.ActivityDefinition,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getResourceReleaseDate()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getResourceVersion()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getShort(String)","u":"getShort(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getShortLocal(String)","u":"getShortLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getSpringConfigurations()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getStartTask()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getString(String)","u":"getString(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getStringLocal(String)","u":"getStringLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"getTarget()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getTarget()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getTargets()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginApi","l":"getTaskHelper()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getTasks()"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"getTasks(ProcessPluginApi, Variables, Exception)","u":"getTasks(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.activity","c":"MessageActivity","l":"getTaskSender(ProcessPluginApi, Variables, SendTaskValues)","u":"getTaskSender(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.BearerAuthentication","l":"getToken()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Configuration","l":"getTokenEndpoint()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"getTrustStore()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"getTrustStore()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.Proxy","l":"getUrl()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"getUrl()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getUse()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.BasicAuthentication","l":"getUsername()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.Proxy","l":"getUsername()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"getUsername()"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getVariable(String)","u":"getVariable(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"getVariableLocal(String)","u":"getVariableLocal(java.lang.String)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"getVersion()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getX()"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"Jwks.JwksKey","l":"getY()"},{"p":"dev.dsf.bpe.v2.error","c":"ErrorBoundaryEventErrorHandler","l":"handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent)","u":"handleErrorBoundaryEvent(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.error.ErrorBoundaryEvent)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent)","u":"handleErrorBoundaryEvent(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.error.ErrorBoundaryEvent)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"handleErrorBoundaryEvent(ProcessPluginApi, Variables, ErrorBoundaryEvent)","u":"handleErrorBoundaryEvent(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.error.ErrorBoundaryEvent)"},{"p":"dev.dsf.bpe.v2.error","c":"ExceptionErrorHandler","l":"handleException(ProcessPluginApi, Variables, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"handleException(ProcessPluginApi, Variables, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"handleException(ProcessPluginApi, Variables, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageEndEventErrorHandler","l":"handleException(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageIntermediateThrowEventErrorHandler","l":"handleException(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageSendTaskErrorHandler","l":"handleException(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"ExceptionToErrorBoundaryEventTranslationErrorHandler","l":"handleException(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error","c":"MessageActivityErrorHandler","l":"handleException(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageSendTaskErrorHandler","l":"handleMultiInstance(ProcessPluginApi, Variables, SendTaskValues, Exception, Targets)","u":"handleMultiInstance(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception,dev.dsf.bpe.v2.variables.Targets)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"DefaultMessageSendTaskErrorHandler","l":"handleSingleInstance(ProcessPluginApi, Variables, SendTaskValues, Exception)","u":"handleSingleInstance(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.SendTaskValues,java.lang.Exception)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasAll(Resource)","u":"hasAll(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasAnyOrganization(Resource)","u":"hasAnyOrganization(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasAnyRole(Resource)","u":"hasAnyRole(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"hashCode()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"hashCode()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"hashCode()"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasLocal(Resource)","u":"hasLocal(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasOrganization(Resource, Organization)","u":"hasOrganization(org.hl7.fhir.r4.model.Resource,org.hl7.fhir.r4.model.Organization)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasOrganization(Resource, String)","u":"hasOrganization(org.hl7.fhir.r4.model.Resource,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasRole(Resource, List)","u":"hasRole(org.hl7.fhir.r4.model.Resource,java.util.List)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasRole(Resource, OrganizationAffiliation)","u":"hasRole(org.hl7.fhir.r4.model.Resource,org.hl7.fhir.r4.model.OrganizationAffiliation)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"hasRole(Resource, String, String, String)","u":"hasRole(org.hl7.fhir.r4.model.Resource,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history(Class)","u":"history(java.lang.Class)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history(Class, int, int)","u":"history(java.lang.Class,int,int)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history(Class, String)","u":"history(java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history(Class, String, int, int)","u":"history(java.lang.Class,java.lang.String,int,int)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"history(int, int)","u":"history(int,int)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"HRP"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"HRP_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"hrp()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"hrpUser()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"instantiatesCanonical()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"instantiatesCanonical()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isAms(Coding)","u":"isAms(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isAmsUser(Coding)","u":"isAmsUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"isBusinessKey(Coding)","u":"isBusinessKey(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"isBusinessKey(Coding)","u":"isBusinessKey(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"isCertificateExpired(X509Certificate)","u":"isCertificateExpired(java.security.cert.X509Certificate)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"isClientCertificate(X509Certificate)","u":"isClientCertificate(java.security.cert.X509Certificate)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"isCorrelationKey(Coding)","u":"isCorrelationKey(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isCos(Coding)","u":"isCos(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isCosUser(Coding)","u":"isCosUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isCrr(Coding)","u":"isCrr(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isCrrUser(Coding)","u":"isCrrUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"isDebugLoggingEnabled()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"isDebugLoggingEnabled()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isDic(Coding)","u":"isDic(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isDicUser(Coding)","u":"isDicUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isDms(Coding)","u":"isDms(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isDmsUser(Coding)","u":"isDmsUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isDsfAdmin(Coding)","u":"isDsfAdmin(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isDts(Coding)","u":"isDts(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isDtsUser(Coding)","u":"isDtsUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.variables","c":"Targets","l":"isEmpty()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"isEnabled()"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"isEnabled(String)","u":"isEnabled(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"isError(Coding)","u":"isError(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isHrp(Coding)","u":"isHrp(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isHrpUser(Coding)","u":"isHrpUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"isKeyPair(PrivateKey, PublicKey)","u":"isKeyPair(java.security.PrivateKey,java.security.PublicKey)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalAll(Coding)","u":"isLocalAll(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalAllPractitioner(Coding)","u":"isLocalAllPractitioner(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Identity","l":"isLocalIdentity()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalOrganization(Coding)","u":"isLocalOrganization(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalOrganizationPractitioner(Coding)","u":"isLocalOrganizationPractitioner(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalRole(Coding)","u":"isLocalRole(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isLocalRolePractitioner(Coding)","u":"isLocalRolePractitioner(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"isMessageName(Coding)","u":"isMessageName(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.config","c":"ProxyConfig","l":"isNoProxyUrl(String)","u":"isNoProxyUrl(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Recipient","l":"isRecipientAuthorized(Identity, Collection)","u":"isRecipientAuthorized(dev.dsf.bpe.v2.service.process.Identity,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Recipient","l":"isRecipientAuthorized(Identity, Stream)","u":"isRecipientAuthorized(dev.dsf.bpe.v2.service.process.Identity,java.util.stream.Stream)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isRemoteAll(Coding)","u":"isRemoteAll(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isRemoteOrganization(Coding)","u":"isRemoteOrganization(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"isRemoteRole(Coding)","u":"isRemoteRole(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Requester","l":"isRequesterAuthorized(Identity, Collection)","u":"isRequesterAuthorized(dev.dsf.bpe.v2.service.process.Identity,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Requester","l":"isRequesterAuthorized(Identity, Stream)","u":"isRequesterAuthorized(dev.dsf.bpe.v2.service.process.Identity,java.util.stream.Stream)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"isServerCertificate(X509Certificate)","u":"isServerCertificate(java.security.cert.X509Certificate)"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig","l":"isStartupConnectionTestEnabled()"},{"p":"dev.dsf.bpe.v2.client.fhir","c":"ClientConfig.OidcAuthentication","l":"isStartupConnectionTestEnabled()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isTtp(Coding)","u":"isTtp(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isTtpUser(Coding)","u":"isTtpUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"isUac(Coding)","u":"isUac(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"isUacUser(Coding)","u":"isUacUser(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"isUserTaskId(Coding)","u":"isUserTaskId(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper","l":"isValid(ActivityDefinition, Predicate, Predicate, Predicate, Predicate)","u":"isValid(org.hl7.fhir.r4.model.ActivityDefinition,java.util.function.Predicate,java.util.function.Predicate,java.util.function.Predicate,java.util.function.Predicate)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"isValid(Resource)","u":"isValid(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.service","c":"ReadAccessHelper","l":"isValid(Resource, Predicate, Predicate)","u":"isValid(org.hl7.fhir.r4.model.Resource,java.util.function.Predicate,java.util.function.Predicate)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ALL"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ALL_PRACTITIONER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ORGANIZATION"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ORGANIZATION_PRACTITIONER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ROLE"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"LOCAL_ROLE_PRACTITIONER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localAll()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RecipientFactory","l":"localAll()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localAll()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localAllPractitioner()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localAllPractitioner(String, String)","u":"localAllPractitioner(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localOrganization()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RecipientFactory","l":"localOrganization(String)","u":"localOrganization(java.lang.String)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localOrganization(String)","u":"localOrganization(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localOrganizationPractitioner()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localOrganizationPractitioner(String, String, String)","u":"localOrganizationPractitioner(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localRole()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RecipientFactory","l":"localRole(String, String, String)","u":"localRole(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localRole(String, String, String)","u":"localRole(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"localRolePractitioner()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"localRolePractitioner(String, String, String, String, String)","u":"localRolePractitioner(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service.process","c":"WithAuthorization","l":"matches(Coding)","u":"matches(org.hl7.fhir.r4.model.Coding)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage.Codes","l":"MESSAGE_NAME"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"messageName()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"messageName()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"messageName()"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyActivityDefinition(String, ActivityDefinition)","u":"modifyActivityDefinition(java.lang.String,org.hl7.fhir.r4.model.ActivityDefinition)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyActivityDefinition(String, ActivityDefinition)","u":"modifyActivityDefinition(java.lang.String,org.hl7.fhir.r4.model.ActivityDefinition)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyCodeSystem(String, CodeSystem)","u":"modifyCodeSystem(java.lang.String,org.hl7.fhir.r4.model.CodeSystem)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyCodeSystem(String, CodeSystem)","u":"modifyCodeSystem(java.lang.String,org.hl7.fhir.r4.model.CodeSystem)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyLibrary(String, Library)","u":"modifyLibrary(java.lang.String,org.hl7.fhir.r4.model.Library)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyLibrary(String, Library)","u":"modifyLibrary(java.lang.String,org.hl7.fhir.r4.model.Library)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyMeasure(String, Measure)","u":"modifyMeasure(java.lang.String,org.hl7.fhir.r4.model.Measure)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyMeasure(String, Measure)","u":"modifyMeasure(java.lang.String,org.hl7.fhir.r4.model.Measure)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyNamingSystem(String, NamingSystem)","u":"modifyNamingSystem(java.lang.String,org.hl7.fhir.r4.model.NamingSystem)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyNamingSystem(String, NamingSystem)","u":"modifyNamingSystem(java.lang.String,org.hl7.fhir.r4.model.NamingSystem)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyQuestionnaire(String, Questionnaire)","u":"modifyQuestionnaire(java.lang.String,org.hl7.fhir.r4.model.Questionnaire)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyQuestionnaire(String, Questionnaire)","u":"modifyQuestionnaire(java.lang.String,org.hl7.fhir.r4.model.Questionnaire)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyStructureDefinition(String, StructureDefinition)","u":"modifyStructureDefinition(java.lang.String,org.hl7.fhir.r4.model.StructureDefinition)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyStructureDefinition(String, StructureDefinition)","u":"modifyStructureDefinition(java.lang.String,org.hl7.fhir.r4.model.StructureDefinition)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyTask(String, Task)","u":"modifyTask(java.lang.String,org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyTask(String, Task)","u":"modifyTask(java.lang.String,org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.fhir","c":"AbstractFhirResourceModifier","l":"modifyValueSet(String, ValueSet)","u":"modifyValueSet(java.lang.String,org.hl7.fhir.r4.model.ValueSet)"},{"p":"dev.dsf.bpe.v2.fhir","c":"FhirResourceModifier","l":"modifyValueSet(String, ValueSet)","u":"modifyValueSet(java.lang.String,org.hl7.fhir.r4.model.ValueSet)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategies","l":"NEW"},{"p":"dev.dsf.bpe.v2.activity","c":"ExecutionListener","l":"notify(ProcessPluginApi, Variables)","u":"notify(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables)"},{"p":"dev.dsf.bpe.v2.activity","c":"DefaultUserTaskListener","l":"notify(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues)","u":"notify(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues)"},{"p":"dev.dsf.bpe.v2.activity","c":"UserTaskListener","l":"notify(ProcessPluginApi, Variables, CreateQuestionnaireResponseValues)","u":"notify(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,dev.dsf.bpe.v2.activity.values.CreateQuestionnaireResponseValues)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClientException","l":"OidcClientException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.oidc","c":"OidcClientException","l":"OidcClientException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDeploymentListener","l":"onProcessesDeployed(List)","u":"onProcessesDeployed(java.util.List)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"organizationIdentifierValue()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"PLUGIN_VERSION_PATTERN"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"PLUGIN_VERSION_PATTERN_STRING"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"postBundle(Bundle)","u":"postBundle(org.hl7.fhir.r4.model.Bundle)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"postBundle(Bundle)","u":"postBundle(org.hl7.fhir.r4.model.Bundle)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"postBundle(Bundle)","u":"postBundle(org.hl7.fhir.r4.model.Bundle)"},{"p":"dev.dsf.bpe.v2.spring","c":"ActivityPrototypeBeanCreator","l":"postProcessBeanDefinitionRegistry(BeanDefinitionRegistry)","u":"postProcessBeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry)"},{"p":"dev.dsf.bpe.v2.documentation","c":"ProcessDocumentation","l":"processNames()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"profile()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"read(Class, String)","u":"read(java.lang.Class,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"read(Class, String, String)","u":"read(java.lang.Class,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"read(R)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"read(String, String)","u":"read(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"read(String, String, String)","u":"read(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"readBinary(String, MediaType)","u":"readBinary(java.lang.String,jakarta.ws.rs.core.MediaType)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"readBinary(String, String, MediaType)","u":"readBinary(java.lang.String,java.lang.String,jakarta.ws.rs.core.MediaType)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readCertificate(InputStream)","u":"readCertificate(java.io.InputStream)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readCertificate(Path)","u":"readCertificate(java.nio.file.Path)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readCertificates(InputStream)","u":"readCertificates(java.io.InputStream)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readCertificates(Path)","u":"readCertificates(java.nio.file.Path)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readKeyStoreJks(InputStream, char[])","u":"readKeyStoreJks(java.io.InputStream,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readKeyStoreJks(Path, char[])","u":"readKeyStoreJks(java.nio.file.Path,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readKeyStorePkcs12(InputStream, char[])","u":"readKeyStorePkcs12(java.io.InputStream,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readKeyStorePkcs12(Path, char[])","u":"readKeyStorePkcs12(java.nio.file.Path,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readPrivateKey(InputStream)","u":"readPrivateKey(java.io.InputStream)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readPrivateKey(InputStream, char[])","u":"readPrivateKey(java.io.InputStream,char[])"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readPrivateKey(Path)","u":"readPrivateKey(java.nio.file.Path)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"readPrivateKey(Path, char[])","u":"readPrivateKey(java.nio.file.Path,char[])"},{"p":"dev.dsf.bpe.v2.service.process","c":"Recipient","l":"recipientMatches(Extension)","u":"recipientMatches(org.hl7.fhir.r4.model.Extension)"},{"p":"dev.dsf.bpe.v2.documentation","c":"ProcessDocumentation","l":"recommendation()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"REMOTE_ALL"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"REMOTE_ORGANIZATION"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization.Codes","l":"REMOTE_ROLE"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"remoteAll()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"remoteAll()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"remoteOrganization()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"remoteOrganization(String)","u":"remoteOrganization(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"remoteRole()"},{"p":"dev.dsf.bpe.v2.service.process","c":"ProcessAuthorizationHelper.RequesterFactory","l":"remoteRole(String, String, String)","u":"remoteRole(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Targets","l":"removeAllByEndpointIdentifierValue(Collection)","u":"removeAllByEndpointIdentifierValue(java.util.Collection)"},{"p":"dev.dsf.bpe.v2.variables","c":"Targets","l":"removeByEndpointIdentifierValue(String)","u":"removeByEndpointIdentifierValue(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Targets","l":"removeByEndpointIdentifierValue(Target)","u":"removeByEndpointIdentifierValue(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Requester","l":"requesterMatches(Extension)","u":"requesterMatches(org.hl7.fhir.r4.model.Extension)"},{"p":"dev.dsf.bpe.v2.documentation","c":"ProcessDocumentation","l":"required()"},{"p":"dev.dsf.bpe.v2","c":"ProcessPluginDefinition","l":"RESOURCE_VERSION_PATTERN_STRING"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"RETRY_FOREVER"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"RETRY_ONCE"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategies","l":"SAME"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"search(Class, Map>)","u":"search(java.lang.Class,java.util.Map)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"BasicDsfClient","l":"searchWithStrictHandling(Class, Map>)","u":"searchWithStrictHandling(java.lang.Class,java.util.Map)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"send()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"TaskSender","l":"send()"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, MimeBodyPart)","u":"send(java.lang.String,javax.mail.internet.MimeBodyPart)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, MimeBodyPart, Collection)","u":"send(java.lang.String,javax.mail.internet.MimeBodyPart,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, MimeBodyPart, Consumer)","u":"send(java.lang.String,javax.mail.internet.MimeBodyPart,java.util.function.Consumer)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, MimeBodyPart, String)","u":"send(java.lang.String,javax.mail.internet.MimeBodyPart,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, String)","u":"send(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, String, Collection)","u":"send(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"MailService","l":"send(String, String, String)","u":"send(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"sendTaskValues"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"SendTaskValues(String, String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setAlternativeBusinessKey(String)","u":"setAlternativeBusinessKey(java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setBoolean(String, Boolean)","u":"setBoolean(java.lang.String,java.lang.Boolean)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setBooleanLocal(String, Boolean)","u":"setBooleanLocal(java.lang.String,java.lang.Boolean)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setByteArray(String, byte[])","u":"setByteArray(java.lang.String,byte[])"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setByteArrayLocal(String, byte[])","u":"setByteArrayLocal(java.lang.String,byte[])"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setDate(String, Date)","u":"setDate(java.lang.String,java.util.Date)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setDateLocal(String, Date)","u":"setDateLocal(java.lang.String,java.util.Date)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setDouble(String, Double)","u":"setDouble(java.lang.String,java.lang.Double)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setDoubleLocal(String, Double)","u":"setDoubleLocal(java.lang.String,java.lang.Double)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFhirResource(String, Resource)","u":"setFhirResource(java.lang.String,org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFhirResourceList(String, List)","u":"setFhirResourceList(java.lang.String,java.util.List)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFhirResourceListLocal(String, List)","u":"setFhirResourceListLocal(java.lang.String,java.util.List)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFhirResourceLocal(String, Resource)","u":"setFhirResourceLocal(java.lang.String,org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFile(String, File)","u":"setFile(java.lang.String,java.io.File)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setFileLocal(String, File)","u":"setFileLocal(java.lang.String,java.io.File)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setInteger(String, Integer)","u":"setInteger(java.lang.String,java.lang.Integer)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setIntegerLocal(String, Integer)","u":"setIntegerLocal(java.lang.String,java.lang.Integer)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setJsonVariable(String, Object)","u":"setJsonVariable(java.lang.String,java.lang.Object)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setJsonVariableLocal(String, Object)","u":"setJsonVariableLocal(java.lang.String,java.lang.Object)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setLong(String, Long)","u":"setLong(java.lang.String,java.lang.Long)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setLongLocal(String, Long)","u":"setLongLocal(java.lang.String,java.lang.Long)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setNumber(String, Number)","u":"setNumber(java.lang.String,java.lang.Number)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setNumberLocal(String, Number)","u":"setNumberLocal(java.lang.String,java.lang.Number)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setShort(String, Short)","u":"setShort(java.lang.String,java.lang.Short)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setShortLocal(String, Short)","u":"setShortLocal(java.lang.String,java.lang.Short)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setString(String, String)","u":"setString(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setStringLocal(String, String)","u":"setStringLocal(java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setTarget(Target)","u":"setTarget(dev.dsf.bpe.v2.variables.Target)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"setTargets(Targets)","u":"setTargets(dev.dsf.bpe.v2.variables.Targets)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.EndpointIdentifier","l":"SID"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.OrganizationIdentifier","l":"SID"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.PractitionerIdentifier","l":"SID"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.TaskIdentifier","l":"SID"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"SYSTEM"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"SYSTEM"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"SYSTEM"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"SYSTEM"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"SYSTEM"},{"p":"dev.dsf.bpe.v2.constants","c":"BpmnExecutionVariables","l":"TARGET"},{"p":"dev.dsf.bpe.v2.constants","c":"BpmnExecutionVariables","l":"TARGETS"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"task()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"TaskAndConfig(Task, String, String, String, String, String, String, String)","u":"%3Cinit%3E(org.hl7.fhir.r4.model.Task,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service.process","c":"Recipient","l":"toRecipientExtension()"},{"p":"dev.dsf.bpe.v2.service.process","c":"Requester","l":"toRequesterExtension()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender.TaskAndConfig","l":"toString()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"toString()"},{"p":"dev.dsf.bpe.v2.activity.values","c":"SendTaskValues","l":"toString()"},{"p":"dev.dsf.bpe.v2.service","c":"QuestionnaireResponseHelper","l":"transformQuestionTypeToAnswerType(Questionnaire.QuestionnaireItemComponent)","u":"transformQuestionTypeToAnswerType(org.hl7.fhir.r4.model.Questionnaire.QuestionnaireItemComponent)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"TTP"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"TTP_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"ttp()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"ttpUser()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole.Codes","l":"UAC"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole.Codes","l":"UAC_USER"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"uac()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"uacUser()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"update(R)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"update(Resource)","u":"update(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"update(Resource)","u":"update(org.hl7.fhir.r4.model.Resource)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"updateBinary(String, InputStream, MediaType, String)","u":"updateBinary(java.lang.String,java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"updateBinary(String, InputStream, MediaType, String)","u":"updateBinary(java.lang.String,java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"updateBinary(String, InputStream, MediaType, String)","u":"updateBinary(java.lang.String,java.io.InputStream,jakarta.ws.rs.core.MediaType,java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnResource","l":"updateConditionaly(R, Map>)","u":"updateConditionaly(R,java.util.Map)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnMinimal","l":"updateConditionaly(Resource, Map>)","u":"updateConditionaly(org.hl7.fhir.r4.model.Resource,java.util.Map)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"PreferReturnOutcome","l":"updateConditionaly(Resource, Map>)","u":"updateConditionaly(org.hl7.fhir.r4.model.Resource,java.util.Map)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"updateFailedIfInprogress(ProcessPluginApi, Variables, String, List)","u":"updateFailedIfInprogress(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,java.lang.String,java.util.List)"},{"p":"dev.dsf.bpe.v2.variables","c":"Variables","l":"updateTask(Task)","u":"updateTask(org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.error.impl","c":"AbstractErrorHandler","l":"updateTaskAndHandleException(ProcessPluginApi, Variables, Task)","u":"updateTaskAndHandleException(dev.dsf.bpe.v2.ProcessPluginApi,dev.dsf.bpe.v2.variables.Variables,org.hl7.fhir.r4.model.Task)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask.Codes","l":"USER_TASK_ID"},{"p":"dev.dsf.bpe.v2.activity.values","c":"CreateQuestionnaireResponseValues","l":"userTaskId()"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"userTaskId()"},{"p":"dev.dsf.bpe.v2.service","c":"MimetypeService","l":"validate(byte[], String)","u":"validate(byte[],java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"MimetypeService","l":"validate(InputStream, String)","u":"validate(java.io.InputStream,java.lang.String)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"validateClientCertificate(KeyStore, Collection)","u":"validateClientCertificate(java.security.KeyStore,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"validateClientCertificate(KeyStore, X509Certificate...)","u":"validateClientCertificate(java.security.KeyStore,java.security.cert.X509Certificate...)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"validateServerCertificate(KeyStore, Collection)","u":"validateServerCertificate(java.security.KeyStore,java.util.Collection)"},{"p":"dev.dsf.bpe.v2.service","c":"CryptoService","l":"validateServerCertificate(KeyStore, X509Certificate...)","u":"validateServerCertificate(java.security.KeyStore,java.security.cert.X509Certificate...)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategies","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"dev.dsf.bpe.v2.activity.task","c":"BusinessKeyStrategies","l":"values()"},{"p":"dev.dsf.bpe.v2.activity.task","c":"DefaultTaskSender","l":"variables"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnMessage","l":"withCode(String)","u":"withCode(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.BpmnUserTask","l":"withCode(String)","u":"withCode(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.OrganizationRole","l":"withCode(String)","u":"withCode(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.PractitionerRole","l":"withCode(String)","u":"withCode(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"CodeSystems.ProcessAuthorization","l":"withCode(String)","u":"withCode(java.lang.String)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"DsfClient","l":"withMinimalReturn()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"DsfClient","l":"withOperationOutcomeReturn()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"withRetry()"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"withRetry(Duration)","u":"withRetry(java.time.Duration)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"withRetry(int)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"withRetry(int, Duration)","u":"withRetry(int,java.time.Duration)"},{"p":"dev.dsf.bpe.v2.client.dsf","c":"RetryClient","l":"withRetryForever(Duration)","u":"withRetryForever(java.time.Duration)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.EndpointIdentifier","l":"withValue(String)","u":"withValue(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.OrganizationIdentifier","l":"withValue(String)","u":"withValue(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.PractitionerIdentifier","l":"withValue(String)","u":"withValue(java.lang.String)"},{"p":"dev.dsf.bpe.v2.constants","c":"NamingSystems.TaskIdentifier","l":"withValue(String)","u":"withValue(java.lang.String)"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/module-search-index.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/module-search-index.js new file mode 100644 index 000000000..0d59754fc --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-summary.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-summary.html new file mode 100644 index 000000000..56ed0f6ea --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-summary.html @@ -0,0 +1,26 @@ + + + + +dsf-bpe-process-api-v2 2.0.0-M2 API + + + + + + + + + + + +
+ +

index.html

+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-tree.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-tree.html new file mode 100644 index 000000000..92bd0563f --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/overview-tree.html @@ -0,0 +1,300 @@ + + + + +Class Hierarchy (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Annotation Interface Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/package-search-index.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/package-search-index.js new file mode 100644 index 000000000..ec5426118 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"dev.dsf.bpe.v2"},{"l":"dev.dsf.bpe.v2.activity"},{"l":"dev.dsf.bpe.v2.activity.task"},{"l":"dev.dsf.bpe.v2.activity.values"},{"l":"dev.dsf.bpe.v2.client.dsf"},{"l":"dev.dsf.bpe.v2.client.fhir"},{"l":"dev.dsf.bpe.v2.client.oidc"},{"l":"dev.dsf.bpe.v2.config"},{"l":"dev.dsf.bpe.v2.constants"},{"l":"dev.dsf.bpe.v2.documentation"},{"l":"dev.dsf.bpe.v2.error"},{"l":"dev.dsf.bpe.v2.error.impl"},{"l":"dev.dsf.bpe.v2.fhir"},{"l":"dev.dsf.bpe.v2.service"},{"l":"dev.dsf.bpe.v2.service.process"},{"l":"dev.dsf.bpe.v2.spring"},{"l":"dev.dsf.bpe.v2.variables"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/resources/glass.png b/docs/src/.vuepress/public/assets/javadoc/api-v2/resources/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f591f467a1c0c949bbc510156a0c1afb860a6e GIT binary patch literal 499 zcmVJoRsvExf%rEN>jUL}qZ_~k#FbE+Q;{`;0FZwVNX2n-^JoI; zP;4#$8DIy*Yk-P>VN(DUKmPse7mx+ExD4O|;?E5D0Z5($mjO3`*anwQU^s{ZDK#Lz zj>~{qyaIx5K!t%=G&2IJNzg!ChRpyLkO7}Ry!QaotAHAMpbB3AF(}|_f!G-oI|uK6 z`id_dumai5K%C3Y$;tKS_iqMPHg<*|-@e`liWLAggVM!zAP#@l;=c>S03;{#04Z~5 zN_+ss=Yg6*hTr59mzMwZ@+l~q!+?ft!fF66AXT#wWavHt30bZWFCK%!BNk}LN?0Hg z1VF_nfs`Lm^DjYZ1(1uD0u4CSIr)XAaqW6IT{!St5~1{i=i}zAy76p%_|w8rh@@c0Axr!ns=D-X+|*sY6!@wacG9%)Qn*O zl0sa739kT-&_?#oVxXF6tOnqTD)cZ}2vi$`ZU8RLAlo8=_z#*P3xI~i!lEh+Pdu-L zx{d*wgjtXbnGX_Yf@Tc7Q3YhLhPvc8noGJs2DA~1DySiA&6V{5JzFt ojAY1KXm~va;tU{v7C?Xj0BHw!K;2aXV*mgE07*qoM6N<$f;4TDA^-pY literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-3.7.1.min.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-3.7.1.min.js new file mode 100644 index 000000000..7f37b5d99 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/script-dir/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(E(s),E(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})},x.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,l=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(x.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],x.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("
    ").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){x(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(x("
    ").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==x.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=x("
    ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||x.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?x(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(x.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=x.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(x("
    ").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}});x.ui.autocomplete}); \ No newline at end of file diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/script.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/script.js new file mode 100644 index 000000000..bb9c8a241 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/script.js @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; + +var oddRowColor = "odd-row-color"; +var evenRowColor = "even-row-color"; +var sortAsc = "sort-asc"; +var sortDesc = "sort-desc"; +var tableTab = "table-tab"; +var activeTableTab = "active-table-tab"; + +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +// Helper for making content containing release names comparable lexicographically +function makeComparable(s) { + return s.toLowerCase().replace(/(\d+)/g, + function(n, m) { + return ("000" + m).slice(-4); + }); +} + +// Switches between two styles depending on a condition +function toggleStyle(classList, condition, trueStyle, falseStyle) { + if (condition) { + classList.remove(falseStyle); + classList.add(trueStyle); + } else { + classList.remove(trueStyle); + classList.add(falseStyle); + } +} + +// Sorts the rows in a table lexicographically by the content of a specific column +function sortTable(header, columnIndex, columns) { + var container = header.parentElement; + var descending = header.classList.contains(sortAsc); + container.querySelectorAll("div.table-header").forEach( + function(header) { + header.classList.remove(sortAsc); + header.classList.remove(sortDesc); + } + ) + var cells = container.children; + var rows = []; + for (var i = columns; i < cells.length; i += columns) { + rows.push(Array.prototype.slice.call(cells, i, i + columns)); + } + var comparator = function(a, b) { + var ka = makeComparable(a[columnIndex].textContent); + var kb = makeComparable(b[columnIndex].textContent); + if (ka < kb) + return descending ? 1 : -1; + if (ka > kb) + return descending ? -1 : 1; + return 0; + }; + var sorted = rows.sort(comparator); + var visible = 0; + sorted.forEach(function(row) { + if (row[0].style.display !== 'none') { + var isEvenRow = visible++ % 2 === 0; + } + row.forEach(function(cell) { + toggleStyle(cell.classList, isEvenRow, evenRowColor, oddRowColor); + container.appendChild(cell); + }) + }); + toggleStyle(header.classList, descending, sortDesc, sortAsc); +} + +// Toggles the visibility of a table category in all tables in a page +function toggleGlobal(checkbox, selected, columns) { + var display = checkbox.checked ? '' : 'none'; + document.querySelectorAll("div.table-tabs").forEach(function(t) { + var id = t.parentElement.getAttribute("id"); + var selectedClass = id + "-tab" + selected; + // if selected is empty string it selects all uncategorized entries + var selectUncategorized = !Boolean(selected); + var visible = 0; + document.querySelectorAll('div.' + id) + .forEach(function(elem) { + if (selectUncategorized) { + if (elem.className.indexOf(selectedClass) === -1) { + elem.style.display = display; + } + } else if (elem.classList.contains(selectedClass)) { + elem.style.display = display; + } + if (elem.style.display === '') { + var isEvenRow = visible++ % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + } + }); + var displaySection = visible === 0 ? 'none' : ''; + t.parentElement.style.display = displaySection; + document.querySelector("li#contents-" + id).style.display = displaySection; + }) +} + +// Shows the elements of a table belonging to a specific category +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.getElementById(tableId + '.tabpanel') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} +// Copy the contents of the local snippet to the clipboard +function copySnippet(button) { + copyToClipboard(button.nextElementSibling.innerText); + switchCopyLabel(button, button.firstElementChild); +} +function copyToClipboard(content) { + var textarea = document.createElement("textarea"); + textarea.style.height = 0; + document.body.appendChild(textarea); + textarea.value = content; + textarea.select(); + document.execCommand("copy"); + document.body.removeChild(textarea); +} +function switchCopyLabel(button, span) { + var copied = span.getAttribute("data-copied"); + button.classList.add("visible"); + var initialLabel = span.innerHTML; + span.innerHTML = copied; + setTimeout(function() { + button.classList.remove("visible"); + setTimeout(function() { + if (initialLabel !== copied) { + span.innerHTML = initialLabel; + } + }, 100); + }, 1900); +} +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + var timeoutId; + contentDiv.addEventListener("scroll", function(e) { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + }, 100); + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/search-page.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/search-page.js new file mode 100644 index 000000000..540c90f57 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/search-page.js @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +"use strict"; +$(function() { + var copy = $("#page-search-copy"); + var expand = $("#page-search-expand"); + var searchLink = $("span#page-search-link"); + var redirect = $("input#search-redirect"); + function setSearchUrlTemplate() { + var href = document.location.href.split(/[#?]/)[0]; + href += "?q=" + "%s"; + if (redirect.is(":checked")) { + href += "&r=1"; + } + searchLink.html(href); + copy[0].onmouseenter(); + } + function copyLink(e) { + copyToClipboard(this.previousSibling.innerText); + switchCopyLabel(this, this.lastElementChild); + } + copy.click(copyLink); + copy[0].onmouseenter = function() {}; + redirect.click(setSearchUrlTemplate); + setSearchUrlTemplate(); + copy.prop("disabled", false); + redirect.prop("disabled", false); + expand.click(function (e) { + var searchInfo = $("div.page-search-info"); + if(this.parentElement.hasAttribute("open")) { + searchInfo.attr("style", "border-width: 0;"); + } else { + searchInfo.attr("style", "border-width: 1px;").height(searchInfo.prop("scrollHeight")); + } + }); +}); +$(window).on("load", function() { + var input = $("#page-search-input"); + var reset = $("#page-search-reset"); + var notify = $("#page-search-notify"); + var resultSection = $("div#result-section"); + var resultContainer = $("div#result-container"); + var searchTerm = ""; + var activeTab = ""; + var fixedTab = false; + var visibleTabs = []; + var feelingLucky = false; + function renderResults(result) { + if (!result.length) { + notify.html(messages.noResult); + } else if (result.length === 1) { + notify.html(messages.oneResult); + } else { + notify.html(messages.manyResults.replace("{0}", result.length)); + } + resultContainer.empty(); + var r = { + "types": [], + "members": [], + "packages": [], + "modules": [], + "searchTags": [] + }; + for (var i in result) { + var item = result[i]; + var arr = r[item.category]; + arr.push(item); + } + if (!activeTab || r[activeTab].length === 0 || !fixedTab) { + Object.keys(r).reduce(function(prev, curr) { + if (r[curr].length > 0 && r[curr][0].score > prev) { + activeTab = curr; + return r[curr][0].score; + } + return prev; + }, 0); + } + if (feelingLucky && activeTab) { + notify.html(messages.redirecting) + var firstItem = r[activeTab][0]; + window.location = getURL(firstItem.indexItem, firstItem.category); + return; + } + if (result.length > 20) { + if (searchTerm[searchTerm.length - 1] === ".") { + if (activeTab === "types" && r["members"].length > r["types"].length) { + activeTab = "members"; + } else if (activeTab === "packages" && r["types"].length > r["packages"].length) { + activeTab = "types"; + } + } + } + var categoryCount = Object.keys(r).reduce(function(prev, curr) { + return prev + (r[curr].length > 0 ? 1 : 0); + }, 0); + visibleTabs = []; + var tabContainer = $("
    ").appendTo(resultContainer); + for (var key in r) { + var id = "#result-tab-" + key.replace("searchTags", "search_tags"); + if (r[key].length) { + var count = r[key].length >= 1000 ? "999+" : r[key].length; + if (result.length > 20 && categoryCount > 1) { + var button = $("").appendTo(tabContainer); + button.click(key, function(e) { + fixedTab = true; + renderResult(e.data, $(this)); + }); + visibleTabs.push(key); + } else { + $("" + categories[key] + + " (" + count + ")").appendTo(tabContainer); + renderTable(key, r[key]).appendTo(resultContainer); + tabContainer = $("
    ").appendTo(resultContainer); + + } + } + } + if (activeTab && result.length > 20 && categoryCount > 1) { + $("button#result-tab-" + activeTab).addClass("active-table-tab"); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + } + resultSection.show(); + function renderResult(category, button) { + activeTab = category; + setSearchUrl(); + resultContainer.find("div.summary-table").remove(); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + button.siblings().removeClass("active-table-tab"); + button.addClass("active-table-tab"); + } + } + function selectTab(category) { + $("button#result-tab-" + category).click(); + } + function renderTable(category, items) { + var table = $("
    ") + .addClass(category === "modules" + ? "one-column-search-results" + : "two-column-search-results"); + var col1, col2; + if (category === "modules") { + col1 = "Module"; + } else if (category === "packages") { + col1 = "Module"; + col2 = "Package"; + } else if (category === "types") { + col1 = "Package"; + col2 = "Class" + } else if (category === "members") { + col1 = "Class"; + col2 = "Member"; + } else if (category === "searchTags") { + col1 = "Location"; + col2 = "Name"; + } + $("
    " + col1 + "
    ").appendTo(table); + if (category !== "modules") { + $("
    " + col2 + "
    ").appendTo(table); + } + $.each(items, function(index, item) { + var rowColor = index % 2 ? "odd-row-color" : "even-row-color"; + renderItem(item, table, rowColor); + }); + return table; + } + function renderItem(item, table, rowColor) { + var label = getHighlightedText(item.input, item.boundaries, item.prefix.length, item.input.length); + var link = $("") + .attr("href", getURL(item.indexItem, item.category)) + .attr("tabindex", "0") + .addClass("search-result-link") + .html(label); + var container = getHighlightedText(item.input, item.boundaries, 0, item.prefix.length - 1); + if (item.category === "searchTags") { + container = item.indexItem.h || ""; + } + if (item.category !== "modules") { + $("
    ").html(container).addClass("col-plain").addClass(rowColor).appendTo(table); + } + $("
    ").html(link).addClass("col-last").addClass(rowColor).appendTo(table); + } + var timeout; + function schedulePageSearch() { + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(function () { + doPageSearch() + }, 100); + } + function doPageSearch() { + setSearchUrl(); + var term = searchTerm = input.val().trim(); + if (term === "") { + notify.html(messages.enterTerm); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + resultSection.hide(); + } else { + notify.html(messages.searching); + doSearch({ term: term, maxResults: 1200 }, renderResults); + } + } + function setSearchUrl() { + var query = input.val().trim(); + var url = document.location.pathname; + if (query) { + url += "?q=" + encodeURI(query); + if (activeTab && fixedTab) { + url += "&c=" + activeTab; + } + } + history.replaceState({query: query}, "", url); + } + input.on("input", function(e) { + feelingLucky = false; + schedulePageSearch(); + }); + $(document).keydown(function(e) { + if ((e.ctrlKey || e.metaKey) && (e.key === "ArrowLeft" || e.key === "ArrowRight")) { + if (activeTab && visibleTabs.length > 1) { + var idx = visibleTabs.indexOf(activeTab); + idx += e.key === "ArrowLeft" ? visibleTabs.length - 1 : 1; + selectTab(visibleTabs[idx % visibleTabs.length]); + return false; + } + } + }); + reset.click(function() { + notify.html(messages.enterTerm); + resultSection.hide(); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + input.val('').focus(); + setSearchUrl(); + }); + input.prop("disabled", false); + reset.prop("disabled", false); + + var urlParams = new URLSearchParams(window.location.search); + if (urlParams.has("q")) { + input.val(urlParams.get("q")) + } + if (urlParams.has("c")) { + activeTab = urlParams.get("c"); + fixedTab = true; + } + if (urlParams.get("r")) { + feelingLucky = true; + } + if (input.val()) { + doPageSearch(); + } else { + notify.html(messages.enterTerm); + } + input.select().focus(); +}); diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/search.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/search.html new file mode 100644 index 000000000..5b18c0e95 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/search.html @@ -0,0 +1,77 @@ + + + + +Search (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
    + +
    +
    +

    Search

    +
    + + +
    +Additional resources +
    +
    +
    +

    The help page provides an introduction to the scope and syntax of JavaDoc search.

    +

    You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.

    +

    The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.

    +link +

    + +

    +
    +

    Loading search index...

    + +
    +
    +
    + +
    +
    +
    + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/search.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/search.js new file mode 100644 index 000000000..d3986705e --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/search.js @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +"use strict"; +const messages = { + enterTerm: "Enter a search term", + noResult: "No results found", + oneResult: "Found one result", + manyResults: "Found {0} results", + loading: "Loading search index...", + searching: "Searching...", + redirecting: "Redirecting to first result...", + linkIcon: "Link icon", + linkToSection: "Link to this section" +} +const categories = { + modules: "Modules", + packages: "Packages", + types: "Classes and Interfaces", + members: "Members", + searchTags: "Search Tags" +}; +const highlight = "$&"; +const NO_MATCH = {}; +const MAX_RESULTS = 300; +function checkUnnamed(name, separator) { + return name === "" || !name ? "" : name + separator; +} +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(str, boundaries, from, to) { + var start = from; + var text = ""; + for (var i = 0; i < boundaries.length; i += 2) { + var b0 = boundaries[i]; + var b1 = boundaries[i + 1]; + if (b0 >= to || b1 <= from) { + continue; + } + text += escapeHtml(str.slice(start, Math.max(start, b0))); + text += ""; + text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1))); + text += ""; + start = Math.min(to, b1); + } + text += escapeHtml(str.slice(start, to)); + return text; +} +function getURLPrefix(item, category) { + var urlPrefix = ""; + var slash = "/"; + if (category === "modules") { + return item.l + slash; + } else if (category === "packages" && item.m) { + return item.m + slash; + } else if (category === "types" || category === "members") { + if (item.m) { + urlPrefix = item.m + slash; + } else { + $.each(packageSearchIndex, function(index, it) { + if (it.m && item.p === it.l) { + urlPrefix = it.m + slash; + } + }); + } + } + return urlPrefix; +} +function getURL(item, category) { + if (item.url) { + return item.url; + } + var url = getURLPrefix(item, category); + if (category === "modules") { + url += "module-summary.html"; + } else if (category === "packages") { + if (item.u) { + url = item.u; + } else { + url += item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (category === "types") { + if (item.u) { + url = item.u; + } else { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html"; + } + } else if (category === "members") { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#"; + if (item.u) { + url += item.u; + } else { + url += item.l; + } + } else if (category === "searchTags") { + url += item.u; + } + item.url = url; + return url; +} +function createMatcher(term, camelCase) { + if (camelCase && !isUpperCase(term)) { + return null; // no need for camel-case matcher for lower case query + } + var pattern = ""; + var upperCase = []; + term.trim().split(/\s+/).forEach(function(w, index, array) { + var tokens = w.split(/(?=[A-Z,.()<>?[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + // ',' and '?' are the only delimiters commonly followed by space in java signatures + pattern += "(" + $.ui.autocomplete.escapeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")"; + upperCase.push(false); + var isWordToken = /\w$/.test(s); + if (isWordToken) { + if (i === tokens.length - 1 && index < array.length - 1) { + // space in query string matches all delimiters + pattern += "(.*?)"; + upperCase.push(isUpperCase(s[0])); + } else { + if (!camelCase && isUpperCase(s) && s.length === 1) { + pattern += "()"; + } else { + pattern += "([a-z0-9$<>?[\\]]*?)"; + } + upperCase.push(isUpperCase(s[0])); + } + } else { + pattern += "()"; + upperCase.push(false); + } + } + }); + var re = new RegExp(pattern, "gi"); + re.upperCase = upperCase; + return re; +} +function findMatch(matcher, input, startOfName, endOfName) { + var from = startOfName; + matcher.lastIndex = from; + var match = matcher.exec(input); + // Expand search area until we get a valid result or reach the beginning of the string + while (!match || match.index + match[0].length < startOfName || endOfName < match.index) { + if (from === 0) { + return NO_MATCH; + } + from = input.lastIndexOf(".", from - 2) + 1; + matcher.lastIndex = from; + match = matcher.exec(input); + } + var boundaries = []; + var matchEnd = match.index + match[0].length; + var score = 5; + var start = match.index; + var prevEnd = -1; + for (var i = 1; i < match.length; i += 2) { + var isUpper = isUpperCase(input[start]); + var isMatcherUpper = matcher.upperCase[i]; + // capturing groups come in pairs, match and non-match + boundaries.push(start, start + match[i].length); + // make sure groups are anchored on a left word boundary + var prevChar = input[start - 1] || ""; + var nextChar = input[start + 1] || ""; + if (start !== 0 && !/[\W_]/.test(prevChar) && !/[\W_]/.test(input[start])) { + if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) { + score -= 0.1; + } else if (isMatcherUpper && start === prevEnd) { + score -= isUpper ? 0.1 : 1.0; + } else { + return NO_MATCH; + } + } + prevEnd = start + match[i].length; + start += match[i].length + match[i + 1].length; + + // lower score for parts of the name that are missing + if (match[i + 1] && prevEnd < endOfName) { + score -= rateNoise(match[i + 1]); + } + } + // lower score if a type name contains unmatched camel-case parts + if (input[matchEnd - 1] !== "." && endOfName > matchEnd) + score -= rateNoise(input.slice(matchEnd, endOfName)); + score -= rateNoise(input.slice(0, Math.max(startOfName, match.index))); + + if (score <= 0) { + return NO_MATCH; + } + return { + input: input, + score: score, + boundaries: boundaries + }; +} +function isUpperCase(s) { + return s !== s.toLowerCase(); +} +function isLowerCase(s) { + return s !== s.toUpperCase(); +} +function rateNoise(str) { + return (str.match(/([.(])/g) || []).length / 5 + + (str.match(/([A-Z]+)/g) || []).length / 10 + + str.length / 20; +} +function doSearch(request, response) { + var term = request.term.trim(); + var maxResults = request.maxResults || MAX_RESULTS; + if (term.length === 0) { + return this.close(); + } + var matcher = { + plainMatcher: createMatcher(term, false), + camelCaseMatcher: createMatcher(term, true) + } + var indexLoaded = indexFilesLoaded(); + + function getPrefix(item, category) { + switch (category) { + case "packages": + return checkUnnamed(item.m, "/"); + case "types": + return checkUnnamed(item.p, "."); + case "members": + return checkUnnamed(item.p, ".") + item.c + "."; + default: + return ""; + } + } + function useQualifiedName(category) { + switch (category) { + case "packages": + return /[\s/]/.test(term); + case "types": + case "members": + return /[\s.]/.test(term); + default: + return false; + } + } + function searchIndex(indexArray, category) { + var matches = []; + if (!indexArray) { + if (!indexLoaded) { + matches.push({ l: messages.loading, category: category }); + } + return matches; + } + $.each(indexArray, function (i, item) { + var prefix = getPrefix(item, category); + var simpleName = item.l; + var qualifiedName = prefix + simpleName; + var useQualified = useQualifiedName(category); + var input = useQualified ? qualifiedName : simpleName; + var startOfName = useQualified ? prefix.length : 0; + var endOfName = category === "members" && input.indexOf("(", startOfName) > -1 + ? input.indexOf("(", startOfName) : input.length; + var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName); + if (m === NO_MATCH && matcher.camelCaseMatcher) { + m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName); + } + if (m !== NO_MATCH) { + m.indexItem = item; + m.prefix = prefix; + m.category = category; + if (!useQualified) { + m.input = qualifiedName; + m.boundaries = m.boundaries.map(function(b) { + return b + prefix.length; + }); + } + matches.push(m); + } + return true; + }); + return matches.sort(function(e1, e2) { + return e2.score - e1.score; + }).slice(0, maxResults); + } + + var result = searchIndex(moduleSearchIndex, "modules") + .concat(searchIndex(packageSearchIndex, "packages")) + .concat(searchIndex(typeSearchIndex, "types")) + .concat(searchIndex(memberSearchIndex, "members")) + .concat(searchIndex(tagSearchIndex, "searchTags")); + + if (!indexLoaded) { + updateSearchResults = function() { + doSearch(request, response); + } + } else { + updateSearchResults = function() {}; + } + response(result); +} +// JQuery search menu implementation +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> .result-item"); + // workaround for search result scrolling + this.menu._scrollIntoView = function _scrollIntoView( item ) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; + if ( this._hasScroll() ) { + borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0; + paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0; + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; + scroll = this.activeMenu.scrollTop(); + elementHeight = this.activeMenu.height() - 26; + itemHeight = item.outerHeight(); + + if ( offset < 0 ) { + this.activeMenu.scrollTop( scroll + offset ); + } else if ( offset + itemHeight > elementHeight ) { + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); + } + } + }; + }, + _renderMenu: function(ul, items) { + var currentCategory = ""; + var widget = this; + widget.menu.bindings = $(); + $.each(items, function(index, item) { + if (item.category && item.category !== currentCategory) { + ul.append("
  • " + categories[item.category] + "
  • "); + currentCategory = item.category; + } + var li = widget._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", categories[item.category] + " : " + item.l); + } else { + li.attr("aria-label", item.l); + } + li.attr("class", "result-item"); + }); + ul.append(""); + }, + _renderItem: function(ul, item) { + var li = $("
  • ").appendTo(ul); + var div = $("
    ").appendTo(li); + var label = item.l + ? item.l + : getHighlightedText(item.input, item.boundaries, 0, item.input.length); + var idx = item.indexItem; + if (item.category === "searchTags" && idx && idx.h) { + if (idx.d) { + div.html(label + " (" + idx.h + ")
    " + + idx.d + "
    "); + } else { + div.html(label + " (" + idx.h + ")"); + } + } else { + div.html(label); + } + return li; + } +}); +$(function() { + var expanded = false; + var windowWidth; + function collapse() { + if (expanded) { + $("div#navbar-top").removeAttr("style"); + $("button#navbar-toggle-button") + .removeClass("expanded") + .attr("aria-expanded", "false"); + expanded = false; + } + } + $("button#navbar-toggle-button").click(function (e) { + if (expanded) { + collapse(); + } else { + var navbar = $("div#navbar-top"); + navbar.height(navbar.prop("scrollHeight")); + $("button#navbar-toggle-button") + .addClass("expanded") + .attr("aria-expanded", "true"); + expanded = true; + windowWidth = window.innerWidth; + } + }); + $("ul.sub-nav-list-small li a").click(collapse); + $("input#search-input").focus(collapse); + $("main").click(collapse); + $("section[id] > :header, :header[id], :header:has(a[id])").each(function(idx, el) { + // Create anchor links for headers with an associated id attribute + var hdr = $(el); + var id = hdr.attr("id") || hdr.parent("section").attr("id") || hdr.children("a").attr("id"); + if (id) { + hdr.append(" " + messages.linkIcon +""); + } + }); + $(window).on("orientationchange", collapse).on("resize", function(e) { + if (expanded && windowWidth !== window.innerWidth) collapse(); + }); + var search = $("#search-input"); + var reset = $("#reset-button"); + search.catcomplete({ + minLength: 1, + delay: 200, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push({ l: messages.noResult }); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.indexItem) { + var url = getURL(ui.item.indexItem, ui.item.category); + window.location.href = pathtoroot + url; + $("#search-input").focus(); + } + } + }); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + reset.click(function() { + search.val('').focus(); + }); + search.focus(); +}); diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/serialized-form.html b/docs/src/.vuepress/public/assets/javadoc/api-v2/serialized-form.html new file mode 100644 index 000000000..50327e545 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/serialized-form.html @@ -0,0 +1,115 @@ + + + + +Serialized Form (dsf-bpe-process-api-v2 2.0.0-M2 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Serialized Form

    +
    + +
    +
    +
    + +
    +
    +
    + + diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/stylesheet.css b/docs/src/.vuepress/public/assets/javadoc/api-v2/stylesheet.css new file mode 100644 index 000000000..09b131fcd --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/stylesheet.css @@ -0,0 +1,1272 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * These CSS custom properties (variables) define the core color and font + * properties used in this stylesheet. + */ +:root { + /* body, block and code fonts */ + --body-font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + --block-font-family: 'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + --code-font-family: 'DejaVu Sans Mono', monospace; + /* Base font sizes for body and code elements */ + --body-font-size: 14px; + --code-font-size: 14px; + /* Text colors for body and block elements */ + --body-text-color: #353833; + --block-text-color: #474747; + /* Background colors for various structural elements */ + --body-background-color: #ffffff; + --section-background-color: #f8f8f8; + --detail-background-color: #ffffff; + /* Colors for navigation bar and table captions */ + --navbar-background-color: #326F95; + --navbar-text-color: #ffffff; + /* Background color for subnavigation and various headers */ + --subnav-background-color: #dee3e9; + /* Background and text colors for selected tabs and navigation items */ + --selected-background-color: #63C7A6; + --selected-text-color: #253441; + --selected-link-color: #1f389c; + /* Background colors for generated tables */ + --even-row-color: #ffffff; + --odd-row-color: #eeeeef; + /* Text color for page title */ + --title-color: #2c4557; + /* Text colors for links */ + --link-color: #4A6782; + --link-color-active: #63C7A6; + /* Snippet colors */ + --snippet-background-color: #ebecee; + --snippet-text-color: var(--block-text-color); + --snippet-highlight-color: #f7c590; + /* Border colors for structural elements and user defined tables */ + --border-color: #ededed; + --table-border-color: #000000; + /* Search input colors */ + --search-input-background-color: #ffffff; + --search-input-text-color: #000000; + --search-input-placeholder-color: #909090; + /* Highlight color for active search tag target */ + --search-tag-highlight-color: #ffff00; + /* Adjustments for icon and active background colors of copy-to-clipboard buttons */ + --copy-icon-brightness: 100%; + --copy-button-background-color-active: rgba(168, 168, 176, 0.3); + /* Colors for invalid tag notifications */ + --invalid-tag-background-color: #ffe6e6; + --invalid-tag-text-color: #000000; +} +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ +body { + background-color:var(--body-background-color); + color:var(--body-text-color); + font-family:var(--body-font-family); + font-size:var(--body-font-size); + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:var(--link-color); +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:var(--link-color-active); +} +pre { + font-family:var(--code-font-family); + font-size:1em; +} +h1 { + font-size:1.428em; +} +h2 { + font-size:1.285em; +} +h3 { + font-size:1.14em; +} +h4 { + font-size:1.072em; +} +h5 { + font-size:1.001em; +} +h6 { + font-size:0.93em; +} +/* Disable font boosting for selected elements */ +h1, h2, h3, h4, h5, h6, div.member-signature { + max-height: 1000em; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:var(--code-font-family); +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:var(--code-font-size); + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:var(--code-font-family); + font-size:1em; + padding-top:4px; +} +.summary-table dt code { + font-family:var(--code-font-family); + font-size:1em; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: var(--body-font-family); + font-size: 1em; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:0.915em; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +/* + * Styles for navigation bar. + */ +@media screen { + div.flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + header.flex-header { + flex: 0 0 auto; + } + div.flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + float:left; + width:100%; + clear:right; + min-height:2.8em; + padding:10px 0 0 0; + overflow:hidden; + font-size:0.857em; +} +button#navbar-toggle-button { + display:none; +} +ul.sub-nav-list-small { + display: none; +} +.sub-nav { + background-color:var(--subnav-background-color); + float:left; + width:100%; + overflow:hidden; + font-size:0.857em; +} +.sub-nav div { + clear:left; + float:left; + padding:6px; + text-transform:uppercase; +} +.sub-nav .sub-nav-list { + padding-top:4px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0; + padding:6px; + clear:none; + text-align:right; + position:relative; +} +ul.sub-nav-list li { + list-style:none; + float:left; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:var(--navbar-text-color); + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + color:var(--link-color-active); +} +.nav-bar-cell1-rev { + background-color:var(--selected-background-color); + color:var(--selected-text-color); + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header. + */ +.title { + color:var(--title-color); + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +ul.contents-list { + margin: 0 0 15px 0; + padding: 0; + list-style: none; +} +ul.contents-list li { + font-size:0.93em; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:var(--subnav-background-color); + border:1px solid var(--border-color); + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: var(--body-font-family); + font-size:0.856em; + font-weight:bold; + margin:10px 0 0 0; + color:var(--body-text-color); +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:1em; + font-family:var(--block-font-family) +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.ref-list { + padding:0; + margin:0; +} +ul.ref-list > li { + list-style:none; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.tag-list, ul.tag-list-long { + padding-left: 0; + list-style: none; +} +ul.tag-list li { + display: inline; +} +ul.tag-list li:not(:last-child):after, +ul.tag-list-long li:not(:last-child):after +{ + content: ", "; + white-space: pre-wrap; +} +ul.preview-feature-list { + list-style: none; + margin:0; + padding:0.1em; + line-height: 1.6em; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border:1px solid var(--border-color); + border-top:0; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:var(--selected-text-color); + clear:none; + overflow:hidden; + padding: 10px 0 0 1px; + margin:0; +} +.caption a:link, .caption a:visited { + color:var(--selected-link-color); +} +.caption a:hover, +.caption a:active { + color:var(--navbar-text-color); +} +.caption span { + font-weight:bold; + white-space:nowrap; + padding:5px 12px 7px 12px; + display:inline-block; + float:left; + background-color:var(--selected-background-color); + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:10px 0 0 0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 8px; +} +div.table-tabs > .active-table-tab { + background: var(--selected-background-color); + color: var(--selected-text-color); +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.two-column-search-results { + display: grid; + grid-template-columns: minmax(400px, max-content) minmax(400px, auto); +} +div.checkboxes { + line-height: 2em; +} +div.checkboxes > span { + margin-left: 10px; +} +div.checkboxes > label { + margin-left: 8px; + white-space: nowrap; +} +div.checkboxes > label > input { + margin: 0 2px; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(25%, max-content) minmax(25%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(20%, max-content) minmax(20%, auto); +} +.three-column-release-summary { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(10%, max-content) minmax(40%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +@media screen and (max-width: 800px) { + .two-column-search-results { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(40%, auto); + } + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-release-summary { + display: grid; + grid-template-columns: minmax(70%, max-content) minmax(30%, max-content) + } + .three-column-summary .col-last, + .three-column-release-summary .col-last{ + grid-column-end: span 2; + } +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; + overflow-x: auto; + scrollbar-width: thin; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:var(--subnav-background-color); + font-weight: bold; +} +/* Sortable table columns */ +.table-header[onclick] { + cursor: pointer; +} +.table-header[onclick]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + '); + background-size:100% 100%; + width:9px; + height:14px; + margin-left:4px; + margin-bottom:-3px; +} +.table-header[onclick].sort-asc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + +} +.table-header[onclick].sort-desc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +.col-first, .col-first { + font-size:0.93em; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:0.93em; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited { + font-weight:bold; +} +.even-row-color, .even-row-color .table-header { + background-color:var(--even-row-color); +} +.odd-row-color, .odd-row-color .table-header { + background-color:var(--odd-row-color); +} +/* + * Styles for contents. + */ +div.block { + font-size:var(--body-font-size); + font-family:var(--block-font-family); +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:var(--code-font-family); + font-size:1em; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + /* Color of line numbers in source pages can be set via custom property below */ + color:var(--source-linenumber-color, green); + padding:0 30px 0 0; +} +.block { + display:block; + margin:0 10px 5px 0; + color:var(--block-text-color); +} +.deprecated-label, .description-from-type-label, .implementation-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +details.invalid-tag, span.invalid-tag { + font-size:1em; + font-family:var(--block-font-family); + color: var(--invalid-tag-text-color); + background: var(--invalid-tag-background-color); + border: thin solid var(--table-border-color); + border-radius:2px; + padding: 2px 4px; + display:inline-block; +} +details summary { + cursor: pointer; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-state-active { + /* Overrides the color of selection used in jQuery UI */ + background: var(--selected-background-color); + border: 1px solid var(--selected-background-color); + color: var(--selected-text-color); +} +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:auto; + overflow-x:auto; + scrollbar-width: thin; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:1; + background-color: var(--body-background-color); +} +ul.ui-autocomplete li { + float:left; + clear:both; + min-width:100%; +} +ul.ui-autocomplete li.ui-static-link { + position:sticky; + bottom:0; + left:0; + background: var(--subnav-background-color); + padding: 5px 0; + font-family: var(--body-font-family); + font-size: 0.93em; + font-weight: bolder; + z-index: 2; +} +li.ui-static-link a, li.ui-static-link a:visited { + text-decoration:none; + color:var(--link-color); + float:right; + margin-right:20px; +} +.ui-autocomplete .result-item { + font-size: inherit; +} +.ui-autocomplete .result-highlight { + font-weight:bold; +} +#search-input, #page-search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + background-color: var(--search-input-background-color); + color: var(--search-input-text-color); + border-color: var(--border-color); + padding-left:20px; + width: 250px; + margin: 0; +} +#search-input { + margin-left: 4px; +} +#reset-button { + background-color: transparent; + background-image:url('resources/x.png'); + background-repeat:no-repeat; + background-size:contain; + border:0; + border-radius:0; + width:12px; + height:12px; + position:absolute; + right:12px; + top:10px; + font-size:0; +} +::placeholder { + color:var(--search-input-placeholder-color); + opacity: 1; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:var(--search-tag-highlight-color); +} +details.page-search-details { + display: inline-block; +} +div#result-container { + font-size: 1em; +} +div#result-container a.search-result-link { + padding: 0; + margin: 4px 0; + width: 100%; +} +#result-container .result-highlight { + font-weight:bolder; +} +.page-search-info { + background-color: var(--subnav-background-color); + border-radius: 3px; + border: 0 solid var(--border-color); + padding: 0 8px; + overflow: hidden; + height: 0; + transition: all 0.2s ease; +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.page-search-header { + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + display: inline-block; +} +button.page-search-header { + border: none; + cursor: pointer; +} +span#page-search-link { + text-decoration: underline; +} +.module-graph span, .sealed-graph span { + display:none; + position:absolute; +} +.module-graph:hover span, .sealed-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0 20px 5px 10px; + border: 1px solid var(--border-color); + background-color: var(--section-background-color); +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:var(--detail-background-color); + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +/* + * Styles for header/section anchor links + */ +a.anchor-link { + opacity: 0; + transition: opacity 0.1s; +} +:hover > a.anchor-link { + opacity: 80%; +} +a.anchor-link:hover, +a.anchor-link:focus-visible, +a.anchor-link.visible { + opacity: 100%; +} +a.anchor-link > img { + width: 0.9em; + height: 0.9em; +} +/* + * Styles for copy-to-clipboard buttons + */ +button.copy { + opacity: 70%; + border: none; + border-radius: 3px; + position: relative; + background:none; + transition: opacity 0.3s; + cursor: pointer; +} +:hover > button.copy { + opacity: 80%; +} +button.copy:hover, +button.copy:active, +button.copy:focus-visible, +button.copy.visible { + opacity: 100%; +} +button.copy img { + position: relative; + background: none; + filter: brightness(var(--copy-icon-brightness)); +} +button.copy:active { + background-color: var(--copy-button-background-color-active); +} +button.copy span { + color: var(--body-text-color); + position: relative; + top: -0.1em; + transition: all 0.1s; + font-size: 0.76rem; + line-height: 1.2em; + opacity: 0; +} +button.copy:hover span, +button.copy:focus-visible span, +button.copy.visible span { + opacity: 100%; +} +/* search page copy button */ +button#page-search-copy { + margin-left: 0.4em; + padding:0.3em; + top:0.13em; +} +button#page-search-copy img { + width: 1.2em; + height: 1.2em; + padding: 0.01em 0; + top: 0.15em; +} +button#page-search-copy span { + color: var(--body-text-color); + line-height: 1.2em; + padding: 0.2em; + top: -0.18em; +} +div.page-search-info:hover button#page-search-copy span { + opacity: 100%; +} +/* snippet copy button */ +button.snippet-copy { + position: absolute; + top: 6px; + right: 6px; + height: 1.7em; + padding: 2px; +} +button.snippet-copy img { + width: 18px; + height: 18px; + padding: 0.05em 0; +} +button.snippet-copy span { + line-height: 1.2em; + padding: 0.2em; + position: relative; + top: -0.5em; +} +div.snippet-container:hover button.snippet-copy span { + opacity: 100%; +} +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.striped > thead { + background-color: var(--subnav-background-color); +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped > tbody > tr:nth-child(even) { + background-color: var(--odd-row-color) +} +table.striped > tbody > tr:nth-child(odd) { + background-color: var(--even-row-color) +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid var(--table-border-color); + border-right: 1px solid var(--table-border-color); +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak style for small screens. + */ +@media screen and (max-width: 920px) { + header.flex-header { + max-height: 100vh; + overflow-y: auto; + } + div#navbar-top { + height: 2.8em; + transition: height 0.35s ease; + } + ul.nav-list { + display: block; + width: 40%; + float:left; + clear: left; + margin: 10px 0 0 0; + padding: 0; + } + ul.nav-list li { + float: none; + padding: 6px; + margin-left: 10px; + margin-top: 2px; + } + ul.sub-nav-list-small { + display:block; + height: 100%; + width: 50%; + float: right; + clear: right; + background-color: var(--subnav-background-color); + color: var(--body-text-color); + margin: 6px 0 0 0; + padding: 0; + } + ul.sub-nav-list-small ul { + padding-left: 20px; + } + ul.sub-nav-list-small a:link, ul.sub-nav-list-small a:visited { + color:var(--link-color); + } + ul.sub-nav-list-small a:hover { + color:var(--link-color-active); + } + ul.sub-nav-list-small li { + list-style:none; + float:none; + padding: 6px; + margin-top: 1px; + text-transform:uppercase; + } + ul.sub-nav-list-small > li { + margin-left: 10px; + } + ul.sub-nav-list-small li p { + margin: 5px 0; + } + div#navbar-sub-list { + display: none; + } + .top-nav a:link, .top-nav a:active, .top-nav a:visited { + display: block; + } + button#navbar-toggle-button { + width: 3.4em; + height: 2.8em; + background-color: transparent; + display: block; + float: left; + border: 0; + margin: 0 10px; + cursor: pointer; + font-size: 10px; + } + button#navbar-toggle-button .nav-bar-toggle-icon { + display: block; + width: 24px; + height: 3px; + margin: 1px 0 4px 0; + border-radius: 2px; + transition: all 0.1s; + background-color: var(--navbar-text-color); + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(1) { + transform: rotate(45deg); + transform-origin: 10% 10%; + width: 26px; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(2) { + opacity: 0; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(3) { + transform: rotate(-45deg); + transform-origin: 10% 90%; + width: 26px; + } +} +@media screen and (max-width: 800px) { + .about-language { + padding-right: 16px; + } + ul.nav-list li { + margin-left: 5px; + } + ul.sub-nav-list-small > li { + margin-left: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 400px) { + .about-language { + font-size: 10px; + padding-right: 12px; + } +} +@media screen and (max-width: 400px) { + .nav-list-search { + width: 94%; + } + #search-input, #page-search-input { + width: 70%; + } +} +@media screen and (max-width: 320px) { + .nav-list-search > label { + display: none; + } + .nav-list-search { + width: 90%; + } + #search-input, #page-search-input { + width: 80%; + } +} + +pre.snippet { + background-color: var(--snippet-background-color); + color: var(--snippet-text-color); + padding: 10px; + margin: 12px 0; + overflow: auto; + white-space: pre; +} +div.snippet-container { + position: relative; +} +@media screen and (max-width: 800px) { + pre.snippet { + padding-top: 26px; + } + button.snippet-copy { + top: 4px; + right: 4px; + } +} +pre.snippet .italic { + font-style: italic; +} +pre.snippet .bold { + font-weight: bold; +} +pre.snippet .highlighted { + background-color: var(--snippet-highlight-color); + border-radius: 10%; +} diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/tag-search-index.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/tag-search-index.js new file mode 100644 index 000000000..bf10aaf6d --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"},{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/src/.vuepress/public/assets/javadoc/api-v2/type-search-index.js b/docs/src/.vuepress/public/assets/javadoc/api-v2/type-search-index.js new file mode 100644 index 000000000..38e6175d8 --- /dev/null +++ b/docs/src/.vuepress/public/assets/javadoc/api-v2/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"p":"dev.dsf.bpe.v2.error.impl","l":"AbstractErrorHandler"},{"p":"dev.dsf.bpe.v2.fhir","l":"AbstractFhirResourceModifier"},{"p":"dev.dsf.bpe.v2.error.impl","l":"AbstractMessageActivityErrorHandler"},{"p":"dev.dsf.bpe.v2.activity","l":"Activity"},{"p":"dev.dsf.bpe.v2.spring","l":"ActivityPrototypeBeanCreator"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig.BasicAuthentication"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"BasicDsfClient"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig.BearerAuthentication"},{"p":"dev.dsf.bpe.v2.constants","l":"BpmnExecutionVariables"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.BpmnMessage"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.BpmnUserTask"},{"p":"dev.dsf.bpe.v2.activity.task","l":"BusinessKeyStrategies"},{"p":"dev.dsf.bpe.v2.activity.task","l":"BusinessKeyStrategy"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig.CertificateAuthentication"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfigs"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.BpmnMessage.Codes"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.BpmnUserTask.Codes"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.OrganizationRole.Codes"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.PractitionerRole.Codes"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.ProcessAuthorization.Codes"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems"},{"p":"dev.dsf.bpe.v2.client.oidc","l":"Configuration"},{"p":"dev.dsf.bpe.v2.activity.values","l":"CreateQuestionnaireResponseValues"},{"p":"dev.dsf.bpe.v2.service","l":"CryptoService"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultExecutionListenerErrorHandler"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultMessageEndEventErrorHandler"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultMessageIntermediateThrowEventErrorHandler"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultMessageSendTaskErrorHandler"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultServiceTaskErrorHandler"},{"p":"dev.dsf.bpe.v2.activity.task","l":"DefaultTaskSender"},{"p":"dev.dsf.bpe.v2.activity","l":"DefaultUserTaskListener"},{"p":"dev.dsf.bpe.v2.error.impl","l":"DefaultUserTaskListenerErrorHandler"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"DsfClient"},{"p":"dev.dsf.bpe.v2.service","l":"DsfClientProvider"},{"p":"dev.dsf.bpe.v2.constants","l":"NamingSystems.EndpointIdentifier"},{"p":"dev.dsf.bpe.v2.service","l":"EndpointProvider"},{"p":"dev.dsf.bpe.v2.error","l":"ErrorBoundaryEvent"},{"p":"dev.dsf.bpe.v2.error","l":"ErrorBoundaryEventErrorHandler"},{"p":"dev.dsf.bpe.v2.error","l":"ErrorHandler"},{"p":"dev.dsf.bpe.v2.error","l":"ExceptionErrorHandler"},{"p":"dev.dsf.bpe.v2.error.impl","l":"ExceptionToErrorBoundaryEventTranslationErrorHandler"},{"p":"dev.dsf.bpe.v2.activity","l":"ExecutionListener"},{"p":"dev.dsf.bpe.v2.error","l":"ExecutionListenerErrorHandler"},{"p":"dev.dsf.bpe.v2.service","l":"FhirClientProvider"},{"p":"dev.dsf.bpe.v2.fhir","l":"FhirResourceModifier"},{"p":"dev.dsf.bpe.v2.service.process","l":"Identity"},{"p":"dev.dsf.bpe.v2.client.oidc","l":"Jwks"},{"p":"dev.dsf.bpe.v2.client.oidc","l":"Jwks.JwksKey"},{"p":"dev.dsf.bpe.v2.service","l":"CryptoService.Kem"},{"p":"dev.dsf.bpe.v2.service","l":"MailService"},{"p":"dev.dsf.bpe.v2.activity","l":"MessageActivity"},{"p":"dev.dsf.bpe.v2.error","l":"MessageActivityErrorHandler"},{"p":"dev.dsf.bpe.v2.activity","l":"MessageEndEvent"},{"p":"dev.dsf.bpe.v2.error","l":"MessageEndEventErrorHandler"},{"p":"dev.dsf.bpe.v2.activity","l":"MessageIntermediateThrowEvent"},{"p":"dev.dsf.bpe.v2.error","l":"MessageIntermediateThrowEventErrorHandler"},{"p":"dev.dsf.bpe.v2.activity","l":"MessageSendTask"},{"p":"dev.dsf.bpe.v2.error","l":"MessageSendTaskErrorHandler"},{"p":"dev.dsf.bpe.v2.service","l":"MimetypeService"},{"p":"dev.dsf.bpe.v2.constants","l":"NamingSystems"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig.OidcAuthentication"},{"p":"dev.dsf.bpe.v2.client.oidc","l":"OidcClient"},{"p":"dev.dsf.bpe.v2.client.oidc","l":"OidcClientException"},{"p":"dev.dsf.bpe.v2.service","l":"OidcClientProvider"},{"p":"dev.dsf.bpe.v2.constants","l":"NamingSystems.OrganizationIdentifier"},{"p":"dev.dsf.bpe.v2.service.process","l":"OrganizationIdentity"},{"p":"dev.dsf.bpe.v2.service","l":"OrganizationProvider"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.OrganizationRole"},{"p":"dev.dsf.bpe.v2.constants","l":"NamingSystems.PractitionerIdentifier"},{"p":"dev.dsf.bpe.v2.service.process","l":"PractitionerIdentity"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.PractitionerRole"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"PreferReturnMinimal"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"PreferReturnMinimalWithRetry"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"PreferReturnOutcome"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"PreferReturnOutcomeWithRetry"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"PreferReturnResource"},{"p":"dev.dsf.bpe.v2.constants","l":"CodeSystems.ProcessAuthorization"},{"p":"dev.dsf.bpe.v2.service.process","l":"ProcessAuthorizationHelper"},{"p":"dev.dsf.bpe.v2.documentation","l":"ProcessDocumentation"},{"p":"dev.dsf.bpe.v2","l":"ProcessPluginApi"},{"p":"dev.dsf.bpe.v2","l":"ProcessPluginDefinition"},{"p":"dev.dsf.bpe.v2","l":"ProcessPluginDeploymentListener"},{"p":"dev.dsf.bpe.v2.client.fhir","l":"ClientConfig.Proxy"},{"p":"dev.dsf.bpe.v2.config","l":"ProxyConfig"},{"p":"dev.dsf.bpe.v2.service","l":"QuestionnaireResponseHelper"},{"p":"dev.dsf.bpe.v2.service","l":"ReadAccessHelper"},{"p":"dev.dsf.bpe.v2.service.process","l":"Recipient"},{"p":"dev.dsf.bpe.v2.service.process","l":"ProcessAuthorizationHelper.RecipientFactory"},{"p":"dev.dsf.bpe.v2.service.process","l":"Requester"},{"p":"dev.dsf.bpe.v2.service.process","l":"ProcessAuthorizationHelper.RequesterFactory"},{"p":"dev.dsf.bpe.v2.client.dsf","l":"RetryClient"},{"p":"dev.dsf.bpe.v2.activity.values","l":"SendTaskValues"},{"p":"dev.dsf.bpe.v2.activity","l":"ServiceTask"},{"p":"dev.dsf.bpe.v2.error","l":"ServiceTaskErrorHandler"},{"p":"dev.dsf.bpe.v2.variables","l":"Target"},{"p":"dev.dsf.bpe.v2.variables","l":"Targets"},{"p":"dev.dsf.bpe.v2.activity.task","l":"DefaultTaskSender.TaskAndConfig"},{"p":"dev.dsf.bpe.v2.service","l":"TaskHelper"},{"p":"dev.dsf.bpe.v2.constants","l":"NamingSystems.TaskIdentifier"},{"p":"dev.dsf.bpe.v2.activity.task","l":"TaskSender"},{"p":"dev.dsf.bpe.v2.activity","l":"UserTaskListener"},{"p":"dev.dsf.bpe.v2.error","l":"UserTaskListenerErrorHandler"},{"p":"dev.dsf.bpe.v2.variables","l":"Variables"},{"p":"dev.dsf.bpe.v2.service.process","l":"WithAuthorization"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index abaecbd1d..0bba7d7be 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -52,13 +52,12 @@ export default hopeTheme({ ] } ] - - }/*, + }, { text: "DSF Development", icon: "info", link: "/dsf-development/", - }*/, + }, { text: "Community", icon: "creative", @@ -153,6 +152,15 @@ export default hopeTheme({ children: [ "get-started","concept","implementation", "migration", "create", "best-practices","testing", "publishing/publish-on-dsfhub", "tooling/", "tutorials/",], }, ], + "/dsf-development": [ + { + text: "DSF 2", + icon: "", + prefix: "v2/", + link: "v2/", + children: [ "fhir-ig", "javadoc", "maven"], + }, + ], "/intro/use-cases/internal-mii-data-sharing.html": [] }, diff --git a/docs/src/dsf-development/README.md b/docs/src/dsf-development/README.md index 2357dd44e..2c8adc72a 100644 --- a/docs/src/dsf-development/README.md +++ b/docs/src/dsf-development/README.md @@ -2,4 +2,4 @@ title: DSF Development --- -No content yet. Please visit this page later. \ No newline at end of file + diff --git a/docs/src/dsf-development/v2/fhir-ig.md b/docs/src/dsf-development/v2/fhir-ig.md index e69de29bb..19adbb55c 100644 --- a/docs/src/dsf-development/v2/fhir-ig.md +++ b/docs/src/dsf-development/v2/fhir-ig.md @@ -0,0 +1,5 @@ +--- +title: FHIR Implementation Guide +icon: code +--- + diff --git a/docs/src/dsf-development/v2/javadoc.md b/docs/src/dsf-development/v2/javadoc.md new file mode 100644 index 000000000..69aa2a896 --- /dev/null +++ b/docs/src/dsf-development/v2/javadoc.md @@ -0,0 +1,13 @@ +--- +title: API JavaDoc +icon: code +--- + +